您的位置:首页 > 其它

在MVC使用Log4Net

2015-12-26 23:29 246 查看
1.我们的网站发布之后还是有可能出现很多的错误,这个时候我们不可能加断点进行调试,这能根据日志里面的错误信息进行调试

2.我们首先想到,用户访问网站出错后,我们将错误信息记录到日志里面去,但是多用户并发访问,多线程同时写入日志会出错,我们自然想到写入日志时,加上一把锁lock

3.加上锁后,会遇到用户等待相应的情况,因此我们就想,将错误消息,先放到一个消息队列中去,这样就能够及时响应用户了,然后我们开辟一个线程,不停的从错误消息队列中取得消息,写入到日志中去

4.我们的日志记录到什么地方也是不一定的,可能放到数据库,或者保存到一个txt文件中,这时候就用到我们的观察者模式了,log4net就是这样做的(一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具)
下面是具体操作

第一步:配置文件

<configSections>
<!--Log4net的块配置-->
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<!--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="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_"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="日志开始" value="
----------------------header--------------------------
" />
<param name="日志结束" 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程序集
//从配置文件读取log4net的配置,然后进行一个初始化工作。
    log4net.Config.XmlConfigurator.Configure();

第三步:我们使用观察者模式,可以任意切换写日志到不同的地方(.txt,关系型数据库,MongoDB等)

3.1 先申明一个写入接口

namespace Company.OA.Common
{
public interface ILogWriter
{
void WriteLogInfo(string txt);
}
}

3.2  写入到.txt
public class Log4NetWriter : ILogWriter
{

public void WriteLogInfo(string txt)
{
ILog logWriete = log4net.LogManager.GetLogger("Demo");
logWriete.Error(txt);
}
}

3.3 观察者模式进行写入(这个观察者是用集合写的)
public class LogHelper
{
public static Queue<string> ExceptionStringQueue = new Queue<string>();
public static List<ILogWriter> LogWriterList = new List<ILogWriter>();
static LogHelper()
{
LogWriterList.Add(new Log4NetWriter());

//把从队列中获取错误消息写到 日志文件里面去。
ThreadPool.QueueUserWorkItem(o =>
{
while (true)
{
lock (ExceptionStringQueue)
{
if (ExceptionStringQueue.Count > 0)
{
string str = ExceptionStringQueue.Dequeue();
//把异常信息 写到 日志文件里面去。
//变化点:有可能写到日志文件,有可能写到数据库里面去。有可能两个地方都写。

foreach (var logWriter in LogWriterList)
{
logWriter.WriteLogInfo(str);
}

}
else
{
Thread.Sleep(30);
}
}
}
});
}
//把错误消息写到写到队列中
 public static void WriteLog(string exceptionText)
{
lock (ExceptionStringQueue)
{
ExceptionStringQueue.Enqueue(exceptionText);

}
}
}4.在Models里面创建一个类,不断将错误消息加入到日志中
public class MyExceptionFilterAttribut : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);

//自己处理异常

//直接把错误信息写到日志文件里面去。

Common.LogHelper.WriteLog(filterContext.Exception.ToString());
}
}

因此我们要在App_Start中将添加过滤
filters.Add(new MyExceptionFilterAttribut());

这样我们就成功了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: