首页 > 代码库 > Log4net

Log4net

一、Log4net简介

  日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点:它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug;一旦在程序中加入了Log 输出代码,程序运行过程中就能生成并输出日志信息而无需人工干预。

  Log4net是一个非常不错的日志组件,使用方式也很简单,只需要通过配置就能够方便使用。

二、输出日志到文本文件

  输出日志到文本文件非常简单。

  1、配置文件的操作,增加一个配置节

  <configSections>
    <!--添加一个自定义log4net节点组-->
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
  </configSections>

  2、配置内容

  <log4net>
    <!--定义输出到文件中-->
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
      <!--定义文件存放位置-->
      <file value="http://www.mamicode.com/D:/123.txt" />
      <!--是否追加到文件-->
      <appendToFile value="http://www.mamicode.com/true" />
      <!--变换的形式为日期-->
      <rollingStyle value="http://www.mamicode.com/Date" />
      <!--日期的格式-->
      <datePattern value="http://www.mamicode.com/yyyyMMdd-HH:mm:ss" />
      <!--以日志文件大小变换文件名-->
      <rollingStyle value="http://www.mamicode.com/Size" />
      <!--最大变换数量,-1为不限制-->
      <maxSizeRollBackups value="http://www.mamicode.com/-1" />
      <!--最大文件大小(1G切换)-->
      <maximumFileSize value="http://www.mamicode.com/1GB" />
      <layout type="log4net.Layout.PatternLayout">
        <!--每条日志末尾的文字说明-->
        <footer value="http://www.mamicode.com/by Mr.Jun" />
        <!--输出格式-->
        <conversionPattern value="http://www.mamicode.com/记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" />
      </layout>
    </appender>
    <root>
      <!--文件形式记录日志(仅仅输出文件形式)-->
      <appender-ref ref="LogFileAppender" />
    </root>
  </log4net>

  3、命名空间顶部需要增加

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

  4、测试代码

    public ActionResult Index()
    {
        int i = 1 - 1;
        int j = 10;
        int k;
        try
        {
            k = j / i;
        }
        catch(Exception e)
        {
            //创建日志记录组件实例
            ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
            //记录错误日志
            log.Error("error", e);
        }
        return View();
    }

  4、输出内容

记录时间:2014-04-11 14:54:07,680 线程ID:[11] 日志级别:ERROR 出错类:MvcApplication5.Controllers.HomeController property:[(null)] - 错误描述:error
System.DivideByZeroException: 尝试除以零。
   在 MvcApplication5.Controllers.HomeController.Index() 位置 C:\Users\ChenZhuo\documents\visual studio 2010\Projects\MvcApplication5\MvcApplication5\Controllers\HomeController.cs:行号 25

三、日志输出到邮件

  此处要实现的功能是,当错误级别达到error,则保存日志并发送邮件,当级别低于error时,仅仅保存日志文件。

  增加配置节后,配置内容如下:

  <log4net>
    <!--根据logger获取ILog对象-->
    <logger name="logger">
      <!--control log level: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
      <!--如果没有定义LEVEL的值,则缺省为DEBUG-->
      <level value="http://www.mamicode.com/ALL" />
      <appender-ref ref="LogSmtpAppender" />
      <appender-ref ref="LogFileAppender" />
    </logger>
    <!--定义输出到文件中-->
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
      <!--定义文件存放位置-->
      <file value="http://www.mamicode.com/D:/123.txt" />
      <appendToFile value="http://www.mamicode.com/true" />
      <rollingStyle value="http://www.mamicode.com/Date" />
      <datePattern value="http://www.mamicode.com/yyyyMMdd-HH:mm:ss" />
      <layout type="log4net.Layout.PatternLayout">
        <!--输出格式-->
        <conversionPattern value="http://www.mamicode.com/记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" />
      </layout>
    </appender>
    <!--定义邮件发送-->
    <appender name="LogSmtpAppender" type="log4net.Appender.SmtpAppender">
      <authentication value="http://www.mamicode.com/Basic" />
      <to value="http://www.mamicode.com/xxx@qq.com" />
      <from value="http://www.mamicode.com/xxx@163.com" />
      <username value="http://www.mamicode.com/xxx@163.com" />
      <password value="http://www.mamicode.com/xxx" />
      <subject value="http://www.mamicode.com/XXX应用错误日志消息" />
      <smtpHost value="http://www.mamicode.com/smtp.163.com" />
      <bufferSize value="http://www.mamicode.com/2048" />
      <!--超长部分是否丢弃-->
      <lossy value="http://www.mamicode.com/true" />
      <!--日志级别 大于 WARN 的才发邮件-->
      <evaluator type="log4net.Core.LevelEvaluator">
        <threshold value="http://www.mamicode.com/ERROR"/>
      </evaluator>
      <!--定义邮件的格式-->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="http://www.mamicode.com/%property{log4net:HostName} :: %level :: %message %newlineLogger: %logger%newlineThread: %thread%newlineDate: %date%newlineNDC: %property{NDC}%newline%newline" />
      </layout>
    </appender>
  </log4net>

  命名空间顶部:

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

  测试代码:

    public ActionResult Index()
    {
        int i = 1 - 1;
        int j = 10;
        int k;
        try
        {
            k = j / i;
        }
        catch(Exception e)
        {
            //创建日志记录组件实例
            ILog log = log4net.LogManager.GetLogger("logger");
            //记录错误日志
            log.Error("error", e);
        }
        return View();
    }

  发送的邮件内容如下:

  技术分享

