1》从log4net官网下面log4net的文件包,然后在包的bin文件夹下的net文件夹中的4.0文件夹中找到log4net.dll文件,然后将它引入到我们的项目中来
2》在项目中新建一个log4net.config的配置文件。下面我们来配置这个log4net.config配置文件
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!--配置一个结点 名称为log4net--> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <!--写入到文件--> <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender,log4net"> <!--文件路径,如果RollingStyle为Composite或Date,则这里设置为目录,文件名在DatePattern里设置,其他则这里要有文件名。已经扩展支持虚拟目录--> <param name="File" value="Log\\LogInfo\\" /><!--将日记写入到跟目录下面的Log文件夹下面的LogInfo文件夹下面的yyyy-MM-dd.TXT文件中--> <param name="AppendToFile" value="true" /> <param name="MaxSizeRollBackups" value="100" /> <param name="MaximumFileSize" value="10240KB" /> <param name="StaticLogFileName" value="false" /> <param name="RollingStyle" value="Date" /> <param name="DatePattern" value="yyyy-MM-dd.TXT" /> <!--TXT后缀必须是大写的,否则有问题--> <param name="CountDirection" value="-1" /> <!--log4net记录错误的格式(即:用什么样的格式(布局)来记录错误)--> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value=" 【时间】:%d%n 【级别】:%p%n 【类名】:%c%n 【线程ID】: %thread %n 【文件地址】:%F 第%L行%n 【日志内容】:%m%n 【日记详细】:%exception %n---------------------------------------------------------------------------------------------------------------%n" /> </layout> </appender> <!--将日记写入数据库--> <appender name="ADONetAppender_SqlServer" type="log4net.Appender.ADONetAppender"> <bufferSize value="0" /> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <!--<connectionString value="SERVER=FB-VAIO;DATABASE=sales;UID=sa;PWD=123456;Connect Timeout=15;" />--> <connectionString value="Data Source=FB-VAIO;Initial Catalog=sales;Integrated Security=SSPI;Connect Timeout=15;" /> <commandText value="INSERT INTO xlog ([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="%t"/> </layout> </parameter> <parameter> <parameterName value="@log_level"/> <dbType value="String"/> <size value="50"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%p"/> </layout> </parameter> <parameter> <parameterName value="@logger"/> <dbType value="String"/> <size value="50"/> <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="%m"/> </layout> </parameter> <parameter> <parameterName value="@exception"/> <dbType value="String"/> <size value="2000"/> <layout type="log4net.Layout.ExceptionLayout"> <conversionPattern value="%exception"/> </layout> </parameter> </appender> <!--在出现什么级别的错误才记录错误 【注意:如果有多个appender-ref的时候,应该给他们放到同一个root节点下】--> <root> <level value="ALL" /> <appender-ref ref="LogFileAppender"/> <appender-ref ref="ADONetAppender_SqlServer"/> </root> </log4net> </configuration>
3》 配置完log4net.config配置文件 ,那么我们就需要将它加载到我们的项目中来。(即让新建的这个log4net.config配置文件与我们的项目关联起来)
现在,我决定建立一个单独的类库,在类库中,写代码将log4net.config这个配置文件加载到我们的项目中。
3.1:首先在我项目中Web.config文件指定我新建立的log4net.config这个配置文件的路径(即:在新建的类库中通过读取Web.config文件下的log4net.config的路径找到log4net.config文件,然后再把它加载到我们的项目中来) Web.config配置文件如下:
<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> </system.web> <appSettings> <!--这里添加了两个key,设定,如果key为log4net的value值为1,就表示我单独为log4net配置了配置文件,它并没有配置在Web.config里面,如果为0就表示lo4net的配置文件配置在Web.config中,没有作为一个单独文件配置--> <add key="log4net" value="1"/> <!--这里设定我们单独配置的log4net配置文件的路径--> <add key="log4netPath" value="D:\MVC\MvcTest\WebTest\log4net.config"/> </appSettings> </configuration>
3.2:现在我们来新建一个类库,命名为Log4NetUtil 在它里面新建一个LogHelper.cs类 ,下面我们来写这个LogHelper.cs的代码:如下
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace Log4NetUtil { public class LogHelper { private log4net.ILog log = null; public LogHelper() { //如果Web.config配置文件中的key为log4net的value值为1,就表示log4net的配置文件是作为一个单独文件进行配置的, if (System.Configuration.ConfigurationManager.AppSettings["log4net"].ToString() == "1") { //那么我就获取log4net的配置文件,并将它加载到我们的项目中去 string filePath = System.Configuration.ConfigurationManager.AppSettings["log4netPath"].ToString(); System.IO.FileInfo file = new System.IO.FileInfo(filePath); //Getlogger()静态方法,用来检索框架里是否存在logger对象,如果不存在就创建一个名字为logger的对象 log4net.Config.XmlConfigurator.Configure(file); } else { log4net.Config.XmlConfigurator.Configure(); } log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); } /// <summary> /// 程序运行的过程中的,一般信息可以调用此方法记录日记 /// </summary> /// <param name="info"></param> public void Info(string info) { if (log.IsInfoEnabled) { log.Info(info); } } /// <summary> /// 程序运行的过程中的,一般信息可以调用此方法记录日记 /// </summary> /// <param name="info"></param> /// <param name="ex"></param> public void Info(string info, Exception ex) { if (log.IsInfoEnabled) { log.Info(info, ex); } } /// <summary> /// 程序出现错误的时候调用此方法记录日记(一般用在出现了异常以后) /// </summary> /// <param name="info"></param> public void Error(string info) { if (log.IsErrorEnabled) { log.Error(info); } } /// <summary> /// 程序出现错误的时候调用此方法记录日记(一般用在出现了异常以后) /// </summary> /// <param name="info"></param> /// <param name="ex"></param> public void Error(string info, Exception ex) { if (log.IsErrorEnabled) { log.Error(info, ex); } } /// <summary> /// 程序员觉得任何有利于程序在调试时更详细的了解系统运行状态的信息,比如变量的值等等,都可以调用此方法记录到日记 /// </summary> /// <param name="info"></param> public void Debug(string info) { if (log.IsDebugEnabled) { log.Debug(info); } } /// <summary> /// 程序员觉得任何有利于程序在调试时更详细的了解系统运行状态的信息,比如变量的值等等,都可以调用此方法记录到日记 /// </summary> /// <param name="info"></param> /// <param name="ex"></param> public void Debug(string info, Exception ex) { if (log.IsDebugEnabled) { log.Debug(info, ex); } } /// <summary> /// 程序出现警告时调用此方法记录日记(程序出现警告不会使程序出现异常,但是可能会影响程序性能) /// </summary> /// <param name="info"></param> public void Warn(string info) { if (log.IsWarnEnabled) { log.Warn(info); } } /// <summary> /// 程序出现警告时调用此方法记录日记(程序出现警告不会使程序出现异常,但是可能会影响程序性能) /// </summary> /// <param name="info"></param> /// <param name="ex"></param> public void Warn(string info, Exception ex) { if (log.IsWarnEnabled) { log.Warn(info, ex); } } /// <summary> /// 程序出现特别严重的错误,一般是在应用程序崩溃的时候调用此方法记录日记 /// </summary> /// <param name="info"></param> public void Fatal(string info) { if (log.IsFatalEnabled) { log.Fatal(info); } } /// <summary> /// 程序出现特别严重的错误,一般是在应用程序崩溃的时候调用此方法记录日记 /// </summary> /// <param name="info"></param> /// <param name="ex"></param> public void Fatal(string info, Exception ex) { if (log.IsFatalEnabled) { log.Fatal(info, ex); } } } }
4》在我们的项目中添加引用,将新建的这个Log4NetUtil类库引入到我们的项目中来。 (到这一步就是一切准备妥当了,下面就要具体使用它了)
5》在项目中添加WebForm1.aspx页面文件。我们拖一个button控件到我们的WebForm1.aspx页面中来,button控件 命名 ”请点击按钮,测试错误“
双击button控件,给它添加单击事件,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using log4net; using System.Reflection; namespace WebTest { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { int x = 6; int y = 0; try { int z = x / y; } catch (Exception ex) { Log4NetUtil.LogHelper log = new Log4NetUtil.LogHelper(); log.Error("错误:"+ex.Message,ex); Response.Write("OK"); } } } }
6》然后我们在数据中新建一个表 命名为 xlog(用于将日记记录到数据库中) 表结构如下:
7》大功告成: 下面我来生成一下解决方案,运行这个WebForm1.aspx页面
点击页面上的按钮。 然后我们再去我们数据库中的xlog表中查看一下数据,发现已经有一条错误日记写入到表中了。
我们再去项目所在的磁盘目录下 ,在项目文件夹下面我们看到生成了一个log文件夹,在log文件夹下面有一个loginfo文件夹,loginfo文件夹下面有一个以当前日期命名的txt文件,这个文件就是我们刚刚生成的错误日记了。打开看一下: