ASP.NET Mvc中异常日志记录
程序员文章站
2022-03-05 12:04:41
...
1.首先在项目文件夹的packages文件夹下创建文件夹Log4net,将从网上下载的log4net.dll文件以及Log4net.xml文件放入到创建的Log4Net文件夹目录下。
2.在项目中添加对log4net.dll文件的引用。并在Global.asax类中的Application_Start方法中添加代码并引入命名空间using log4net
log4net.Config.XmlConfigurator.Configure();
3. 在webConfig.xml文件中的configSections节点下添加代码:
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
紧接着在configSections的结束标签后添加代码
<log4net>
<!-- Define some output appenders -->
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<!--日志路径-->
<file value="C:\test.txt"/>
<!--是否向文件中追加日志-->
<appendToFile value="true"/>
<!--日志保留天数-->
<maxSizeRollBackups value="10"/>
<!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志-->
<maximumFileSize value="1024KB"/>
<!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
<rollingStyle value="Size"/>
<!--否只写到一个文件中-->
<staticLogFileName value="true"/>
<layout type="log4net.Layout.PatternLayout">
<!--记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger 操作者ID:%property{Operator} 操作类型:%property{Action}%n 当前机器名:%property%n当前机器名及登录用户:%username %n 记录位置:%location%n 消息描述:%property{Message}%n 异常:%exception%n 消息:%message%newline%n%n-->
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
</layout>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="RollingLogFileAppender"/>
</root>
</log4net>
本文只配置了这几个
4.在MVC项目中的Model文件夹中添加MyExceptionFilter.cs类,使其继承于HandleErrorAttribute并重写这个方法
public override void OnException(ExceptionContext filterContext)
{}
5.创建类库Common在类库中添加Log4netWriter以及ILog4netWriter接口在ILog4net中添加方法,logWriter代码如下
void logWriter(string txt);
Log4netWriter继承接口ILog4netWriter接口实现此方法:代码如下
public void Witerloginfo(string txt)
{
ILog log = log4net.LogManager.GetLogger("异常记录");
log.Error(txt);
}
再添加Log4netHelper类代码如下:
public static Queue<string> Exceptionstr = new Queue<string>();
public static List<ILog4netWriter> list = new List<ILogWriter>();
static Log4netHelper()
{
list.Add(new Log4netWriter());
ThreadPool.QueueUserWorkItem(O =>
{
while (true)
{
lock (Exceptionstr)
{
if (Exceptionstr.Count > 0)
{
string str = Exceptionstr.Dequeue();
foreach (var item in list)
{
item.Witerloginfo(str);
}
}
}
}
});
}
public static void Wirterlog(string txt)
{
lock (Exceptionstr)
{
Exceptionstr.Enqueue(txt);
}
}
}
6.在第四步骤重写的方法中添加代码:
base.OnException(filterContext);
LogHelper.Wirterlog(filterContext.Exception.ToString());
7.在项目的App_Start文件夹目录下的FilterConfig.cs类中将 filters.Add(new HandleErrorAttribute)改为filters.Add(new MyExceptionFilter());