我们在开发web项目中,总会遇到一些异常,或是需要记录一些信息。我们也基本都是通过程序写日志的方式,来记录程序的异常信息,以及其他信息。那么今天,我来写了一个Demo分享一下.NET中,关于日志处理的一个技术,Log4Net.下面是自己总结的一些步骤,没有太多理论解释。跟着步骤,即可完成!
1.添加程序集引用
这当然是必不可少的一步,关于程序集,我们在网上也都能下载!
2.在models文件夹里面建一个类。MyExceptionAttribute:HandleErrorAttribute(注意:前面为类名,后面为继承的类)内部代码如下
public class MyExceptionAttribute:HandleErrorAttribute
{
public static Queue<Exception> ExceptionQueue = new Queue<Exception>();//建立一个队列
public override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
ExceptionQueue.Enqueue(filterContext.Exception);//将异常信息添加到队列中
filterContext.HttpContext.Response.Redirect("/Error.html");//跳转到错误页面,需要建立一个错误页面
}
}
3.修改App_Start-FilterConfig里面的方法(注释掉原有的类,采用自己刚才创建的类)
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
// filters.Add(new HandleErrorAttribute());
filters.Add(new Models.MyExceptionAttribute());//使用自己的类
}
4.设置配置文件的配置信息
注:这里的配置文件,设置了关于之日文件的格式等。我这里是按照日期新建,也就是一天 新建一个文件,一天之内的日志都会记录在同一个文本内
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<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_"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>
5.在global文件的Application_Start()方法的第一行,添加这个语句
log4net.Config.XmlConfigurator.Configure();//读取配置文件中,关于lognet的配置信息具体如下
注:这句代码是读取配置文件中关于lognet的配置信息,必须写在程序的入口处,那自然是global文件下的Application_Start()方法了
6.在global文件下的Application_Start()中添加写日志的代码,如下
protected void Application_Start()
{
log4net.Config.XmlConfigurator.Configure();//读取配置文件中,关于lognet的配置信息
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
string fileLogPath = Server.MapPath("/Log/");
//线程池
ThreadPool.QueueUserWorkItem((a) => {
while (true)
{
if (Models.MyExceptionAttribute.ExceptionQueue.Count() > 0)
{
Exception ex = Models.MyExceptionAttribute.ExceptionQueue.Dequeue();//出队
//创建文件
if (ex != null)
{
ILog logger=LogManager.GetLogger("errorrMsg");//起一个名字
logger.Error(ex.ToString());
}
else
{
Thread.Sleep(3000);//如果队列中没有消息休息3秒,千万不能少
}
}
else
{
Thread.Sleep(3000);//如果队列中没有消息休息3秒,千万不能少
}
}
},fileLogPath);
}
这样就大功告成了, 另附生成后的日志代码截图一张。
下面我们故意抛一个异常
public ActionResult Show()
{
int b = 0;
int c = 9 / b;
return Content(c.ToString());
}
文件配置在了App_Data文件夹中
日志代码截图如下