zoukankan      html  css  js  c++  java
  • MDC到日志管理配置

    MDC是什么?

    第一次接触MDC,很蒙圈。看看导入的包import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.slf4j.MDC;它显然和日志管理有关。

    slf4j常用的日志接口有哪些?trace、debug、info、warn、error,再加上MDC.

    最常见的日志管理会采用这种方式:

    private static final Logger log = LoggerFactory.getLogger(类名.class);

    log.info();

    log.debug();

    log.trace();

    MDC.put()方法提供了日志输出功能,通过log4j2.xml的layout配置%X{ }即可获得日志,这种方式非常灵活,

    允许用户对任何对象进行日志管理。

    怎么为应用配置日志管理

           日志的输出格式:
            <property name="PATTERN">
                %X{logId},[%-5level],%d{yyyy-MM-dd HH:mm:ss.SSS},%t,%c{1}: %msg%n
            </property>
           解析:

    1.        %X{logId}----针对MDC.put("", "")方法。
    2.        [%-5level]----日志的级别
    3.        %d{yyyy-MM-dd HH:mm:ss.SSS}-----时间格式化
    4.        %t ----- 线程
    5.        %c{1} --- 类名
    6.        %msg --- 消息
    7.        %n ------换行

    看配置文件

     <?xml version="1.0" encoding="UTF-8"?>
    <!-- status="OFF",可以去掉,它的含义为是否记录log4j2本身的event信息,默认是OFF -->    
    <configuration>
        <properties>
            <!-- 文件输出格式 -->
            <property name="PATTERN">
                %X{logId},[%-5level],%d{yyyy-MM-dd HH:mm:ss.SSS},%t,%c{1}: %msg%n
            </property>
    
            <!-- 日志根路径 -->
            <property name="BASE_PATH">
                /applog/xxxlog
            </property>
    
            <!-- 应用名 -->
            <property name="APP_NAME">
                xxx-core
            </property>
    
            <!-- 日志文件名 -->
            <property name="LOG_FILE_NAME">
                ${BASE_PATH}/${APP_NAME}.log
            </property>
    
            <!-- 滚动日志文件生成规则 -->
            <property name="LOG_FILE_PATTERN">
                ${BASE_PATH}/${APP_NAME}_%d{yyyyMMddHHmm}-%i.log
            </property>
        </properties>
    
        <!-- xx报文日志级别 -->
        <DynamicThresholdFilter key="traceOpen" defaultThreshold="ERROR" onMatch="ACCEPT"
            onMismatch="NEUTRAL">
            <KeyValuePair key="yes" value="trace" />
        </DynamicThresholdFilter>
           
               <!-- 日志输出定义 -->
        <appenders>
            <!-- 滚动日志 -->
            <RollingFile name="rollingFileLog" filename="${LOG_FILE_NAME}" filePattern="${LOG_FILE_PATTERN}"
                append="true">
                <Filters>
                    过滤掉不符合日志级别的日志
                    <!-- <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL" /> -->
                     只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)
                    <!-- <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" /> -->
                </Filters>
                输出日志的格式
                <PatternLayout pattern="${PATTERN}" />
                <Policies>
                    <TimeBasedTriggeringPolicy />
                    <SizeBasedTriggeringPolicy size="20 MB" />
                </Policies>
                滚动日志的策略
                <DefaultRolloverStrategy max="50">
                    <Delete basePath="${BASE_PATH}/" maxDepth="2">
                        <IfFileName glob="${APP_NAME}_*.log" />
                        <!--! 这里的age必须和filePattern协调, 后者是精确到HH, 这里就要写成xH, xd就不起作用
                        另外, 数字最好>2, 否则可能造成删除的时候, 最近的文件还处于被占用状态,导致删除不成功!-->
                        <!--7天-->
                        <IfLastModified age="7d" />
                        <IfAny>
                            <IfAccumulatedFileSize exceeds="2 GB" />
                            <IfAccumulatedFileCount exceeds="100" />
                        </IfAny>
                    </Delete>
                </DefaultRolloverStrategy>
            </RollingFile>
                    <!-- 控制台 -->
            <Console name="console" target="SYSTEM_OUT">
                <PatternLayout pattern="${PATTERN}" />
            </Console>
        </appenders>
        
         <!-- 日志对象定义 -->
        <loggers>
            <!-- xx日志 -->
            <logger name="CoreframeInteractiveLogger" level="info" additivity="true">
                <AppenderRef ref="interactiveAppender" />
            </logger>
    
            <!-- xx日志 -->
            <logger name="CoreframeServiceMetricsLogger" level="info" additivity="true">
                <AppenderRef ref="serviceMetricsAppender" />
            </logger>
    
            <!-- 服务框架 -->
            <logger name="coreframe" level="info" />
    
            <!-- 应用处理日志 -->
            <logger name="Service" level="debug" />
            <logger name="" level="debug" />
    
            <!-- 测试日志 -->
            <logger name="test" level="trace" />
            <logger name="" level="trace" />
    
            <root level="info">
                <AppenderRef ref="console" />
                <AppenderRef ref="rollingFileLog" />
            </root>
        </loggers>
    
    </configuration>
  • 相关阅读:
    python计算机视觉项目实践
    Codeforces Round #256 (Div. 2) B (448B) Suffix Structures
    SonarLint插件的安装与使用
    后缀表达式求值
    有用代码段2
    提高Java代码质量的Eclipse插件之Checkstyle的使用具体解释
    Intellij Idea搭建Spark开发环境
    代码备忘, TODO宏实现
    浏览器自己主动填表安全漏洞:查看浏览器保存的password
    PDO 查询mysql返回字段整型变为String型解决方法
  • 原文地址:https://www.cnblogs.com/Lambquan/p/11892356.html
Copyright © 2011-2022 走看看