1、新建一个mvc项目
2、添加对log4Net.dll的引用
3、在configSections中添加如下配置节点:
<section name=
"log4net" type=
"log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
4、紧靠configSections添加如下配置信息
<log4net>
<root>
<level value="ALL"/>
<appender-ref ref="SysAppender"/>
</root>
<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、初始化在程序开始加入
log4net
.Config.XmlConfigurator.Configure()
protected void Application_Start()
{
log4net
.Config.XmlConfigurator.Configure()
AreaRegistration
.RegisterAllAreas()
WebApiConfig
.Register(GlobalConfiguration
.Configuration)
FilterConfig
.RegisterGlobalFilters(GlobalFilters
.Filters)
RouteConfig
.RegisterRoutes(RouteTable
.Routes)
BundleConfig
.RegisterBundles(BundleTable
.Bundles)
}
6、在需要打印日志的地方添加
LogManager
.GetLogger(typeof(Program))
.Debug(
"信息")
考虑到记录日志会存在并发的问题,这里通过队列的方式记录日志。
思路:把所有的日志信息放在一个队列里面,通过新建一个线程不断地从这个队列读取异常信息,然后往日志里面写。(也就是所谓的生产者-消费者模式)。
7、新建一个类MyErrorAttribute
public class MyErrorAttribute:HandleErrorAttribute
{
public static Queue<Exception> ExceptionQueue =
new Queue<Exception>();
public override void OnException(ExceptionContext filterContext)
{
ExceptionQueue.Enqueue(filterContext.Exception);
base.OnException(filterContext);
}
}
8、在FilterConfig进行一下修改
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(
new MyErrorAttribute());
}
9、在Global.asax文件中的Application_Start()方法中添加如下代码:
protected void Application_Start()
{
log4net
.Config.XmlConfigurator.Configure()
AreaRegistration
.RegisterAllAreas()
WebApiConfig
.Register(GlobalConfiguration
.Configuration)
FilterConfig
.RegisterGlobalFilters(GlobalFilters
.Filters)
RouteConfig
.RegisterRoutes(RouteTable
.Routes)
BundleConfig
.RegisterBundles(BundleTable
.Bundles)
ThreadPool
.QueueUserWorkItem(o =>
{
while (true)
{
if (MyErrorAttribute
.ExceptionQueue.Count >
0)
{
Exception ex = MyErrorAttribute
.ExceptionQueue.Dequeue()
if (ex != null)
{
ILog logger = LogManager
.GetLogger(
"testError")
logger
.Error(ex
.ToString())
}
else
{
Thread
.Sleep(
50)
}
}
else
{
Thread
.Sleep(
50)
}
}
})
}
10、故意添加一个测试控制器方法 ActionResult
public ActionResult
TestLog()
{
int result =
0;
int x =
1, y =
0;
result = x / y;
return View();
}
在浏览器访问后会在App_Data目录下生成日志文件
----------------------header-------------------------
2017-
07-
10 22:
30:
50,
280 [
9] ERROR testError - System
.DivideByZeroException: 尝试除以零。
在 Log4NetDemo
.Controllers.HomeController.TestLog() 位置 c:\Users\
22475\Documents\Visual Studio
2013\Projects\Log4NetDemo\Log4NetDemo\Controllers\HomeController
.cs:行号
16
在 lambda_method(Closure , ControllerBase , Object[] )
在 System
.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
在 System
.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`
2 parameters)
在 System
.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`
2 parameters)
在 System
.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41()
在 System
.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`
1.<BeginSynchronous>b__7(IAsyncResult _)
在 System
.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`
1.End()
在 System
.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
在 System
.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33()
在 System
.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
在 System
.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult)
在 System
.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`
1.End()
在 System
.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult)
在 System
.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<>c__DisplayClass2a.<BeginInvokeAction>b__20()
在 System
.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult)
在 System
.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`
1.End()
在 System
.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult)
在 System
.Web.Mvc.Controller.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult)
在 System
.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar)
在 System
.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`
1.End()
在 System
.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)
在 System
.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar)
在 System
.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`
1.End()
在 System
.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult)
在 System
.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult)
在 System
.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult)
在 System
.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar)
在 System
.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`
1.End()
在 System
.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
在 System
.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
在 System
.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
在 System
.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)