Logback 配置来客制化 Log 讯息吧

在 Spring boot 可以使用 Logback 进行配置,系统预设加载日志配置档案

  • logback-spring.xml
  • logback-spring.groovy
  • logback.xml
  • logback.groovy

为自己的环境配置有两种方法,如果只是简单的更改,则可以把属性添加到 application.properties 等配置属性档案中,或者对於更复杂的需求,可以使用 XMLGroovy 来指定设置。

在 Maven 环境中我们添加以下属性

        <!-- 整合 fluent         -->
        <dependency>
			<groupId>org.fluentd</groupId>
			<artifactId>fluent-logger</artifactId>
			<version>0.3.4</version>
		</dependency>
        <!-- 主要是这个         -->
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>1.2.3</version>
		</dependency>
		<!-- send to flunted -->
		<dependency>
			<groupId>com.sndyuk</groupId>
			<artifactId>logback-more-appenders</artifactId>
			<version>1.8.0</version>
		</dependency>
        <!-- 配置 Json         -->
		<dependency>
			<groupId>net.logstash.logback</groupId>
			<artifactId>logstash-logback-encoder</artifactId>
			<version>6.6</version>
		</dependency>

logback-classic 包含 logback-core 依赖关系,他们之间有着我们可以配置的属性。

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

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>
        %d{dd-MM-yyyy HH:mm:ss.SSS} %magenta([%thread]) %highlight(%-5level) %logger{36}.%M - %msg%n
      </pattern>
    </encoder>
  </appender>

  <root level="INFO">
    <appender-ref ref="STDOUT"/>
  </root>

</configuration>

建立一个 ConsoleAppender 的类,相似於 System.out.print 打印数据一样。该配置设置了日志输出的格式,这些表示方式根据已发送到记录器的讯息替换为生成的值。该格式含有一些符号,如下说明

  • %d
    • 日志讯息触发的时间
  • %thread
    • 日志讯息的执行续时间
  • $-5level
    • 日志等级
  • %logger{36}
    • 输出发生日志讯息的 package 和 class,{36} 限制了其长度
  • %M
    • 发生该日志讯息的方法名称
    • 会影响效能
  • %msg
    • 日志讯息
  • %n
    • 换行
  • %magenta()
    • 输出颜色
  • highlight()
    • 设置日志级别输出的颜色

如果要在与根级别不同的级别上记录该 class 的讯息,则可以为该 class 定义自己的记录器。如下

<logger name="com.xxx.service.MyServiceImpl"  additivity="false" level="DEBUG">
  <appender-ref ref="STDOUT" /> <!-- 参照前面所定义的日志格式 -->
</logger>

不使用 additivity=false 将导致讯息被打印两次,原因是根日志附加程序和类级别附加程序都写入日志。

配置将日志写入档案

<springProfile name="file">
        <property name="logPath" value="/var/log"/>
        <appender name="fileInfoLog" filePermissions="rw-r--r--" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
                <providers class="net.logstash.logback.composite.loggingevent.LoggingEventJsonProviders">
                    <pattern>
                        <pattern>
                            {
                                "timestamp": "%date{ISO8601}",
                                "level": "%level",
                                "application": "${springAppName:-}",
                                "trace": "%X{trace_id:-}",
                                "span": "%X{span_id:-}",
                                "trace_flags": "%X{trace_flags:-}",
                                "pid": "${PID:-}",
                                "thread": "%thread",
                                "class": "%logger{40}",
                                "message": "%message"
                            }
                        </pattern>
                    </pattern>
                </providers>
            </encoder>
            <!--滚动策略-->
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <!--路径-->
                <fileNamePattern>${logPath}/info.%d{dd-MM-yyyy}_%i.log</fileNamePattern>
                <maxHistory>7</maxHistory>
                <maxFileSize>10MB</maxFileSize>
                <totalSizeCap>100MB</totalSizeCap>
            </rollingPolicy>
        </appender>

        <root level="INFO">
            <appender-ref ref="STDOUT" />
            <appender-ref ref="fileInfoLog" />
        </root>
    </springProfile>

参考资源

不同环境配置文件的配置

<springProfile name="staging">
	...
</springProfile>

<springProfile name="dev">
	...
</springProfile>

<springProfile name="!prod">
    ...
</springProfile>

<<:  新新新手阅读 Angular 文件 - ngClass - Day15

>>:  我们与敏捷团队的成长

function :发生 JavaScript 严重错误\n\nSCRIPT1006: 必须要有 ')'

#取得Query String #取得URL的Query String https://127.0....

第十八天:用 Plugin 扩充 TeamCity

昨天提到 TeamCity 支援几个不同的通知频道,可以在建置任务成功或失败的时候通知我们。不过现在...

[13th][Day17] tamplete range

range golang 的 template 支援 range 循环来遍历 map、slice 内...

[Day 07] 特徵图想让人分群 ~模型们的迁移学习战~ 第二季 (k-means 实作篇)

前言 昨天我们使用预训练模型EfficientNet去提取一张表情的高阶特徵图(1280张特徵图),...

倒计时按钮文字闪烁问题

缘由: UIUX提出一个新功能,要在按钮上加上倒数秒数,这个功能算是常见,但开始动手作完了之後,问题...