SpringBoot配置logback.xml,控制台设置彩色字体,按日志级别划分log文件

欢迎阅读另一篇关于SpringBoot中日志的文章 SpringBoot动态修改日志级别
本文基于SpringBoot2.6讲解
本文内容:

  1. 按照日志级别输出到不同日志文件
  2. 控制台日志设置和SpringBoot同风格彩色字体样式
  3. 指定该包下的日志都打印在customAppender中指定的文件路径
  4. 启动后不变的日志打印到单独的包,例如环境变量打印到environment.log中
  5. 按照springboot环境配置日志

初始化一个SpringBoot后启动项目,控制台会带有彩色日志样式.但是当我们配置了自己的logback-spring.xml日志文件时,样式可能就不存在了,console控制台变成了黑白屏。
其实彩色日志样式是SpringBoot自己做了特殊处理,实现了Logback的conversionRule,源码参见:org.springframework.boot.logging.logback.DefaultLogbackConfiguration
我们可以直接在logback-spring.xml中使用SpringBoot实现的conversionRule,让console日志变成彩屏。

logback-spring.xml中如下几个参数

CONSOLE_LOG_PATTERN
FILE_LOG_PATTERN
LOG_DATEFORMAT_PATTERN
LOG_LEVEL_PATTERN
LOG_EXCEPTION_CONVERSION_WORD
LOG_PATH
CONSOLE_LOG_CHARSET
FILE_LOG_CHARSET

对应SpringBoot的几个配置

logging.pattern.console=
logging.pattern.file=
logging.pattern.level=
logging.pattern.dateformat=
logging.exception-conversion-word=
logging.file.path=logs
logging.charset.console=UTF-8
logging.charset.file=UTF-8

logback-spring.xml放到resources目录即可被SpringBoot识别

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

    <!--自定义日志文件格式,支持控制台彩色字体,参见org.springframework.boot.logging.logback.DefaultLogbackConfiguration-->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>

    <!--这几个属性SpringBoot会设置到SystemProperty,参考o.s.b.logging.LoggingSystemProperties.apply-->
    <property name="LOG_HOME" value="${LOG_PATH:-logs}"/>
    <property name="FILE_LOG_CHARSET" value="${FILE_LOG_CHARSET:-UTF-8}"/>
    <property name="CONSOLE_LOG_CHARSET" value="${CONSOLE_LOG_CHARSET:-UTF-8}"/>
    <!--<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:- } [%t] %-40.40logger{39} : %m%n%wEx"/> -->
    <property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } [%t] %-40.40logger{39} %-4line : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>


    <!-- 所有级别日志都在控制台输出 -->
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d{yyyy-MM-dd HH:mm:ss.SSS}表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
            <pattern><![CDATA[${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(%-4L) %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}]]></pattern>
            <charset>${CONSOLE_LOG_CHARSET}</charset>
        </encoder>
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">-->
        <!--    <level>INFO</level>-->
        <!--    <onMatch>ACCEPT</onMatch>-->
        <!--    <onMismatch>ACCEPT</onMismatch>-->
        <!--</filter>-->
    </appender>

    <!-- debug级别日志,按天生成日志文件 -->
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/debug.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/debug.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxHistory>5</MaxHistory>
            <maxFileSize>100MB</maxFileSize>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>${FILE_LOG_CHARSET}</charset>
        </encoder>
        <!--<filter class="com.bruce.kafka.log.LevelAndNameFilter">-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- info级别日志,按天生成日志文件 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxHistory>5</MaxHistory>
            <maxFileSize>100MB</maxFileSize>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>${FILE_LOG_CHARSET}</charset>
        </encoder>
        <!--自定义filter,让environment日志不在info.log文件中打印-->
        <!--<filter class="com.bruce.kafka.log.LevelAndNameFilter">-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- warn error级别日志,按天生成日志文件 -->
    <appender name="WARN_ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/warn-error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/warn-error.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxHistory>5</MaxHistory>
            <maxFileSize>100MB</maxFileSize>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>${FILE_LOG_CHARSET}</charset>
        </encoder>
        <!-- 允许打印警告日志到文件的过滤器 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <!-- ACCEPT:日志会被立即处理,不再经过剩余过滤器-->
            <!-- NEUTRAL:有序列表里的下个过滤器过接着处理日志-->
            <onMatch>ACCEPT</onMatch>
            <onMismatch>NEUTRAL</onMismatch>
        </filter>
        <!-- 允许打印错误日志到文件的过滤器 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- DENY:日志将立即被抛弃不再经过其他过滤器-->
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="Console"/>
        <!--<appender-ref ref="DEBUG_FILE"/>-->
        <appender-ref ref="INFO_FILE"/>
        <appender-ref ref="WARN_ERROR_FILE"/>
    </root>


    <appender name="environmentAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/environment.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/environment.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxHistory>5</MaxHistory>
            <maxFileSize>100MB</maxFileSize>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:- } [%t] %-10.40logger{39} : %m%n%wEx</pattern>
            <charset>${FILE_LOG_CHARSET}</charset>
        </encoder>
    </appender>

    <!--additivity设为false,让Logger只会在自己的appender里输出,不会在root的logger的appender里输出,
         所以Console Appender无法拦截到,控制台也不会打印日志-->
    <logger name="environment" level="INFO" additivity="false">
        <appender-ref ref="environmentAppender"/>
    </logger>

    <appender name="customAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/custom.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/custom.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxHistory>5</MaxHistory>
            <maxFileSize>100MB</maxFileSize>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>${FILE_LOG_CHARSET}</charset>
        </encoder>
    </appender>

    <!--指定该包下的日志都打印在customAppender中指定的文件路径-->
    <logger name="com.bruce.kafka">
        <appender-ref ref="customAppender"/>
    </logger>

