SpringBoot 整合 log4j2 + 彩色打印

1.添加依赖

<!-- log4j2 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

<!-- 排除掉logging,不使用logback,改用log4j2 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2.新建log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
status 级别有8个:ALL,TRACE, DEBUG, INFO, WARN, ERROR ,FATAL,OFF。
是帮助开发者找错用的,它可以检测log4j 2的配置文件是否有错,也可以检测到死循环的logger
monitorInterval log4j2 自动检测配置文件的时间间隔(单位:秒)
-->
<configuration status="OFF" monitorInterval="30">

    <Properties>
        <!--
            日志输出格式,每个转换说明符以百分号(%)开头,'%'后面的转换字符有如下:
            p (level) 日志级别
            c(logger) Logger的Name
            C (class) Logger调用者的全限定类名
            d (date) 日期
            highlight 高亮颜色
            l (location) 调用位置
            L (line) 行号
            m (msg/message) 输出的内容
            M (methode) 调用方法 ***
            maker marker的全限定名
            n 输出平台相关的换行符,如'\n' '\r\n'
            pid (processId) 进程ID
            level (p)日志级别
            r JVM启动后经过的微秒
            t (tn/thread/threadName) 线程名称
            T (tid/threadId) 线程ID
            tp (threadPriority) 线程优先级
            x (NDC) 线程Context堆栈
            
            %5:若字符长度小于5,则右边用空格填充
            %-5若字符长度小于5,则左边用空格填充
            %.15:若字符长度超过15,截去多余字符,
            %15.15若字符长度小于5,则右边用空格填充;若字符长度超过15,截去多余字符
        -->
        <Property name="pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%6p} %style{%5pid}{bright,magenta} --- [%15.15t] %style{%-40.40logger{39}}{bright,cyan} : %m%n
        </Property>
        <Property name="LOG_HOME">F:\MAYUN\logs</Property>
        <property name="PROJECT_NAME" value="joker-cloud-lin" />
        <Property name="LOG_PATH">${LOG_HOME}/${PROJECT_NAME}</Property>
    </Properties>
    <Appenders>

        <!--
        设置在控制台打印日志
        将输出写到 System.err 或 System.out 。如果想将输出写到System.out,设置Console标签下的target为 SYSTEM_OUT ;
        如果想将输出写到System.err,设置Console标签下的target为 SYSTEM_ERR
        -->
        <!--设置在控制台打印日志-->
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${pattern}"/>
        </Console>

        <!--
            设置级别为 DEBUG 日志输出到 debug.log 中
            日志写入策略 immediateFlush log4j2接收到日志事件时,是否立即将日志刷到磁盘。默认为true 。
            异步日志将会自动批量刷新到磁盘,所以这里设置为false
        -->
        <!--设置级别为 DEBUG 日志输出到 debug.log 中-->
        <RollingRandomAccessFile name="debug"
                                 immediateFlush="false"
                                 fileName="${LOG_PATH}/debug.log"
                                 filePattern="${LOG_PATH}/debug-%d{yyyy-MM-dd}.log">
            <Filters>
                <!--设置只输出级别为 debug 的日志-->
                <ThresholdFilter level="DEBUG"/>
                <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="${pattern}"/>
            <Policies>
                <!--
                    根据时间生成日志文件
                    单位:以文件命名中的时间精度来确定单位。比如 yyyy-MM-dd 单位为天,yyyy-MM-dd-HH 单位为小时
                    interval:时间间隔
                -->
                <!-- 按天生成日志文件-->
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
            </Policies>
            <!-- 最多保存日志文件的数目 -->
            <DefaultRolloverStrategy max="15"/>
        </RollingRandomAccessFile>
        <RollingRandomAccessFile name="info"
                                 immediateFlush="false"
                                 fileName="${LOG_PATH}/info.log"
                                 filePattern="${LOG_PATH}/info-%d{yyyy-MM-dd}.log">
            <Filters>
                <ThresholdFilter level="INFO"/>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>

            </Filters>
            <PatternLayout pattern="${pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
            </Policies>
            <DefaultRolloverStrategy max="60"/>
        </RollingRandomAccessFile>
        <RollingRandomAccessFile name="warn"
                                 immediateFlush="false"
                                 fileName="${LOG_PATH}/warn.log"
                                 filePattern="${LOG_PATH}/warn-%d{yyyy-MM-dd}.log">
            <Filters>
                <ThresholdFilter level="WARN"/>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="${pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
            </Policies>
            <DefaultRolloverStrategy max="60"/>
        </RollingRandomAccessFile>
        <RollingRandomAccessFile name="error"
                                 immediateFlush="false"
                                 fileName="${LOG_PATH}/error.log"
                                 filePattern="${LOG_PATH}/error-%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="${pattern}"/>
            <Filters>
                <ThresholdFilter level="ERROR"/>
            </Filters>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
            </Policies>
            <DefaultRolloverStrategy max="60"/>
        </RollingRandomAccessFile>
        <!-- 设置 task_suc 日志 -->
        <RollingRandomAccessFile name="task_suc"
                                 immediateFlush="false"
                                 fileName="${LOG_PATH}/task_suc.log"
                                 filePattern="${LOG_PATH}/task_suc-%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="${pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
            </Policies>
            <DefaultRolloverStrategy max="90"/>
        </RollingRandomAccessFile>
        <!-- 设置 task_fail 日志 -->
        <RollingRandomAccessFile name="task_fail"
                                 immediateFlush="false"
                                 fileName="${LOG_PATH}/task_fail.log"
                                 filePattern="${LOG_PATH}/task_fail-%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="${pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
            </Policies>
            <DefaultRolloverStrategy max="90"/>
        </RollingRandomAccessFile>
    </Appenders>


    <!--共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
           All:最低等级的,用于打开所有日志记录.
           Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出.
           Debug:指出细粒度信息事件对调试应用程序是非常有帮助的.
           Info:消息在粗粒度级别上突出强调应用程序的运行过程.
           Warn:输出警告及warn以下级别的日志.
           Error:输出错误信息日志.
           Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志.
           OFF:最高等级的,用于关闭所有日志记录-->

    <Loggers>
        <Logger name="com.joker.cloud.linserver" level="info" additivity="true">
            <AppenderRef ref="debug"/>
            <AppenderRef ref="info"/>
            <AppenderRef ref="warn"/>
            <AppenderRef ref="error"/>
        </Logger>
        <!-- org.springframework 只输出 ERROR 级别以上的日志 -->
        <Logger name="org.springframework" level="ERROR"/>
        <!-- org.apache 只输出 ERROR 级别以上的日志 -->
        <Logger name="org.apache" level="ERROR"/>
        <!-- task_suc 日志 -->
        <Logger name="task_suc" additivity="true">
            <AppenderRef ref="task_suc"/>
        </Logger>
        <!-- task_fail 日志 -->
        <Logger name="task_fail" additivity="true">
            <AppenderRef ref="task_fail"/>
        </Logger>
        <Root level="Debug">
            <AppenderRef ref="console"/>
        </Root>
    </Loggers>
</configuration>

3 常见日志格式模板:

springboot默认的日志格式

%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:-} [%15.15t] %-40.40logger{39} : %m%n

logback默认的日志格式

%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

lishuoboy推荐日志格式

%d{MM-dd HH:mm:ss.SSS} [%5level] %4line %40.40logger{39}.%-30.30method : %m%n

4 控制台彩色

IDEA控制台没有打印彩色日志的主要原因在于Log4j 2.10版本以后Log4j2默认关闭了Jansi(一个支持输出ANSI颜色的类库)

修改参数:

修改jvm参数 -Dlog4j.skipJansi=false

修改yml:

spring:
    output:
        ansi:
            enabled: always

设置颜色参数:

官方文档: https://logging.apache.org/log4j/2.x/manual/layouts.html

%style 和{bright,green} 结合表示展示颜色

%highlight 高亮

5.我的样式( springBoot 默认格式 + 颜色 )


%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%6p} %style{%5pid}{bright,magenta} --- [%15.15t] %style{%-40.40logger{39}}{bright,cyan}: %m%n

按照springBoot 默认格式 + 添加颜色

效果如下:

6.可能出现的问题:

启动报 logback 与 log4j-slf4j-impl 冲突

可在pom.xml文件中右击鼠标 打开依赖关联视图

Ctrl + F 搜索冲突的 logBack 依赖

选中依赖后右击鼠标 点击 exclude 重启即可

 

 

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值