四、更多配置说明

  具体说来有如下Appender:

Appender 说明
AdoNetAppender 利用ADO.NET记录到数据库的日志
AnsiColorTerminalAppender 在ANSI 窗口终端写下高亮度的日志事件
AspNetTraceAppender 能用asp.net中Trace的方式查看记录的日志
BufferingForwardingAppender 在输出到子Appenders之前先缓存日志事件
ConsoleAppender 将日志输出到控制台
EventLogAppender 将日志写到Windows Event Log
FileAppender 将日志写到文件中
LocalSyslogAppender 将日志写到local syslog service
MemoryAppender 将日志存到内存缓冲区
NetSendAppender 将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示
RemoteSyslogAppender 通过UDP网络协议将日志写到Remote syslog service
RemotingAppender 通过.NET Remoting将日志写到远程接收端
RollingFileAppender 将日志以回滚文件的形式写到文件中
SmtpAppender 将日志写到邮件中
TraceAppender 将日志写到.NET trace 系统
UdpAppender 将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播

  参数说明

参数 说明
%m(message) :输出的日志消息,如ILog.Debug(…)输出的一条消息
%n(new line) 换行 
%d(datetime) 输出当前语句运行的时刻 
%r(run time) 输出程序从运行到执行到当前语句时消耗的毫秒数
%t(thread id) 当前语句所在的线程ID 
%p(priority) 日志的当前优先级别,即DEBUG、INFO、WARN…等 
%c(class) 当前日志对象的名称
%f(file) 输出语句所在的文件名
%l(line) 输出语句所在的行号
%数字 表示该项的最小长度,如果不够,则用空格填充

 

五、使用说明

  1、关联配置文件

  当我们创建了上面的配置文件后,我们接下来需要把它和我们的应用联系起来。缺省的,每个独立的可执行程序集都会定义它自己的配置。log4net框架使用 log4net.Config.DOMConfiguratorAttribute在程序集的级别上定义配置文件。

  例如:可以在项目的AssemblyInfo.cs文件里添加以下的语句

[assembly:log4net.Config.DOMConfigurator(ConfigFile="filename", ConfigFileExtension="ext",Watch=true/false)]
  • ConfigFile:指出了我们的配置文件的路径及文件名,包括扩展名。
  • ConfigFileExtension:如果我们对被编译程序的程序集使用了不同的文件扩展名,那么我们需要定义这个属性,缺省的,程序集的配置文件扩展名为”config”。
  • Watch (Boolean属性): log4net框架用这个属性来确定是否需要在运行时监视文件的改变。如果这个属性为true,那么FileSystemWatcher将会被用来监视文件的改变,重命名,删除等事件。

  其中:ConfigFile和ConfigFileExtension属性不能同时使用,ConfigFile指出了配置文件的名字,例如,ConfigFile=”Config.txt”

  2、创建或获取日志对象

  日志对象会使用在配置文件里定义的属性。如果某个日志对象没有事先在配置文件里定义,那么框架会根据继承结构获取祖先节点的属性,最终的,会从根日志获取属性。如下所示:

Log4net.ILog log = Log4net.LogManager.GetLogger("MyLogger");

  3、输出日志信息

  可以使用ILog的几种方法输出日志信息。你也可以在调用某方法前先检查IsXXXEnabled布尔变量,再决定是否调用输出日志信息的函数,这样可以提高程序的性能。因为框架在调用如ILog.Debug(…)这样的函数时,也会先判断是否满足Level日志级别条件。

if (log.IsDebugEnabled) log.Debug("message");

if (log.IsInfoEnabled) log.Info("message);

Log4net