</configuration>

environment 日志配置的使用
通过LoggerFactory获取名称为environment的Logger对象即可

@SpringBootApplication
public class KafkaProducerApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(KafkaProducerApplication.class, args);

        Logger envLogger = LoggerFactory.getLogger("environment");

        ConfigurableEnvironment environment = context.getEnvironment();
        MutablePropertySources propertySources = environment.getPropertySources();

        for (PropertySource<?> propertySource : propertySources) {
            envLogger.info(propertySource.getName());
        }

        for (PropertySource<?> propertySource : propertySources) {
            if (propertySource instanceof EnumerablePropertySource) {
                EnumerablePropertySource<?> enumerablePropertySource = (EnumerablePropertySource<?>) propertySource;
                String[] propertyNames = enumerablePropertySource.getPropertyNames();
                for (String propertyName : propertyNames) {
                    envLogger.info("[{}] {} = {}", propertySource.getName(), propertyName, enumerablePropertySource.getProperty(propertyName));
                }
            }
        }

    }
}

在这里插入图片描述
如果想让environment中的日志在控制台展示,但不输入到info.log, warn-error.log中,可以将additivity设置为true,并在INFO, WARN-ERROR appender中使用自定义的Filter,过滤掉LoggerName为environment的日志. 参见: ch.qos.logback.classic.filter.LevelFilter

/**
 * Created by bruce on 2021/11/30 20:05
 */
public class LevelAndNameFilter extends AbstractMatcherFilter<ILoggingEvent> {

    Level level;

    @Override
    public FilterReply decide(ILoggingEvent event) {
        if (!isStarted()) {
            return FilterReply.NEUTRAL;
        }

        if (event.getLoggerName().equals("environment")){
            return onMismatch;
        }

        if (event.getLevel().equals(level)) {
            return onMatch;
        } else {
            return onMismatch;
        }
    }

    public void setLevel(Level level) {
        this.level = level;
    }

    public void start() {
        if (this.level != null) {
            super.start();
        }
    }
}

按照SpringBoot环境配置日志

  <!-- 不同环境日志输出设置 -->
 <springProfile name="default">
      <root level="debug">
          <appender-ref ref="Console"/>
          <appender-ref ref="DEBUG_FILE"/>
          <appender-ref ref="INFO_FILE"/>
          <appender-ref ref="WARN_ERROR_FILE"/>
      </root>
  </springProfile>

  <springProfile name="fat | uat">
      <root level="info">
          <appender-ref ref="DEBUG_FILE"/>
          <appender-ref ref="INFO_FILE"/>
          <appender-ref ref="WARN_ERROR_FILE"/>
      </root>
  </springProfile>

  <springProfile name="pro">
      <root level="warn">
          <appender-ref ref="WARN_ERROR_FILE"/>
      </root>
  </springProfile>

当应用不以SpringBoot方式启动,仅仅作为一个普通main时,发现控制台彩色日志没有了,此时需要手动调用

AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS);
public static void main(String[] args) {
     System.setProperty("java.awt.headless", "true");
     AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS);

    //SpringApplication.run(NettyHttp2Application.class, args);

    Http2Server http2Server = new Http2Server();
    http2Server.start(8443);
}

最少依赖为

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot</artifactId>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!--只是在调用AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS);有个校验被用到-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Spring Boot项目的logback.xml配置,可以按照以下步骤进行设置: 1. 在src/main/resources目录下创建logback.xml文件。 2. 在logback.xml文件中,首先需要引入logback的命名空间和标签,例如: ``` <configuration xmlns="http://ch.qos.logback/xml/ns/logback" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ch.qos.logback/xml/ns/logback http://ch.qos.logback/xml/ns/logback/logback.xsd"> ``` 3. 设置日志输出的级别,可以使用`<root>`标签设置全局的日志级别,例如: ``` <root level="INFO"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> </root> ``` 4. 配置日志输出的格式,使用`<pattern>`标签设置输出格式的模式,例如: ``` <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread %-5level %logger{36} - %msg%n</pattern> ``` 5. 配置日志输出的目标,可以使用`<appender>`标签配置输出到控制台文件,例如: ``` appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>logs/myapp.log</file> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> ``` 6. 配置日志文件的滚动策略,可以使用`<rollingPolicy>`标签配置日志文件的滚动策略,例如: ``` <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/myapp.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/myapp-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> ``` 7. 配置日志的异步输出,可以使用`<asyncAppender>`标签配置日志的异步输出,例如: ``` <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> </appender> <root level="INFO"> <appender-ref ref="ASYNC"/> </root> ``` 8. 结束配置文件,使用`</configuration>`标签结束配置文件。 以上是一般的logback.xml配置示例,您可以根据项目的具体需求进行调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Springboot logback.xml配置详解](https://blog.csdn.net/zch981964/article/details/129085279)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值