.net mvc配置log4net记录日志

先添加log4net.dll引用   通过NuGet来引入

先配置log4net 需要的配置文件,新建一个CfgFiles文件夹,添加一个web配置文件,该名为log4net.config   顺便在添加个Log文件夹用来放日志

log4net.config 内容如下

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <log4net>
    <!--OFF>FATAL>ERROR>WARN>INFO>DEBUG,ALL-->
    <root>
      <level value="ALL"/>
      <!--文件形式记录日志-->
      <appender-ref ref="SysAppender"/>
    </root>
    <logger name="WebLogger">
      <!--文件形式记录日志-->
      <level value="DEBUUG"/>
    </logger>
    <!--指定日志记录方式,以滚动文件的方式-->
    <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">
      <!--指定日志存放路径-->
      <param name="File" value="Log/" />
      <!--日志以追加的形式记录-->
      <param name="AppendToFile" value="true" />
      <param name="RollingStyle" value="Date" />
      <!--日志名称生成规则-->
      <param name="DatePatten" 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>

完成后在AssemblyInfo.cs文件里添加 [assembly:log4net.Config.XmlConfigurator(ConfigFile = @"CfgFiles/Log4net.config",ConfigFileExtension ="config",Watch =true)]

PS:因为日志存在并发问题,所以通过队列的方式来记录日志

我们在添加一个MyErrorAttribute.cs 用来处理异常并记录日志     它继承全局异常类HandleErrorAttribute

 public class MyErrorAttribute:HandleErrorAttribute
    {
        private static ILog log = LogManager.GetLogger(typeof(MyErrorAttribute));
        public static Queue<Exception> exceptions = new Queue<Exception>();
        public override void OnException(ExceptionContext filterContext)
        {
            exceptions.Enqueue(filterContext.Exception);
        ///出现异常,这里可以让系统跳转的友好页面
base.OnException(filterContext); } }

完成后,在FilterConfig类中修改系统默认的

 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //filters.Add(new HandleErrorAttribute());
            filters.Add(new MyErrorAttribute());//我们自己定义的
        }

然后在全局文件Global中的Start()方法添加

ThreadPool.QueueUserWorkItem(o=>
            {
                while (true)
                {
                    if (MyErrorAttribute.exceptions.Count > 0)
                    {
                        Exception ex = MyErrorAttribute.exceptions.Dequeue();
                        if (ex!=null)
                        {
                            ILog log = LogManager.GetLogger("Error");                           
                            log.Error(ex.ToString());
                        }
                        else
                        {
                            Thread.Sleep(50);
                        }
                    }
                    else
                    {
                        Thread.Sleep(50);
                    }
                }
            
            });

这样我们的日志基本完成,测试一下

Action中引发一个异常

 public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";
            int a = 0;
            int x = 1, y = 0;
            a = x / y;
            return View();
        }

访问一下About   后在Log文件夹下找日志文件

posted @ 2021-06-18 16:39  raccon2001  阅读(167)  评论(0)    收藏  举报