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
    

      

 
posted @ 2020-09-25 00:05  少说点话  阅读(2316)  评论(0编辑  收藏  举报
网站运行: