SpringBoot项目中使用Logback输出json格式日志

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路SpringBoot项目中使用Logback输出json格式日志,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

前言

定义日志为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的加载顺序放到日志系统加载之前

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

(1)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!