文章目录
前言
定义日志为json格式,方便ELK的接入和查询。
Maven依赖
依赖的版本,查询下面的链接:
https://mvnrepository.com/artifact/net.logstash.logback/logstash-logback-encoder
例如:
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.0.1</version>
</dependency>
logback-spring.xml文件
在项目的resources目录下,添加文件 logback-spring.xml
注:文件名不允许是 logback.xml ,否则会报错:
no applicable action for [springProfile], current ElementPath is [[configuration][springProfile]]
使用LoggingEventCompositeJsonEncoder
json格式的编码器。
文件内容参考:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<jmxConfigurator/>
<springProperty scope="context" name="module_name" source="spring.application.name"/>
<!-- 读取apollo配置中心设置的变量 -->
<springProperty scope="context" name="version" source="app.version"/>
<springProperty scope="context" name="env" source="app.env"/>
<!--获取主机名-->
<define name="hostname" class="com.xx.property.HostNamePropertyDefiner"/>
<timestamp key="log_date" datePattern="yyyy-MM-dd"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<pattern>
<pattern>
{
"timestamp": "%date{\"yyyy-MM-dd'T'HH:mm:ss,SSSXXX\", UTC}",
"app": "${module_name}",
"version": "${version}",
"env": "${env}",
"host": "${hostname}",
<!--日志级别-->
"level": "%level",
<!--进程ID-->
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger",
"method": "%method",
"line": "%line",
<!--日志打印的信息-->
"message": "%message",
<!--堆栈异常信息-->
"statck_trace":"%xEx"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
<appender name="logfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/app/log/${module_name}.log</file>
<append>true</append>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<pattern>
<pattern>
{
"timestamp": "%date{\"yyyy-MM-dd'T'HH:mm:ss,SSSXXX\", UTC}",
"app": "${module_name}",
"version": "${version}",
"env": "${env}",
"host": "${hostname}",
<!--日志级别-->
"level": "%level",
<!--进程ID-->
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger",
"method": "%method",
"line": "%line",
<!--日志打印的信息-->
"message": "%message",
<!--堆栈异常信息-->
"statck_trace":"%xEx"
}
</pattern>
</pattern>
</providers>
</encoder>
<prudent>false</prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/app/log/${module_name}-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
</appender>
<logger name="com.xx" level="debug"/>
<!-- 日志输出级别 -->
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="logfile"/>
</root>
</configuration>
参考链接:
https://logback.qos.ch/manual/index.html
https://logback.qos.ch/manual/layouts.html
如果Logback未获取到property,将会显示成:...IS_UNDEFINED
;
相关问题
appender里的 fileNamePattern与 file 的关系
没有设置file属性:当天(分钟/时/月)的日志输出到fileNamePattern指向的日志。
设置file属性:当天(分钟/时/月)的日志输出到file指向的日志,第二天凌晨日志输出到fileNamePattern指向的日志。
logback如何从apollo配置中心读取变量
app:
id: xxx
version: 1.0.0
env: dev
apollo:
bootstrap:
enabled: true
# 将Apollo配置加载提到初始化日志系统之前
eagerLoad:
enabled: true
autoUpdateInjectedSpringProperties: true
注意:
将Apollo配置加载提到初始化日志系统之前(1.2.0+):
从1.2.0版本开始,如果希望把日志相关的配置(如logging.level.root=info或logback-spring.xml中的参数)也放在Apollo管理,那么可以额外配置apollo.bootstrap.eagerLoad.enabled=true来使Apollo的加载顺序放到日志系统加载之前
获取主机名
方法1:自定义
import ch.qos.logback.core.PropertyDefinerBase;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* 将主机名添加到日志中
*
*/
public class HostNamePropertyDefiner extends PropertyDefinerBase {
@Override
public String getPropertyValue() {
try {
return InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) {
e.printStackTrace();
}
return null;
}
}
方法2:高版本的logback jar包中提供了 CanonicalHostNamePropertyDefiner
类
https://logback.qos.ch/apidocs/ch/qos/logback/core/property/CanonicalHostNamePropertyDefiner.html
使Logback以“%date”格式在日期和时间之间包括“ T”,以严格遵守ISO 8601
默认情况下,Logback编码器使用类似于ISO
8601标准的日期格式。但是它在日期和时间部分之间的中间缺少“
T”。该标记使解析更加容易,并且是标准所必需的(除非私有方另行同意)。
时区
为了更完全符合ISO 8601标准,并且为了获得更有用的日志记录,您应该包括一个时区。
编辑(Michael-O,2014-06-15):事实 并非 如此,时区是绝对可选的。
要包含时区,请向传递第二个参数(请参阅doc)%date。传递时区的专有名称。避免使用三个或四个字母的时区代码,例如“
EST”,因为它们既不是唯一的也不是标准化的。例如,通过Australia/Perth。通常,对于日志记录,我们需要UTC(GMT)时间,这意味着没有任何偏移。在这种情况下,请通过UTC。
您可以在日志中将时区偏移量显示为日期和时间的小时数和分钟数。附加一个X以将时区偏移显示为日期时间值的一部分。
例如:
%date{"yyyy-MM-dd'T'HH:mm:ss,SSSXXX", UTC}
输出:
2021-04-16T09:59:24,009Z
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/155614.html