前言
当程序运行出错后,我们并不希望用户看到错误信息,而是一个错误页面,错误信息应该存放在一个地方供我们技术人员查看。所以log4net插件就帮了我们很大忙。
引入log4net
百度网盘=>传送门,提取码为e6mu,将下载好的压缩包解压,引入dll文件到你的项目中。
准备好一个错误页面供用户查看。
Webconfig配置
在web.config文件节点configSections里添加一个log4的代码
1 |
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> |
创建log4配置节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<!--log4配置--> <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> <!-- 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" > <param name="File" value="App_Data/" /> <param name="AppendToFile" value="true" /> <param name="RollingStyle" value="Date" /> <param name="DatePattern" value=""Logs_"yyyy-MM-dd".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> |
创建一个错误类
这里由于并发的原因,所以要用队列的形式,将错误信息先入先出保存到特定文件中,这里我用了redis分布式的队列。
1 2 3 4 5 6 7 8 9 10 11 12 |
public class ErrorLog : HandleErrorAttribute { //分布式redis队列 public static RedisClient rc = new RedisClient("redis服务端地址", 6379); public override void OnException(ExceptionContext filterContext) { //分布式redis入队 rc.EnqueueItemOnList("error", filterContext.Exception.ToString()); filterContext.HttpContext.Response.Redirect("/test/errors"); base.OnException(filterContext); } } |
/test/errors是我准备好的错误页,这个类的作用就是将错误信息入队,入队好之后就该出队了。
错误信息出队
打开Global.asax文件,在protected void Application_Start()的下面添加一行代码
1 |
log4net.Config.XmlConfigurator.Configure(); |
由于要一直检测是否有错误信息产生,所以不可能用主线程来完成这个检测任务,这时候就要用到线程池来完成这个操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//log4输出错误信息 ThreadPool.QueueUserWorkItem(p => { while (true) { if (ErrorLog.rc.GetListCount("error") > 0) { //出队 string str = ErrorLog.rc.DequeueItemFromList("error"); log4net.ILog myLogger = log4net.LogManager.GetLogger("error日志"); myLogger.Error(str); Thread.Sleep(200); } else { Thread.Sleep(200); } } }); |
log4错误信息默认保存在App_Data文件夹中,若是要修改可以到log4配置节点里修改,log4压缩包中有个使用说明,还可以将错误信息保存到数据库,具体做法各位可以自己参考例子。
评论