zoukankan      html  css  js  c++  java
  • [.Net MVC] 使用 log4net 日志框架

    项目:后台管理平台

    意义:项目开发中提出增加日志功能,对关键的操作、程序运行中的错误信息进行记录,这对程序部署后的调试有很大意义。

    注:本文只是对网上搜集的信息进行了整合,以备今后查询。

    关键字:.NET MVC,LOG4NET


    一、最快速的上手步骤

    1.用 NuGet来添加log4net

    2.在项目根目录下的Web.config中添加节点。在 <configSections> 节点下添加对log4net的引用,

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

    新增 <log4net> 节点,配置log4net,

    <log4net>
      <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
        <file value="C:Templog4net.log" />
        <appendToFile value="true" />
        <maximumFileSize value="500KB" />
        <maxSizeRollBackups value="2" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date %level %logger - %message%newline" />
        </layout>
      </appender>
      <root>
        <level value="All" />
        <appender-ref ref="RollingFile" />
      </root>
    </log4net>

    log4net提供了非常强大的控制策略,例如,可以控制输出日志输出格式、页眉页脚、覆盖策略、安全控制等。上面这个例子中的配置就是要添加一个appender并且把所有类型的信息都放在 C:Templog4net.log。在实际的项目中,应该使用更多更详细的配置信息.。比如,可能需要把 ERROR 或 FATAL 级别的信息发送给系统管理员。

    3.编辑并且添加以下内容到Global.asax.cs,让log4net去读取这个XML配置。

    protected void Application_Start()
    {
        log4net.Config.XmlConfigurator.Configure();
    }

    4.为了测试这个log4net日志,在HomeController.cs 文件里添加以下内容。先创建日志记录组件实例,

    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(HomeController)); 

     记录调试信息。

    public ActionResult Index() { 
      log.Debug("HomeController.Index() was called");
      return Index(); 
    }

    5.启动程序后浏览Home page,log4net会创建 C:Templog4net.log 文件,并且为每个请求添加以下日志信息:

    2015-07-20 09:53:14,682 DEBUG MyCompany.WebUI.Controllers.HomeController - HomeController.Index() was called


    二、有关配置的详细说明

      通过上面的例子,可以快速配置并使用log4net,从使用过程中,发现使用的关键在于对log4net的配置,也就是在Web.config文件里的<log4net>节点。下面对此节点下的重要配置进行介绍。

    1.<appender>

      每个<appender>子节点代表一种记录日志的方式(仅在这里配置了不代表启用了)。

    具体说来有如下Appender:
    AdoNetAppender:利用ADO.NET记录到数据库的日志。
    AnsiColorTerminalAppender:在ANSI 窗口终端写下高亮度的日志事件。
    AspNetTraceAppender:能用asp.net中Trace的方式查看记录的日志。
    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的形式广播。

      项目中考虑使用RollingFileAppender方式:(控制日志文件大小的问题)对于一个长时间使用并且有大量业务日志的系统来说,如果使用FileAppender将日志一直记录到一个文件中会引起性能低下的问题,在这种情况下可考虑使用RollingFileAppender循环记录日志,指定文件的最大长度,如果超过了就重新生成一个文件,如下面的配置:

    <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>

    在上面的配置中,每个日志文件最大100KB,最大日志文件个数是10,生成的日志文件名会是RollingFileAppender_log.txt.1, RollingFileAppender_log.txt.2 ... RollingFileAppender_log.txt.10,如果记录的日志超过10个,会从RollingFileAppender_log.txt.1开始覆盖。

    还有一种方式就是按照日期记录日志,它的配置如下:

    <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>

    每天的日志写入到一个文件中,当天的日志文件名为“RollingLogFileAppender_DateFormat_log.txt”,非当天的日志都会带上当天的日期,如“RollingLogFileAppender_DateFormat_log.txt20101117”表示2010年11月17日的日志,方便地区分和查找。

    2.<root>

    关闭和启用日志,可以在<root>进行配置,如下就是一个例子:

    <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>

    增加日志输出目的地,可以增加<appender-ref>节点,注意后面的ref是appender name,如果想要取消,删除或者注释掉这行就可以。

     <root> 下的 <level value="All" /> 标签设置允许记录日志的级别。一共有七个级别,其中2至6可以在代码中调用,

    1. OFF
    2. FATAL
    3. ERROR
    4. WARN
    5. INFO
    6. DEBUG
    7. ALL

      <root> 下的 <layout> 标签设置日志数据记录格式。 <layout> 下的子标签设置具体的格式

    • %date - 输出本地时区下的日期,可以使用格式%date{MMMM dd, yyyy HH:mm:ss, fff}输出"January 01, 2011 14:15:43, 767"
    • %utcdate - 输出世界时间
    • %exception - 传入异常信息时,在异常后添加新的一行,没有异常传入时,不显示
    • %level - 记录的事件级别
    • %message - 用户传入的信息
    • %newline - 换行
    • %timestamp - 时间戳,程序运行以来的毫秒数
    • %thread - 调用接口的线程名或线程号

      下面的方法应该谨慎使用:

    • %identity - 当前用户的名称,调用 Principal.Identity.Name 属性
    • %location - 在调试模式下很有用,提示日志记录方法在何处被调用
    • %line - 显示调用记录的行号
    • %method - 显示调用记录的方法
    • %username - 显示Windows用户,调用 System.Security.Principal.WindowsIdentity 属性

      在%符号和调用的名称之间可以添加数值,使每条信息有固定的宽度:

    • X - 设置最小字符数。如果信息宽度小于设置字符数,在字符左边会填充空格,例如,%10message显示hi"
    • -X - 功能和上面的相同,空格会填充在右边,例如,%-10message显示"hi "
    • .X - 设置最大字符数,如果信息超过设置值,砍断字符串的开头部分,例如,%.10message显示"rror entry",如果传入的是"Error entry"

    三、在程序中使用

      目前只是在需要日志记录的地方调用函数,log4net的日志记录函数也很简单,

    void Info(object message);
    void Info(object message, Exception exception);

    函数的名称是日志级别,Error、Fatal、Info、Debug、Warn,参数有传入的信息字符串,和异常信息。

    以上内容整理自互联网,下面的链接,方便日后查询

    http://www.cnblogs.com/anderslly/archive/2007/03/09/log4netconfigsamples.html

    http://www.codeproject.com/Articles/140911/log4net-Tutorial

    http://logging.apache.org/log4net/index.html

    < 原创文章如转载,请注明出处。 />
  • 相关阅读:
    Using Resource File on DotNet
    C++/CLI VS CSharp
    JIT VS NGen
    [Tip: disable vc intellisense]VS2008 VC Intelisense issue
    UVa 10891 Game of Sum(经典博弈区间DP)
    UVa 10723 Cyborg Genes(LCS变种)
    UVa 607 Scheduling Lectures(简单DP)
    UVa 10401 Injured Queen Problem(简单DP)
    UVa 10313 Pay the Price(类似数字分解DP)
    UVa 10635 Prince and Princess(LCS N*logN)
  • 原文地址:https://www.cnblogs.com/belloworld/p/4660977.html
Copyright © 2011-2022 走看看