标签:
日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点:它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的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)]
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="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属性不能同时使用,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);
标签:
原文地址:http://www.cnblogs.com/Alex80/p/5290043.html