zoukankan      html  css  js  c++  java
  • Log4net的使用

    Log4net是一款非常好用、强大的开源日志记录组件,它来自于著名的Apache。起初是log4j专用于Java,后来又提供了log4net用于支持.NET。帮助.NET程序员也能够轻松的处理日志信息。

    log4net是一个“库”,用于帮助程序员输出日志到大量不同的输出目标(文件、控制台、不同的数据库、甚至内存等等)。可以在这里下载到它的最新版本。log4net

    好,下面进入正题,在C#当中如何利用好这个“著名”的日志组件呢?

    我们可以按照下面的步骤来创建一个控制台项目来利用log4net进行日志的记录:

    1、创建一个控制台项目,并添加log4net.dll引用

    log4net.dll,这个文件可以从下载的包中找到。在创建好的控制台项目中,直接添加引用这个文件就可以了。

    2、创建一个log4net.config文件,用于单独的进行log4net日志信息的配置

    配置文件是核心,它记录了日志的详细的配置情况。log4net继承了Java的优点,能够以灵活的配置方式,将日志信息输出到不同的数据源。

    下面展示了一个完整的log4net.config文件: 

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <!--添加log4net自定义节点-->
      <configSections>
        <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
      </configSections>
      <log4net>
    
        <!--文件形式-->
        <appender name="FileAppender" type="log4net.Appender.FileAppender">
          <!--文件路径-->
          <file value="log-file.txt"/>
          <!--是否追加-->
          <appendToFile value="true"/>
          <!--显示格式-->
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
          </layout>
        </appender>
    
        <!--SqlServer形式-->
        <appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
          <bufferSize value="100" />
          <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
          <connectionString value="data source=10.77.137.119;initial catalog=test;integrated security=false;persist security info=True;User ID=sa;Password=123456" />
          <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
          <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>
          <parameter>
            <parameterName value="@exception" />
            <dbType value="String" />
            <size value="2000" />
            <layout type="log4net.Layout.ExceptionLayout" />
          </parameter>
        </appender>
    
        <!--Access数据库-->
        <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
          <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:Documents and SettingsAdministrator桌面	est.mdb;User Id=;Password=;" />
          <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
          <parameter>
            <parameterName value="@log_date" />
            <dbType value="String" />
            <size value="255" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%date" />
            </layout>
          </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="1024" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%message" />
            </layout>
          </parameter>
        </appender>
    
        <!--Oracle形式-->
        <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=orcl;User ID=damis;Password=damis" />
          <!--数据库执行语句-->
          <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>
    
        <!--配置日志的目标存储形式-->
        <root>
          <!--文件形式-->
          <appender-ref ref="FileAppender"/>
    
          <!--SqlServer形式-->
          <appender-ref ref="AdoNetAppender_SqlServer"/>
    
          <!--Oracle形式-->
          <appender-ref ref="AdoNetAppender_Oracle"/>
    
          <!--Access形式-->
          <appender-ref ref="AdoNetAppender_Access"/>
        </root>
      </log4net>
    </configuration>
    View Code

     

    上面我直接引用了官方的配置示例。可以在这里找到:log4net配置示例。这里面有各种目标数据源的配置示例,非常全面。

    3、建立一个类Logger,用于进行日志的记录

    在建好的Logger类中,添加如下代码:

     

    //如果是winform或console等c/s程序,需要设置一下。
    //具体步骤:右键log4net.config文件-属性-复制到输出目录:始终复制。目的是为了每次启动时能够找到这个config文件
    [assembly: log4net.Config.XmlConfigurator(Watch = true, ConfigFile = "log4net.config")]
    namespace Log4net
    {
        /// <summary>
        /// 日志记录类
        /// </summary>
        public class Logger
        {
            #region 记录日志
            /// <summary>
            /// 记录日志
            /// </summary>
            /// <param name="legLevel">日志级别</param>
            /// <param name="msg">日志内容</param>
            public static void LoggerMsg(LogLevel legLevel, string msg)
            {
                log4net.ILog log = GetLogger();
                switch (legLevel)
                {
                    case LogLevel.Debug: log.Debug(msg); break;//Debug
                    case LogLevel.Error: log.Error(msg); break;//Error
                    case LogLevel.Fatal: log.Fatal(msg); break;//Fatal
                    case LogLevel.Info: log.Info(msg); break;//Info
                    case LogLevel.Warn: log.Warn(msg); break;//Warn
                    default: break;
                }
            }
            #endregion
    
            #region 获得一个日志记录对象
            /// <summary>
            /// 获得一个日志记录对象
            /// </summary>
            /// <returns>日志记录对象</returns>
            public static log4net.ILog GetLogger()
            {
                //MethodBase.GetCurrentMethod().DeclaringType 返回:命名空间名+类名
                return log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
            }
            #endregion
        }
    
        /// <summary>
        /// 日志记录级别
        /// </summary>
        public enum LogLevel
        {
            Debug,
            Info,
            Warn,
            Error,
            Fatal,
        }
    }

    这里强调的是,一定要在命名空间上面加上:[assembly: log4net.Config.XmlConfigurator(Watch = true, ConfigFile = "log4net.config")]。并且如果你的是c/s项目,比如控制台、winform等程序,则必须要右键log4net.config文件-属性-复制到输出目录:改为始终复制。这样程序加载时才能找到这个log4net.config,才能进行日志的记录。

    4、在控制台Main方法中进行测试

    好了,最后一步,就是对上述的配置进行测试了。我们在Main方法中加上如下测试代码。

    //主方法测试用  
    Logger.LoggerMsg(LogLevel.Info, "hello,log4net!");  
    

    运行这个控制台,程序正常执行。

    上面我演示了将日志记录输出到文件、Sql Server数据库、Oracle数据库、Access数据库等四种情况。如果有更多的其它数据源的输出,可以参考官方网站:http://logging.apache.org/log4net/release/config-examples.html 。

    最后看下执行的结果:

    txt:

    access 2007:

    sqlserver 2008:

    oracle 10g:

     

  • 相关阅读:
    yii框架入门学习笔记二 根据数据表创建model类
    mysql数据库操纵类升级版
    yii框架入门学习笔记三 完善登陆功能
    java发送http的get、post请求
    Please ensure that adb is correctly located at 'D:\androidsdkwindows\platf
    CodeIgniter框架入门教程——第一课 Hello World!
    C#正则表达式应用
    common lisp 笔记2 a cd ripper
    javascript的String函数
    修改linux下sudo设置
  • 原文地址:https://www.cnblogs.com/guwei4037/p/3504706.html
Copyright © 2011-2022 走看看