log4net在C# web开发中的使用(MVC)

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>
    <!-- Print only messages of level DEBUG or above in the packages -->
    <logger name="WebLogger">
      <!--这里进一步限制了日志级别,只有在大于等于DEBUG情况下才会记录日志-->
      <level value="DEBUG"/>
    </logger>
    <!--指定日志记录的方式:以滚动文件的方式-->
    <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net" >
      <!--指定日志存放的路径,这里放置到App_Data目录是为了安全-->
      <param name="File" value="App_Data/" />
      <!--日志以追加的形式记录-->
      <param name="AppendToFile" value="true" />
      <param name="RollingStyle" value="Date" />
      <!--设置日志文件名称的生成规则-->
      <param name="DatePattern" value="&quot;Logs_&quot;yyyyMMdd&quot;.txt&quot;" />
      <!--日志名称是否静态:否-->
      <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 HandleErrorAttribute());//注释掉系统默认的
        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()); //将异常信息写入Log4Net中  
                    }
                    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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值