一、概述:
log4net是.Net下一个非常优秀的开源日志记录组件。log4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。
二、一个简单的应用实例:
下载Log4Net.dll;下载地址:http://dl.pconline.com.cn/download/401531.html
新建项目:
将Log4Net.dll文件复制到项目的debug文件夹下:
将Log4Net.dll引入项目中:
添加配置文件:
配置文件内容如下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <log4net debug="false"> <!--按日期分割日志文件 一天一个--> <appender name="LogFileAppenderByDate" type="log4net.Appender.RollingFileAppender"> <!--是否续写--> <param name="AppendToFile" value="true"/> <!--最小锁定模型以允许多个进程可以写入同一个文件--> <param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock"/> <param name="StaticLogFileName" value="true"/> <!--保存路径--> <param name="File" value="Log\"/> <param name="DatePattern" value="yyyy-MM-dd.LOG"/> <param name="StaticLogFileName" value="false"/> <param name="RollingStyle" value="Date"/> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="时间:%d %n级别:%level %n类名:%c%n文件:%F 第%L行%n日志内容:%m%n-----------------------------------------%n%n"/> </layout> </appender> <!--按日志容量分割日志文件 10KB一个--> <appender name="LogFileAppenderBySize" type="log4net.Appender.RollingFileAppender"> <!--是否续写--> <param name="AppendToFile" value="true"/> <!--最小锁定模型以允许多个进程可以写入同一个文件--> <param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock"/> <param name="StaticLogFileName" value="true"/> <!--按照文件的大小进行变换日志文件--> <param name="RollingStyle" value="Size"/> <param name="File" value="LogData\log.txt"/> <!--单个文件最大数量 好像只有在 按Size分割时有效--> <param name="MaximumFileSize" value="10KB"/> <!--保留的log文件数量 超过此数量后 自动删除之前的 好像只有在 按Size分割时有效--> <param name="MaxSizeRollBackups" value="1000"/> <param name="StaticLogFileName" value="false"/> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="发生时间:%d %n事件级别:%level %n相关类名:%c%n程序文件:%F 第%L行%n日志内容:%m%n-----------------------------------------%n%n"/> </layout> </appender> <!--记录日志到数据库--> <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> <bufferSize value="100"/> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <connectionString value="data source=10.0.0.13;initial catalog=FBI-TVOEM;integrated security=false;persist security info=True;User ID=sa;Password=000000"/> <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)"/> <parameter> <parameterName value="@log_date"/> <dbType value="DateTime"/> <layout type="log4net.Layout.RawTimeStampLayout"/> </parameter> <parameter> <parameterName value="@thread"/> <dbType value="String"/> <size value="255"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread"/> </layout> </parameter> <parameter> <parameterName value="@log_level"/> <dbType value="String"/> <size value="50"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level"/> </layout> </parameter> <parameter> <parameterName value="@logger"/> <dbType value="String"/> <size value="255"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger"/> </layout> </parameter> <parameter> <parameterName value="@message"/> <dbType value="String"/> <size value="4000"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message"/> </layout> </parameter> <parameter> <parameterName value="@exception"/> <dbType value="String"/> <size value="2000"/> <layout type="log4net.Layout.ExceptionLayout"/> </parameter> </appender> <root> <level value="INFO"/> <!--启用按日期分割--> <appender-ref ref="LogFileAppenderByDate"/> <!--启用按容量分割--> <!--<appender-ref ref="LogFileAppenderBySize" />--> <!--启用保存到数据库--> <!--<appender-ref ref="AdoNetAppender" />--> </root> </log4net> </configuration>
在AssemblyInfo.cs类中添加:[assembly: log4net.Config.XmlConfigurator(Watch = true)];
将项目属性的目标框架改为:.NET Framework 3.5或者.NET Framework 4.0;
日志记录代码如下,需要引入命名空间:using log4net; using System.Reflection;
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; //需要引入的命名空间 using log4net; using System.Reflection; namespace LogDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } static ILog LOG =LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private void Form1_Load(object sender, EventArgs e) { LOG.Info(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+":我是加载日志!!!"); } private void button1_Click(object sender, EventArgs e) { LOG.Info(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":点击了一下!!!"); } } }
运行程序,测试之前先看下debug下的文件:
运行程序:
查看目录:
可以看到程序加载是自动创建了日志目录:Log;查看Log下目录:
查看日志内容:
点击下按钮,再查看日志:
把时间修改到前一天,运行程序,并点击按钮,查看目录:
查看日志:
修改按钮点击事件:
private void button1_Click(object sender, EventArgs e) { // LOG.Info(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":点击了一下!!!"); try { int a = 1; int b = 0; int c = a / b; } catch (Exception ex) { LOG.Error(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":我是异常日志,我捕获到了异常:"+ex.Message); } }
运行程序,点击按钮,查看日志:
聪明的你应该已经看到日志级别,之前的为INFO,捕获异常的为ERROR,
如果想把Error和INFO存放在不同的文件中,可以参考:Log4net按照不同级别写入多个日志文件
系统日志的重要性,可参考:http://www.cnblogs.com/PerkinsZhu/p/6440584.html
当然,以上为C/S开发模式下的日志记录,B/S开发大同小异,可参考:http://www.cnblogs.com/zhangchenliang/p/4546352.html
如有错误,欢迎指教,相互学习,共同进步,谢谢!!