• 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开源代码:在官网可下载.

    谁知道这个怎么挂附件。

     

    感谢阅读!

  • 相关阅读:
    golang不想http自动处理重定向的解决方案
    学习WebDav
    keepass+坚果云管理我的密码
    定制右键功能,看这一篇就够了
    翻转二叉树
    加密sqlite3数据库文件
    算出cron表达式接下来几次执行时间
    关于斐波那契数列的3种解法
    golang通过cgo调用lua
    学习go语言并完成第一个作品
  • 原文地址:https://www.cnblogs.com/imyao/p/6043211.html
Copyright © 2020-2023  润新知