log4j2 使用

1、pom 依赖

    <dependencies>
        <dependency>
            <artifactId>log4j-slf4j-impl</artifactId>
            <groupId>org.apache.logging.log4j</groupId>
            <version>2.19.0</version>
        </dependency>
    </dependencies>

log4j-slf4j-impl 已经依赖了 log4j-api, log4j-core 两个依赖
image

这里为了使用 slf4j做日志门面,所以直接用了 log4j-slf4j-impl,其它做法可以直接引入 log4j-api 和 log4j-core 包也是一样的效果


比如,如果不想用 slf4j,那依赖是这样子的
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.19.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.19.0</version>
    </dependency>

但使用 slf4j 和直接使用 log4j, 在使用上有区别的:

  • 使用 slf4j:
    Logger log = LoggerFactory.getLogger(Tank.class);
    (推荐使用 slft4j, 它是日志的门面,底层实现可以使用 log4j,也可以使用 logback,特别对于写公共模块更为重要)

  • 使用 log4j2
    Logger log = LogManager.getLogger(Tank.class);

log4j2.xml 模板

(只引入依赖,没有配置 log4j2.xml 模板是不行的~ 然后,把这个 log4j2.xml 文件放到 resources 下面即可。 文件名也要用 log4j2.xml, 如果用了log4j.xml 貌似是不行的,当然,如果模板用错了,也会报错~)

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出 -->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数 -->

<configuration status="WARN" monitorInterval="10">

    <Properties>
        <Property name="LOG_HOME">./logs</Property>
        <Property name="MODLUE_NAME">algo-module</Property>
        <Property name="INFO_FILE_NAME">${MODLUE_NAME}_info.log</Property>
        <Property name="INFO_ARCHIVE_NAME">${MODLUE_NAME}_info_%d{yyyyMMdd}.log
        </Property>
        <Property name="ERROR_FILE_NAME">${MODLUE_NAME}_error.log</Property>
        <Property name="ERROR_ARCHIVE_NAME">${MODLUE_NAME}_error_%d{yyyyMMdd}.log
        </Property>
        <property name="BUFFER_SIZE">524288</property>
        <property name="ROLLING_INTERVAL">1</property>

    </Properties>
    <!--先定义所有的appender -->
    <appenders>
        <!--这个输出控制台的配置 -->
        <console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式 -->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss}|%c|%msg%n"/>
            <Filters>
                <ThresholdFilter level="debug" onMatch="ACCEPT"
                                 onMismatch="DENY"/>
            </Filters>
        </console>
        <RollingRandomAccessFile name="RollingFileInfo"
                                 fileName="${LOG_HOME}/${INFO_FILE_NAME}"
                                 filePattern="${LOG_HOME}/${INFO_ARCHIVE_NAME}"
                                 immediateFlush="true" bufferSize="${BUFFER_SIZE}" append="true">

            <PatternLayout>
                <pattern>${sys:log_prefix:-}%d{yyyyMMddHHmmss}|${LOG_CODE}|%-level|%c|%msg%n
                </pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="${ROLLING_INTERVAL}"
                                           modulate="true"/>
            </Policies>
            <!-- 只记录info和warn级别信息 -->
            <Filters>
                <!-- DENY 不容许error级别以上写入该文件 NEUTRAL 中立, 上下两个条件组合,取中间值 -->
                <!-- <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL" /> -->
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>

        </RollingRandomAccessFile>

        <!--immediateFlush 是否立即写入, bufferSize 缓存大小 -->
        <RollingRandomAccessFile name="RollingFileError"
                                 fileName="${LOG_HOME}/${ERROR_FILE_NAME}"
                                 filePattern="${LOG_HOME}/${ERROR_ARCHIVE_NAME}"
                                 immediateFlush="true" bufferSize="${BUFFER_SIZE}" append="true">

            <PatternLayout>
                <pattern>${sys:log_prefix:-}%d{yyyyMMddHHmmss}|${LOG_CODE}|%-level|%c|%msg%n
                </pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="${ROLLING_INTERVAL}"
                                           modulate="true"/>
            </Policies>
            <!-- 只记录error以上级别信息 -->
            <Filters>
                <ThresholdFilter level="error" onMatch="ACCEPT"
                                 onMismatch="DENY"/>
            </Filters>
        </RollingRandomAccessFile>

    </appenders>

    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
    <loggers>
        <!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
        <logger name="org.mybatis" level="DEBUG"></logger>
        <root level="INFO">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>
</configuration>

log4j2.yml 模板

configutation:
  name: Default
  Properties:
    Property:
      - name: service-name
        value: task-service
      - name: log-path
        value: "logs"
      - name: console-pattern
        value: "%clr{[%X{TRACE_ID}] %d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %X{X-B3-TraceId} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n%xEx"
      - name: file-pattern
        value: "[%X{TRACE_ID}] %d{yyyy-MM-dd HH:mm:ss.SSS} %5p %X{X-B3-TraceId} --- [%15.15t] %-40.40c{1.}{cyan} : %m%n%xEx"
  Appenders:
    #输出到控制台
    Console:
      name: CONSOLE
      target: SYSTEM_OUT
      PatternLayout:
        pattern: ${console-pattern}
    # 输出到文件
    RollingFile:
      - name: FILE
        fileName: ${log-path}/${service-name}.log
        filePattern: "${log-path}/${service-name}.%d{yyyy-MM-dd}.log"
        PatternLayout:
          pattern: ${file-pattern}
        Policies:
          # 按时间做文件触发器,这个interval 是1 , 单位就得看 filePattern 这个配置的是什么,比如这里是 dd 即每一天一个名字,所以是一天一个文件
          # 如果filePatern 写的是 ${log-path}/${service-name}.%d{yyyy-MM-dd-HH}.log 那就是一个小时生成一个文件(HH是24小时制,hh是12小时制)
          TimeBasedTriggeringPolicy:
            interval: 1
          SizeBasedTriggeringPolicy:
            # 这个是文件大小做触发策略,单位可以配置 KB,MB,GB,嗯,这里10MB的意思是,如果一个文件大小超过10MB之后,会把旧数据抛弃掉,记录新数据,所以如果配置了这个,可能会把一些比较旧的日志数据丢弃掉,看实际业务需求吧
            size: 10MB
        DefaultRollOverStrategy:
          max: 30
  Loggers:
    Root:
      level: info
      AppenderRef:
        - ref: CONSOLE
        - ref: FILE
    Logger:
      - name: org.springframework.web.servlet.DispatcherServlet
        # additivity: false
        level: debug
        AppenderRef:
          - ref: FILE
          - ref: CONSOLE
      - name: com.carrot.demo
        # additivity: false
        level: info
        AppenderRef:
          - ref: FILE
          - ref: CONSOLE



记录一个小问题

  • 日志出现大量的 ESC符号,这个貌似是一个日志带样式的输出,解析不了还是啥的,所以就“乱码”了,比如刚才这个 log4j2.yml 的 pattern, 一个 console-pattern 会带着比较多的 %clr 的东西,效果就是日志有颜色区分,更加好看了。。。
    但是如果把这个带上到,使用 cat , more 去看的话,就会出现乱乱的字符问题。用 tail -f 貌似又不会有这样的问题。不过,总的来说,问题不大吧。也不会太在意。emmm。。。
posted @ 2022-12-03 15:50  aaacarrot  阅读(194)  评论(0编辑  收藏  举报