前言:
项目里我们都需要记录一些日志。当然记录的日志的方式有很多,比如用文本记录日志,数据库记录日志,甚至用word记录日志,但是这些记录日志的方式不灵活。下面我为大家介绍下一个简单的日志组件:Log4Net。
简介Log4Net:
Log4Net是一个开源的记录日志的组件,可以将记录的日志输出到,txt文件、数据库、EventLog等。
配置Log4Net步骤:
①:引入Lofg4Net的dll文件(下面会有dll的下载链接)
②:在应用程序的web.config配置相关信息
1.在configSections的标签里添加section字节
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
2.在web.config添加下面的代码:
<log4net>
<!-- Define some output appenders -->
<!--针对txt文件的配置-->
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="test.txt"/><!--文件名-->
<appendToFile value="true"/>
<maxSizeRollBackups value="10"/><!--最多10个文件,多了会从头覆盖-->
<maximumFileSize value="1024KB"/><!--文件空间大小:可以调节-->
<rollingStyle value="Size"/>
<staticLogFileName value="true"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
</layout>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="RollingLogFileAppender"/>
</root>
</log4net>
<!--配置结束-->
上面的配置方式不细致,接下来给大家配置一个细致的,文档是用日期命名的:(尽量选择这个)
<!--log4Net的另一种配置:动态配置-->
<log4net>
<!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
<!-- Set root logger level to ERROR and its appenders -->
<root>
<level value="ERROR"/>
<appender-ref ref="SysAppender"/>
</root>
<!-- Print only messages of level DEBUG or above in the packages -->
<logger name="WebLogger">
<level value="ERROR"/>
</logger>
<appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net" >
<param name="File" value="App_Data/" /><!--日志放在项目的App_Data文件夹-->
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Date" /><!--日期作为回滚:日期排序-->
<param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" />
<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>
<!--Log4Net配置结束-->
③:在Global.asax的Application_Start里添加:下面这个代码
//log4Net读取配置文件中关于Log4Net配置信息
log4net.Config.XmlConfigurator.Configure();
④:在需要记录日志的地方,添加下面的代码:(这两行代码就能直接把错误保存到文件里)
ILog logger = LogManager.GetLogger("errorMsg");//注意:ILog需要引用log4net
logger.Error(ex.ToString());
配置好Log4Net下面进行代码演示:(下面的代码我是配合了MVC中的自定义捕获来实现的,你也可以不用自定义捕获来实现)
①:自定义一个类继承HandleErrorAttribute,并重写HandleErrorAttribute里的OnException方法
public class MyExceptionAttribute: HandleErrorAttribute
{
//定义一个错误队列
public static Queue<Exception> ExceptionQueue = new Queue<Exception>();
/// <summary>
/// 捕获异常
/// </summary>
/// <param name="filterContext"></param>
public override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
Exception ex = filterContext.Exception;
//写到队列
ExceptionQueue.Enqueue(ex);
//跳转到错误页
filterContext.HttpContext.Response.Redirect("/Error.html");
}
}
②:注销FilterConfig里原先注册的创建的异常捕获实例,添加自己定义的异常捕获代码
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//把自己定义的异常过滤器创建一下
filters.Add(new MyExceptionAttribute());
//filters.Add(new HandleErrorAttribute());
}
}
③:在Application_Start里开启一个线程,扫描队列里有没有异常数据
string errorFilePath = Server.MapPath("ErrorLog");//保存日志的文件夹的路径
//在QueueUserWorkItem是传一个委托,类型是WaitCallback委托
//在线程池里取线程
ThreadPool.QueueUserWorkItem((a) =>
{
while (true)
{
//判断一下队列里是不是有数据
if (MyExceptionAttribute.ExceptionQueue.Count() > 0)
{
//拿到数据
Exception ex = MyExceptionAttribute.ExceptionQueue.Dequeue();
if (ex != null)
{
ILog logger = LogManager.GetLogger("errorMsg");//注意:ILog需要引用log4net
logger.Error(ex.ToString());
}
else
{
Thread.Sleep(3000);
}
}
else
{
//如果队列中没有数据就让队列休息
Thread.Sleep(3000);
}
}
},errorFilePath);
④:创建一个控制器,写一个错误的代码:
效果展示:
注意重点;小心大坑,大坑!!!,我差点没出来!坑死我了
就是我们也按上面的步骤做了,为啥程序中断了,捕获不到异常。
这是因为在VS里有个中断异常处理,如果你的程序中有错误会直接让程序中断,这时我们的所用的异常处理就无法发挥作用了。
中断程序展示:
解决办法:
按照上面的做就能呈现上面的效果
大家如果想了解Asp.Net中MVC的全局异常捕获和自定义捕获请参考下面的链接
链接:https://blog.csdn.net/GreyCastle/article/details/89006972
Log4Net.dll的下载链接: https://pan.baidu.com/s/1me8ju91_JnyYf4kBbYaNBQ
提取码: wrc4
补充知识:
结尾:分享
真理惟一可靠的标准就是永远自相符合。 —— 欧文