在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程序集
第三步:我们使用观察者模式,可以任意切换写日志到不同的地方(.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());
这样我们就成功了!
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());
这样我们就成功了!
相关文章推荐
- QT 模拟鼠标点击的例子
- Letter Combinations of a Phone Number
- scikit-learn的主要模块和基本使用
- 一篇实用的Latex的入门教程
- 获取MAC系统最高权限(解决文件无法拷贝问题)
- 随想24:中国终将发展成第一强国
- jQuery学习--jQuery选择器
- 编译安装mysql
- Linux Netlink通信机制详解
- HttpClient之post方法和HttpUrlConnection之Get方法
- python初级学习之基于收发邮件的远程控制程序
- curl模拟自动登陆&采集网页数据
- shell变量替换技术实践与生产实践
- Celery+django_celery+flask_celery+rabbitmq+flower+
- 部门管理中非递归搜索部门以及所管辖下部门
- Java 环境变量配置
- Java 利用 JDBC 连接 Sqlsever2012 实现 增删改查
- 工具的使用 —— sublime
- 神经网络反向传播公式的推导
- Junit程序书写技巧