之前在这篇博客中已经介绍过两种抛出错误日志的方法了,这次在分享一个log4net错误日志抛出法,这个与之前不同的是,这个不需要调用可以自动捕捉错误,相对的多做的一点就是要提前配置好log4net并添加该引用
简介
LogNet是用来记录日志的,可以将程序运行过程中的信息输出到一些地方,日志就是程序的黑匣子,可以通过日志查看系统的运行过程, 从而发现系统的问题
配置配置文件
<configuration>
<configSections>
<!-- Log4Net配置声明了这么一个类型的log4net块用来解析下面的<log4net>节点-->
<section name="log4net" type ="log4net.Config.Log4NetConfigurationHandler,log4net"/>
</configSections>
<log4net>
<!--错误级别共有这么多从小到大依次是OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL
Set root logger level to ERROR and its appenders -->
<root>
<level value="ALL"/>
<appender-ref ref="SysAppender"/>
</root>
<!--定义Web错误日志生成器的级别 Print only messages of level DEBUG or above in the packages-->
<logger name="WebLogger">
<level value="DEBUG"/>
</logger>
<!--声明了一个附加器,类型为文件回滚类型的附加器,还有数据库附加器,电子邮件附加器-->
<appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net" >
<!--文件存放的位置,App_Data是一个内部方位文件夹安全级别高,value可以随意指定 -->
<param name="File" value="App_Data/" />
<!--是否将错误往文件里附加,是就将错误日志附加到指定路径下-->
<param name="AppendToFile" value="true" />
<!--回滚方式,我在这里用的是日期回滚,还可以一大小进行回滚-->
<param name="RollingStyle" value="Date" />
<!--回滚模式,基本相当于给错误文件命名,格式随意-->
<param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" />
<!--是否静态生成文件名,很明显回滚模式是动态生成的,所以选了false-->
<param name="StaticLogFileName" value="false" />
<!--错误信息的显示格式,自己设计即可-->
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
<param name="Header" value="----------------------header--------------------------" />
<param name="Footer" value="----------------------footer--------------------------" />
</layout> </appender> <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net">
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
</layout>
</appender>
</log4net>
</configuration>
设置路由初始化(global)
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
// 默认情况下对 Entity Framework 使用 LocalDB
Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0;
Integrated Security=True; MultipleActiveResultSets=True");
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
//让log4net配置节点起作用,可以看到我注释了一行,这是应为有了注释的这句log4net的配置就可
以生效,但如果要放到配置指定的路径下还要写出路径
//log4net.Config.XmlConfigurator.Configure();
log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo
(Server.MapPath("~/Web.config")));
}
public void Application_Error(object send, EventArgs e)
{
//记录日志
Exception ex = Server.GetLastError();
string errorMsg = ex.ToString();
//日志可d能写到多个地方去,这是把错误信息放到自己规定的类里面去,在logHelper里可以看见
这个方法
DAL.LogHelper.WriteLog(errorMsg);
//跳到错误页或者跳转
// Response.Redirect("/Error.html");
}
猜测为什么要写到global里面?
这个和global.asax文件的作用是有关的,一个关键字Application,具体详解请见这篇博客global.asax
编写logHelper
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net;
using System.Threading.Tasks;
using System.Threading;
namespace DAL
{
public class LogHelper
{
//异常消息队列
public static Queue<string> ExcMsg;
static LogHelper()
{
ExcMsg = new Queue<string>();
ThreadPool.QueueUserWorkItem(u =>
{
while (true)
{
string str = string.Empty;
if (ExcMsg == null)
{
continue;
}
lock (ExcMsg)
{
if(ExcMsg.Count>0)
str = ExcMsg.Dequeue();
}
if (!string.IsNullOrEmpty(str))
{
//在这里开始真正的将错误信息写入日志,所以实例化一个日志来盛放错误信息
ILog log = log4net.LogManager.GetLogger("Test");
log.Error(str);
}
if (ExcMsg.Count() <= 0)
{
Thread.Sleep(30);
}
}
}
);
}
//定义一个写日志的方法,作用是将接受到的错误信息上锁并放到队列里进行处理
public static void WriteLog(string msg)
{
lock (ExcMsg)
{
ExcMsg.Enqueue(msg);
}
}
}
}
总结:
慢慢来吧