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

    < 原创文章如转载,请注明出处。 />
  • 相关阅读:
    UNIX网络编程——TCP/IP简介
    UNIX环境高级编程——TCP/IP网络编程
    UNIX环境高级编程——网络编程常用函数及结构
    UNIX环境高级编程——网络基础概念
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/belloworld/p/4660977.html
Copyright © 2011-2022 走看看