zoukankan      html  css  js  c++  java
  • Log4Net的概念和使用

     

    第一篇文本日志

    log4net简介:

    log4net简介:

    log4net是一个功能著名的开源日志记录组件,java平台而来。

    利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中。

    并且我们还可以记载控制要记载的日志级别,可以记载的日志类别包括:

    1FATAL(致命错误)、

    2ERROR(一般错误)、

    3WARN(警告)、

    4INFO(一般信息)、

    5DEBUG(调试信息)。

    要想获取最新版本的log4net组件库,可以到官方网站http://logging.apache.org/log4net/下载

     

    在程序中我们只需要log4net.dll文件就行了,添加对log4net.dll的引用,就可以在程序中使用了。

    接着我们配置相关的配置文件(WinForm对应的是*.exe.configWebForm对应的是*.config),本实例中是控制台应用程序,配置如下(附各配置的说明):

     

    在程序中,我们创建一个app.config的配置文件,那么系统会自动将其中的内容复制到了下图中的 *.exe.config .

     

    打开这个文件就能看到一致的内容.

     

    config文件中的配置

    要使用log4net,首先要在config文件的<configSections>节点中增加配置(如果没有这个节点请手动增加),如下:

    <configSections>  

        <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>  

    </configSections>  

     

    在顶级节点<configuration>下增加<log4net>子节点。在<log4net>节点下就可以增加<appender>子节点,每个<appender>子节点代表一种记录日志的方式(仅在这里配置了不代表启用了)。

    具体说来有如下Appender:

     

    AdoNetAppender:利用ADO.NET记录到数据库的日志

    AnsiColorTerminalAppender:在ANSI 窗口终端写下高亮度的日志事件。

    AspNetTraceAppender:能用asp.NetTrace的方式查看记录的日志。

    BufferingForwardingAppender:在输出到子Appenders之前先缓存日志事件。

    ConsoleAppender:将日志输出到控制台。

    EventLogAppender:将日志写到Windows Event Log. 

    FileAppender:将日志写到文件中。

    LocalSyslogAppender:将日志写到local syslog service (仅用于UNIX环境下). 

    MemoryAppender:将日志存到内存缓冲区。

    NetSendAppender:将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。

    RemoteSyslogAppender:通过UDP网络协议将日志写到Remote syslog service

    RemotingAppender:通过.NET Remoting将日志写到远程接收端。

    RollingFileAppender:将日志以回滚文件的形式写到文件中。

    SmtpAppender:将日志写到邮件中。

    TraceAppender:将日志写到.NET trace 系统。

    UdpAppender:将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。

     

    关于使用log4net中可能会使用到的一些参数

    %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息 

    %n(new line):换行 

    %d(datetime):输出当前语句运行的时刻 

    %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数 

    %t(thread id):当前语句所在的线程ID 

    %p(priority): 日志的当前优先级别,即DEBUGINFOWARN… 

    %c(class):当前日志对象的名称,例如:

    %f(file):输出语句所在的文件名。

    %l(line):输出语句所在的行号

    %数字:表示该项的最小长度,如果不够,则用空格填充,如“%-5level”表示level的最小宽度是5个字符,如果实际长度不够5个字符则以空格填充。

     

    比如在配置中有:

    “%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline”

    那么实际的日志中会是如下格式:

    记录时间:2010-11-17 16:16:36,561 线程ID:[9] 日志级别:文件:所在行ERROR 出错类:Log4NetDemo.Program property:[(null)] - 错误描述:error

    System.Exception: 在这里发生了一个异常,Error Number:2036084948”

     

    第二篇数据库日志

    对数据库的支持(将相应的日志信息写到具体的表中,字段对应)

    log4net是支持包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite在内的数据库的,如果是文件型数据库(如AccessSQLite)的话就需要指定数据库文件的位置(在Web中最好指定在有读写权限的文件夹下,并且实现创建好表),如果是网络数据库就需要指定正确的数据库连接字符串。

    比如要记录到Oracle数据库中,在配置文件中可以增加一个< appender>节点,配置如下:

     

    Oracle表配置的写法:

    1、我们将Log存到数据库中。

    <appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender">

      <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

      <connectionString value="data source=[mydatabase];User ID=[user];Password=[password]" />

      <commandText value="INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)" />

      <bufferSize value="128" />

      <parameter>

        <parameterName value=":log_date" />

        <dbType value="DateTime" />

        <layout type="log4net.Layout.RawTimeStampLayout" />

      </parameter>

      <parameter>

        <parameterName value=":thread" />

        <dbType value="String" />

        <size value="255" />

        <layout type="log4net.Layout.PatternLayout">

          <conversionPattern value="%thread" />

        </layout>

      </parameter>

      <parameter>

        <parameterName value=":log_level" />

        <dbType value="String" />

        <size value="50" />

        <layout type="log4net.Layout.PatternLayout">

          <conversionPattern value="%level" />

        </layout>

      </parameter>

      <parameter>

        <parameterName value=":logger" />

        <dbType value="String" />

        <size value="255" />

        <layout type="log4net.Layout.PatternLayout">

          <conversionPattern value="%logger" />

        </layout>

      </parameter>

      <parameter>

        <parameterName value=":message" />

        <dbType value="String" />

        <size value="4000" />

        <layout type="log4net.Layout.PatternLayout">

          <conversionPattern value="%message" />

        </layout>

      </parameter>

    </appender>

     

    参数中的写法和数据库有关,如其他数据库是 @参数,不同的数据库写法稍微不同.

    <appender name="AdoNetAppender_SQLite" type="log4net.Appender.AdoNetAppender">
    <bufferSize value="100" />
    <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.66.0, Culture=neutral" />
    <!--SQLite连接字符串-->
    <connectionString value="Data Source=c://log4net.db;Version=3;" />
    <commandText value="INSERT INTO Log (Date, Level, Logger,Source, Message) VALUES (@Date, @Level, @Logger, @Source, @Message)" />
    <parameter>
    <parameterName value="@Date" />
    <dbType value="DateTime" />
    <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
    <parameterName value="@Level" />
    <dbType value="String" />
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%level" />
    </layout>
    </parameter>
    <parameter>
    <parameterName value="@Logger" />
    <dbType value="String" />
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%logger" />
    </layout>
    </parameter>
    <parameter>
    <parameterName value="@Source" />
    <dbType value="String" />
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%file:%line" />
    </layout>
    </parameter>
    <parameter>
    <parameterName value="@Message" />
    <dbType value="String" />
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%message" />
    </layout>
    </parameter>
    </appender>

     

    2、数据库中表log的创建:

    create table log (

       Datetime timestamp(3),

       Thread varchar2(255),

       Log_Level varchar2(255),

       Logger varchar2(255),

       Message varchar2(4000)

       );

     

    控制日志文件大小的问题

    对于一个长时间使用并且有大量业务日志的系统来说,如果使用FileAppender将日志一直记录到一个文件中会引起性能低下的问题,日志文件太大,最后系统无法及时响应了.

     

    两种解决方法:

    1、限制每个文件最大容量

    2、分日期存储日志文件(好用)

     

    1、下面是将日志文件放到10个文件中,如果记录的日志超过10个,会从RollingFileAppender_log.txt.1开始覆盖。

    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">

      <file value="RollingFileAppender_log.txt" />

      <appendToFile value="true" />

      <rollingStyle value="Size" />

      <maxSizeRollBackups value="10" />

      <maximumFileSize value="100KB" />

      <staticLogFileName value="true" />

      <layout type="log4net.Layout.PatternLayout">

        <conversionPattern value="%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline" />

      </layout>

    </appender>

     

     

    2按照日期记录日志,它的配置如下:

    <appender name="RollingLogFileAppender_DateFormat" type="log4net.Appender.RollingFileAppender">

      <file value="RollingLogFileAppender_DateFormat_log.txt" />

      <appendToFile value="true" />

      <rollingStyle value="Date" />

      <!--<datePattern value="yyyyMMdd-HHmm" />-->

      <datePattern value="yyyyMMdd" />

      <layout type="log4net.Layout.PatternLayout">

        <conversionPattern value="%date [%thread](%file:%line) %-5level %logger [%property{NDC}] - %message%newline" />

      </layout>

    </appender>

     

     

    3、关闭相应的日志,只需注释相应部分:

    <root>

      <!--文件形式记录日志-->

      <appender-ref ref="LogFileAppender" />

      <!--控制台控制显示日志-->

      <appender-ref ref="ConsoleAppender" />

      <!--Windows事件日志-->

      <!--<appender-ref ref="EventLogAppender" />-->

      <!--SQLite事件日志-->

      <appender-ref ref="AdoNetAppender_SQLite" />

      <!--RollingFileAppender事件日志-->

      <appender-ref ref="RollingFileAppender" />

      <!--RollingFileAppender事件日志,每天一个日志-->

      <appender-ref ref="RollingLogFileAppender_DateFormat" />

      <!-- 如果不启用相应的日志记录,可以通过这种方式注释掉

      <appender-ref ref="AdoNetAppender_Access" />

      -->

     

    </root>

     

    第三篇实用篇

    将开源的Apache项目应用到我们实际的系统之中:

    1、配置文件详细(直接复制改变数据库配置便可以使用):

    <?xml version="1.0"?>

    <configuration>

      <configSections>

        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>

      </configSections>

      <log4net>

        <!--定义输出到文件中-->

     

        <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">

          <!--定义文件存放位置-->

          <file value="log\"/>

          <appendToFile value="true"/>

          <!--下面这句表示存储的是以日期-->

          <rollingStyle value="Date"/>

          <datePattern value="yyyy\yyyyMM\yyyyMMdd'.txt'"/>

          <staticLogFileName value="false"/>

          <param name="MaxSizeRollBackups" value="100"/>

          <layout type="log4net.Layout.PatternLayout">

            <!--每条日志末尾的文字说明-->

            <!--<footer value="Log4Net" />-->

            <!--输出格式

            样例:2016-03-26 13:42:32,111 [10] INFO  Log4NetDemo.MainClass [(null)] - info-->

            <!--<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />-->

            <conversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property: [%property{NDC}] - 错误描述:%message%newline"/>

          </layout>

        </appender>

     

        <!--OracleClinet Appender Usage-->

        <appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender">

          <!--<connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient"/>-->

          <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

          <connectionString value="data source=****;User ID=****;Password=****" />

          <commandText value="INSERT INTO LOG4NET (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)" />

          <bufferSize value="128" />

          <!--数据库日志的字段参数设定如下-->

          <parameter>

            <parameterName value=":log_date" />

            <dbType value="Date" />

            <layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />

          </parameter>

          <parameter>

            <parameterName value=":thread" />

            <dbType value="String" />

            <size value="255" />

            <layout type="log4net.Layout.PatternLayout" value="%thread" />

          </parameter>

          <parameter>

            <parameterName value=":log_level" />

            <dbType value="String" />

            <size value="50" />

            <layout type="log4net.Layout.PatternLayout" value="%level" />

     

          </parameter>

          <parameter>

            <parameterName value=":logger" />

            <dbType value="String" />

            <size value="255" />

            <layout type="log4net.Layout.PatternLayout" value="%logger" />

          </parameter>

          <parameter>

            <parameterName value=":message" />

            <dbType value="String" />

            <size value="4000" />

            <layout type="log4net.Layout.PatternLayout" value="%message" />

          </parameter>

        </appender>

     

        <root>

          <level value="ALL"/>

          <!--文件形式记录日志-->

          <!--<appender-ref ref="AdoNetAppender_Oracle"/>-->

          <!--文件形式记录日志-->

          <appender-ref ref="RollingLogFileAppender"/>

     

          <!--如果不启用其中的某一类别,那么注释就好了-->

          <!--控制台控制显示日志-->

          <!--<appender-ref ref="ConsoleAppender" />-->

          <!--Windows事件日志-->

          <!--<appender-ref ref="EventLogAppender" />-->

          <!--<appender-ref ref="AdoNetAppender_Access" />-->

     

        </root>

      </log4net>

    </configuration>

     

     

    扩展封装的接口,五种类别写日志的方法,如WriteDebugLog()

    [assembly: log4net.Config.XmlConfigurator(Watch = true)]

    namespace log4net.LogHelper

    {

        public class LogHelper : IDisposable

        {

            ///public static LogHelper LogProvider;

     

            public void Dispose()

            {

                ///GC.SuppressFinalize(LogProvider);

                GC.SuppressFinalize(this);

            }

     

            //Fatal

            public void WriteFatalLog(Type t, string msg)

            {

                ILog log = log4net.LogManager.GetLogger(t);

                log.Fatal(msg);

            }

     

            //Error

            public void WriteErrorLog(Type t, string msg)

            {

                ILog log = log4net.LogManager.GetLogger(t);

                log.Error(msg);

            }

     

            //Info

            public void WriteInfoLog(Type t, string msg)

            {

                ILog log = log4net.LogManager.GetLogger(t);

                log.Info(msg);

            }

     

            //Debug

            public void WriteDebugLog(Type t, string msg)

            {

                ILog log = log4net.LogManager.GetLogger(t);

                log.Debug(msg);

            }

     

            //Warn

            public void WriteWarnLog(Type t, string msg)

            {

                ILog log = log4net.LogManager.GetLogger(t);

                log.Warn(msg);

            }

        }

    }

    以上属于基础设施建设,实用操作步骤:

    1、配置文件导入系统运行,如此应用程序在所有的界面都能读取配置文件内容。

     2、在项目中添加对这两个dll的 引用。

    3、如下,按钮事件中触发写日志,模拟错误或异常操作。

    4、在应用程序运行路径下自动生产了按日期排列的文件,如下:

    这便是对日志的记录,的操作。

     

    附:

    对网上开源版本进行了封装适合自己使用的dll。按照上面步骤可直接用.

    Apache开源代码:在官网可下载.

    谁知道这个怎么挂附件。

     

    感谢阅读!

  • 相关阅读:
    JS LeetCode 1423. 可获得的最大点数简单题解
    SpringBoot 学集 (第六章) Docker
    Linux 学记 (第三章)
    Linux 学记 (第二章)
    Linux 学记 (第一章)
    SpringBoot 学集 (第五章) Web开发续
    SpringBoot 学集 (第四章)Web开发
    SpringBoot 学集 (第三章) 日志框架
    SpringBoot 学集 (第二章) 配置文件
    SpringBoot 学集 (第一章)
  • 原文地址:https://www.cnblogs.com/imyao/p/6043211.html
Copyright © 2011-2022 走看看