[.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:\Temp\log4net.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:\Temp\log4net.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:\Temp\log4net.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

posted @ 2015-07-21 10:34  BelloWorld  阅读(570)  评论(1编辑  收藏  举报