将Error异常日志从普通日志中剥离

简介:   开发过程中经常需要调试和线上环境查看异常日志的需求,但普通消息与异常消息混在一起实在是非常难得找,上则NM的文档够你头痛,所以就将Error级别的日志抽离出来。   本示例采用log4net来配置:   1、先配置web.

  开发过程中经常需要调试和线上环境查看异常日志的需求,但普通消息与异常消息混在一起实在是非常难得找,上则NM的文档够你头痛,所以就将Error级别的日志抽离出来。

  本示例采用log4net来配置:

  1、先配置web.config,添加:

<configSections>
    <!-- 添加log4net配置节 -->
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"></section>
  </configSections>

  2、在<configuration>直接下级添加:

<log4net>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Log/" />
      <param name="AppendToFile" value="true" />
      <param name="MaxSizeRollBackups" value="10" />
      <param name="StaticLogFileName" value="false" />
      <param name="DatePattern" value="yyyy-MM-dd'.txt'" />
      <param name="RollingStyle" value="Date" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss:fff} [%thread] %-5level %logger %ndc - %message%newline" />
      </layout>
    </appender>
    <appender name="ErrorLogAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Log/" />
      <param name="AppendToFile" value="true" />
      <param name="MaxSizeRollBackups" value="10" />
      <param name="StaticLogFileName" value="false" />
      <param name="DatePattern" value="yyyy-MM-dd'-error.txt'" />
      <param name="RollingStyle" value="Date" />
      <layout type="log4net.Layout.PatternLayout">
        <!--输出格式-->
        <param name="ConversionPattern" value="%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" />
      </layout>
    </appender>
    <root>
      <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
      <level value="INFO" />
      <appender-ref ref="RollingLogFileAppender" />
      <level value="ERROR" />
      <appender-ref ref="ErrorLogAppender" />
    </root>

<logger additivity="true" name="InfoLog">
<level value="INFO" />
<appender-ref ref="RollingLogFileAppender" />
</logger>
<logger additivity="true" name="ErrorLog">
<level value="ERROR" />
<appender-ref ref="ErrorLogAppender" />
</logger>

  </log4net>

  注意高亮处

  InfoLog中配置 INFO ,只记录INFO

  ErrorLog中 <level value="ERROR" /> 从ERROR级别开始。

  这样就可以将ERROR抽离出来。

  3、定义日志类LogHelper

 public static class LogHelper
    {
        static ILog _logdebug = LogManager.GetLogger("Debug");
        static ILog _loginfo = LogManager.GetLogger("InfoLog");
        static ILog _logwarn = LogManager.GetLogger("Warn");
        static ILog _logerror = LogManager.GetLogger("ErrorLog");
        static ILog _logfatal = LogManager.GetLogger("Fatal");
        static LogHelper()
        {
            log4net.Config.XmlConfigurator.Configure();
        }

        public static void Info(string msg)
        {
            _loginfo.Info(msg);
        }

        public static void Warn(string msg)
        {
            _logwarn.Warn(msg);
        }

        public static void Error(string msg)
        {
            _logerror.Error(msg);
        }
        public static void Error(string errtitle, Exception ex)
        {
            _logerror.Error(errtitle, ex);
        }
        public static void Fatal(string msg)
        {
            _logfatal.Fatal(msg);
        }
    }

  4、使用

LogHelper.Info("内容不正确");
LogHelper.Error("Post方法运行错误", ex);

最终会出现两个文件且error记录都在error中info中无error记录:

 

========================这是个害羞的分割线============================

后面经过测试发现按照之前的配置Info信息被过滤掉了,只生成了普通日志文件,但内容为空,因此配置有问题,改配置。

去掉两个append中的 filter。

去掉root中的内容。

添加两个logger。

 

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
10月前
FeignClient打印请求失败的日志,打印所有feignCliet接口请求失败的错误日志,方便排查原因
FeignClient打印请求失败的日志,打印所有feignCliet接口请求失败的错误日志,方便排查原因
87 0
|
5天前
|
Java
log4j异常日志过滤规则配置
log4j异常日志过滤规则配置
100 0
|
Java
线上异常日志没有堆栈信息
只能在本地调试查找异常位置,但是在本地调试过程中却可以打印异常堆栈的。后来继续查找之前的日志,之前的某段时间这个地方是存在异常堆栈信息的。
231 0
PHP异常getTrace(): 获取异常的跟踪信息。是干什么的?
PHP异常getTrace(): 获取异常的跟踪信息。是干什么的?
364 0
|
监控 小程序 JavaScript
别再乱打日志了,这样才是定位 bug 打日志的方式!
别再乱打日志了,这样才是定位 bug 打日志的方式!
|
Arthas SQL 缓存
获取异常信息里再出异常就找不到日志了
获取异常信息里再出异常就找不到日志了
获取异常信息里再出异常就找不到日志了
|
Arthas SQL 监控
动态修改LOGGER日志级别
大多数情况下,我们会在打印日志时定义日志的LOGGER级别,用来控制输出的信息范围。 一方面,过多的输出会影响查看日志的效率,另一方面,过少的日志让问题定位变得困难。 但当线上出现问题时,线上容器通常定义在info级别,发生一些疑难问题时,光靠info级别的日志很难定位问题。 一个典型的场景:在一些需要打印MySQL语句的场景,如果你正在使用MyBatis框架,由于MyBaits中SQL语句是DEBUG级别的信息,通常在线上容器就没法看到。
577 1
|
前端开发 Java
Logback 日志添加请求唯一追踪 ID
日志是排查问题的重要依据,但有时日志太多也不容易定位报错信息,不明确哪条日志信息对应哪次请求。如果能给每一个请求的执行链上的所有打印日志加上唯一的追踪标识 ID,那么排查就方便多了。
1061 0
|
存储 Java 应用服务中间件
SpringBoot 如何在日志中增加 trace id 用于链路追踪
SpringBoot 如何在日志中增加 trace id 用于链路追踪
4900 0
SpringBoot 如何在日志中增加 trace id 用于链路追踪
|
存储 移动开发