在上一篇文章中,实现了利用Log4Net记录系统中出现的问题。如果同时还需要记录用户操作的监控日志,就需要一些修改
修改Web.Cofig配置文件 ,增加一个logger节点和appender节点,用于监控操作日志配置,并且设置不同的日志文件路径,如下图所示:
<log4net><!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL --><!-- Set root logger level to ERROR and its appenders --><!--<root><level value="ALL"/><appender-ref ref="ErrorLogger"/><appender-ref ref="ErrorLogger"/></root>--><!-- Print only messages of level DEBUG or above in the packages --><logger name="ErrorLogger"><!--这里进一步限制了日志级别,只有在大于等于DEBUG的情况下才会记录日志--><level value="DEBUG"/><appender-ref ref="SysAppender"></appender-ref></logger><appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net" ><!--日志放在项目的App_Data文件夹--><param name="File" value="Logs\\Error\\" /><!--日志以追加形式记录--><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><logger name="CommonLogger"><!--这里进一步限制了日志级别,只有在大于等于DEBUG的情况下才会记录日志--><level value="DEBUG"/><appender-ref ref="CommonAppender"></appender-ref></logger><appender name="CommonAppender" type="log4net.Appender.RollingFileAppender,log4net" ><!--日志放在项目的App_Data文件夹--><param name="File" value="Logs\\Common\\" /><!--日志以追加形式记录--><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>
修改Global.asax.cs中Application_Start()方法中原来的队列代码中的这句代码,变为系统问题型日志,如下图所示:
ThreadPool.QueueUserWorkItem(o =>
{while (true){if (MyErrorAttribute.ExceptionQueue.Count > 0){Exception ex = MyErrorAttribute.ExceptionQueue.Dequeue();if (ex != null){log4net.ILog logger = log4net.LogManager.GetLogger("ErrorLogger");//修改为和WebConfig中<logger name="ErrorLogger">一样logger.Error(ex.ToString());}else{Thread.Sleep(50);}}else{Thread.Sleep(50);}}
});
在要监控用户操作的地方,加上如下图中的代码,用来打印监控日志:
public class HomeController : Controller{public static log4net.ILog log = log4net.LogManager.GetLogger("CommonLogger");//定义为用户监控日志,对应WebConifg中的<logger name="CommonLogger">public ActionResult About(){int result = 0;int x = 1, y = 0;result = x / y;//系统报错日志ViewBag.Message = "Your application description page.";return View();}public ActionResult Contact(){log.Error("好像出错了");//写入自定义的普通监控日志ViewBag.Message = "Your contact page.";return View();}}
使用效果如下图所示:
Common文件夹下的日志:
Error文件夹下的日志:
总结:
Log4Net 有3个主要组件:loggers、appenders 和 layouts。这三个组件一起工作式使得开发者能够根据信息类型和等级level记录信息,以及在运行时控制信息的格式化和信息的的写入位置(如控制台、文件、内存、数据库等)。过滤器帮助这些组件控制追加器(appender)的行为和把对象转换成字符串的对象渲染。
Appender:可以将日志输出到不同的地方,不同的输出目标对应的不同的 Appender,如RollingFileAppender(滚动文件)、AdoNetAppender(数据库)、SmtpAppender(邮件)等。
level(级别):标识这条日志信息的重要级别。None>Fatal>Error>Warn>DEBUG>INFO>ALL.设定一个level,那么低于这个level等级的日志是不会被写到Appender中的。
Log4Net还可以设定多个Appender,可以实现同时将日志记录到文件、数据、发送邮件等:可以设定不同的Appender的不同Level,可以实现普通级别都记录到文件、Error以上级别都发送邮件:可以实现对不同的类设定不同Appender:开可以自定义 Appender,自己实现将Error信息发短信等。