• springboot使用log4j2代替内置log4j


    前言

    • log4j是apache实现的一个开源日志组件
    • logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现
    • log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活

    slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log4j、logback),使用接口的好处是当项目需要更换日志框架的时候,只需要更换jar和配置,不需要更改相关java代码

    log4j、logback、log4j2都是一种日志具体实现框架,所以既可以单独使用也可以结合slf4j一起搭配使用。

    使用Log4j2

    • 在pom文件中排除掉spring-boot-starter-web下的spring-boot-starter-logging依赖,并添加log4j2依赖,如下:
              <!--排除依赖-->
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-web</artifactId>
                  <exclusions>
                      <exclusion>
                          <artifactId>spring-boot-starter-logging</artifactId>
                          <groupId>org.springframework.boot</groupId>
                      </exclusion>
                  </exclusions>
              </dependency>
              <!--添加依赖-->
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-log4j2</artifactId>
              </dependency>
    • 在resources新增log4j2.xml配置文件
      <?xml version="1.0" encoding="UTF-8"?>
      <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
      <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出,默认是OFF-->
      <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
      <configuration status="WARN" monitorInterval="30">
          <Properties>
              <!--自定义一些常量,之后使用${变量名}引用-->
              <Property name="logFilePath">./applogs</Property>
          </Properties>
          <!--定义所有的appender-->
          <!--appenders:定义输出内容,输出格式,输出方式,日志保存策略等,常用其下三种标签[console,File,RollingFile]-->
          <appenders>
              <!--console :控制台输出的配置-->
              <console name="Console" target="SYSTEM_OUT">
                  <!--设置控制台打印级别-->
                  <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
                  <!--PatternLayout :输出日志的格式,LOG4J2定义了输出代码,详细解释见下文-->
                  <!--<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5level %logger{36} %M [%L] - %msg%n"/>-->
                  <!--<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss.SSS} %-5p %processId -&#45;&#45; [%t] - %logger - %m%n"/>-->
                  <PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss}] [%t] %-5p - %-40.40logger{39} - %m%n"/>
              </console>
      
              <!--File :同步输出日志到本地文件-->
              <!--append="false":这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
              <File name="log" fileName="${logFilePath}/log_all.log" append="false">
                  <PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss}] [%t] %-5p - %l - %m%n"/>
              </File>
      
              <!--SMTP :邮件发送日志-->
              <!--<SMTP name="Mail" subject="****SaaS系统正式版异常信息" to="message@message.info" from="message@lengjing.info" smtpUsername="message@message.info"
                    smtpPassword="LENG****1234" smtpHost="mail.lengjing.info" smtpDebug="false" smtpPort="25" bufferSize="10">
                  <PatternLayout pattern="[%-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n"/>
              </SMTP>-->
              <!-- ${sys:user.home} windows下指C:Users用户名logs路径 -->
              <!-- 这个会打印出所有的debug及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
              <RollingFile name="RollingFileDebug" fileName="${logFilePath}/log_debug.log"
                           filePattern="${logFilePath}/debug/debug-%d{yyyy-MM-dd-HH-mm}-%i.log">
                  <!--ThresholdFilter :日志输出过滤-->
                  <!--level="info" :日志级别,onMatch="ACCEPT" :级别在info之上则接受,onMismatch="DENY" :级别在info之下则拒绝-->
                  <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
                  <PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss}] [%t] %-5p - %l - %m%n"/>
                  <!-- Policies :日志滚动策略-->
                  <Policies>
                      <!--关键点在于 filePattern后的日期格式,以及TimeBasedTriggeringPolicy的interval,日期格式精确到哪一位,interval也精确到哪一个单位-->
                      <!-- TimeBasedTriggeringPolicy :时间滚动策略,每一天生成一个新的文件, modulate="true" : 产生文件是否以0点偏移时间-->
                      <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                      <!-- SizeBasedTriggeringPolicy :文件大小滚动策略-->
                      <SizeBasedTriggeringPolicy size="100MB"/>
                  </Policies>
                  <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
                  <DefaultRolloverStrategy max="20"/>
              </RollingFile>
              <RollingFile name="RollingFileInfo" fileName="${logFilePath}/log_info_now.log"
                           filePattern="${logFilePath}/info/info-%d{yyyy-MM-dd-HH-mm}-%i.log">
                  <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
                  <PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss}] [%t] %-5p - %l - %m%n"/>
                  <Policies>
                      <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                      <SizeBasedTriggeringPolicy size="100 MB"/>
                  </Policies>
                  <DefaultRolloverStrategy max="20"/>
              </RollingFile>
              <RollingFile name="RollingFileWarn" fileName="${logFilePath}/log_warn_now.log"
                           filePattern="${logFilePath}/warn/warn-%d{yyyy-MM-dd-HH-mm}-%i.log">
                  <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
                  <PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss}] [%t] %-5p - %l - %m%n1"/>
                  <Policies>
                      <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                      <SizeBasedTriggeringPolicy size="100 MB"/>
                  </Policies>
                  <DefaultRolloverStrategy max="20"/>
              </RollingFile>
              <RollingFile name="RollingFileError" fileName="${logFilePath}/log_error_now.log"
                           filePattern="${logFilePath}/error/error-%d{yyyy-MM-dd-HH-mm}-%i.log">
                  <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
                  <PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss}] [%t] %-5p - %l - %m%n"/>
                  <Policies>
                      <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                      <SizeBasedTriggeringPolicy size="100 MB"/>
                  </Policies>
                  <DefaultRolloverStrategy max="20"/>
              </RollingFile>
          </appenders>
          <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
          <loggers>
              <!-- Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出 -->
              <root level="info">
                  <appender-ref ref="Console"/>
                  <appender-ref ref="log"/>
                  <appender-ref ref="RollingFileDebug"/>
                  <appender-ref ref="RollingFileInfo"/>
                  <appender-ref ref="RollingFileWarn"/>
                  <appender-ref ref="RollingFileError"/>
              </root>
              <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
              <!--Logger节点用来单独指定日志的形式,name为包路径,比如要为org.springframework包下所有日志指定为INFO级别等。 -->
              <logger name="org.springframework" level="INFO"/>
              <logger name="org.mybatis" level="INFO"/>
              <!--log4j2 自带过滤日志-->
              <Logger name="org.apache.catalina.startup.DigesterFactory" level="error"/>
              <Logger name="org.apache.catalina.util.LifecycleBase" level="error"/>
              <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn"/>
              <logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
              <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn"/>
              <Logger name="org.crsh.plugin" level="warn"/>
              <logger name="org.crsh.ssh" level="warn"/>
              <Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error"/>
              <Logger name="org.hibernate.validator.internal.util.Version" level="warn"/>
              <logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="warn"/>
              <logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
              <logger name="org.thymeleaf" level="warn"/>
              <!--AsyncLogger :异步日志,LOG4J有三种日志模式,全异步日志,混合模式,同步日志,性能从高到底,线程越多效率越高,也可以避免日志卡死线程情况发生-->
              <!--additivity="false" : additivity设置事件是否在root logger输出,为了避免重复输出,可以在Logger 标签下设置additivity为”false”-->
              <!--        <AsyncLogger name="AsyncLogger" level="trace" includeLocation="true" additivity="false">
                          <appender-ref ref="RollingFileError"/>
                      </AsyncLogger>-->
          </loggers>
      </configuration>
    • 再在SpringBoot配置文件中引入该配置
      logging:
        config: classpath:log4j2.xml
      

        

     
  • 相关阅读:
    linux内核中如何访问寄存器?
    uboot加载itb文件后提示"ERROR: new format image overwritten"如何处理?
    如何单独编译Linux内核源码中的驱动为可加载模块?
    openwrt如何打开linux内核的CONFIG_DEVMEM选项?
    openwrt的shell下如何访问寄存器的内容?
    linux系统错误码大全
    第 3 章 文本元素
    第 2 章 基本格式
    第 1 章 HTML5 概述
    第 20 章 项目实战--案例和关于[7]
  • 原文地址:https://www.cnblogs.com/sueyyyy/p/13727489.html
Copyright © 2020-2023  润新知