一、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="D:\123.txt" /> <!--是否追加到文件--> <appendToFile value="true" /> <!--变换的形式为日期--> <rollingStyle value="Date" /> <!--日期的格式--> <datePattern value="yyyyMMdd-HH:mm:ss" /> <!--以日志文件大小变换文件名--> <rollingStyle value="Size" /> <!--最大变换数量,-1为不限制--> <maxSizeRollBackups value="-1" /> <!--最大文件大小(1G切换)--> <maximumFileSize value="1GB" /> <layout type="log4net.Layout.PatternLayout"> <!--每条日志末尾的文字说明--> <footer value="by Mr.Jun" /> <!--输出格式--> <conversionPattern value="记录时间:%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)]
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="ALL" /> <appender-ref ref="LogSmtpAppender" /> <appender-ref ref="LogFileAppender" /> </logger> <!--定义输出到文件中--> <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> <!--定义文件存放位置--> <file value="D:\123.txt" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <datePattern value="yyyyMMdd-HH:mm:ss" /> <layout type="log4net.Layout.PatternLayout"> <!--输出格式--> <conversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" /> </layout> </appender> <!--定义邮件发送--> <appender name="LogSmtpAppender" type="log4net.Appender.SmtpAppender"> <authentication value="Basic" /> <to value="xxx@qq.com" /> <from value="xxx@163.com" /> <username value="xxx@163.com" /> <password value="xxx" /> <subject value="XXX应用错误日志消息" /> <smtpHost value="smtp.163.com" /> <bufferSize value="2048" /> <!--超长部分是否丢弃--> <lossy value="true" /> <!--日志级别 大于 WARN 的才发邮件--> <evaluator type="log4net.Core.LevelEvaluator"> <threshold value="ERROR"/> </evaluator> <!--定义邮件的格式--> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%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);