Maven项目配置Logback输出JSON格式日志
最近,项目提出需求,日志需要固定输出为JSON格式,以便后端Flink程序解析.
项目背景
项目为简单的Maven项目,日志由Filebeat采集,因此不需要配置输出至Logstash.
下面为pom.xml文件中配置的依赖,此处使用logstash-logback-encoder完成日志格式转换操作.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.28</version>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.1</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.2.3</version>
</dependency>
Logback配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>probe</contextName>
<!-- 配置文件存储地址 -->
<property name="LOG_PATH" value="./logs"/>
<!-- 读取应用程序配置文件中内容,获取下文所需要的region属性 --->
<property resource="application.properties"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers class="net.logstash.logback.composite.loggingevent.LoggingEventJsonProviders">
<pattern>
<pattern>
{
"date":"%d{yyyy-MM-dd HH:mm:ss.SSS}",
"level":"%level",
<!-- system属性由程序动态确定,通过Slf4j提供的MDC进行具体设置 -->
"system":"%X{system} ",
<!-- 读取配置文件中的属性,并设置至日志中 -->
"region":"${application.region}",
"filepath":"%class:%line",
"msg":"%msg"
}
</pattern>
</pattern>
</providers>
<charset>UTF-8</charset>
</encoder>
<append>true</append>
<!-- 配置日志文件滚动存储策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/probe.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<MaxHistory>10</MaxHistory>
<maxFileSize>10MB</maxFileSize>
<totalSizeCap>300MB</totalSizeCap>
</rollingPolicy>
</appender>
<root level="FILE">
<appender-ref ref="console"/>
</root>
</configuration>
上述即为logback.xml文件中的配置内容,需要注意日志中的region从配置文件application.properties中获取,而system属性则同msg字段一样由程序动态设置.
MDC设置system属性
/**
* 衡量单次http请求的时延
*
* @param url 请求地址
*/
private static void measureHttpTimeDelay(String url, Platform platform) {
// MDC中设置system属性
MDC.put("system", platform.toString());
OkHttpClient client = new OkHttpClient();
client.newBuilder().connectTimeout(5, TimeUnit.SECONDS)
.readTimeout(5, TimeUnit.SECONDS)
.build();
Request request = new Request.Builder().url(url).build();
Instant before = Instant.now();
try (Response response = client.newCall(request).execute()) {
Instant after = Instant.now();
if (response.isSuccessful()) {
long duration = Duration.between(before, after).toMillis();
log.info("请求成功!" + response.message() + "时延 = " + duration + "ms");
} else {
log.info("请求失败!" + response.message());
}
} catch (IOException e) {
log.error("get http response failed, url: {}, ex: {}", url, e.getMessage());
}
// MDC中清除system属性设置
MDC.remove("system");
}
上述程序,模拟一个简单的http请求,并记录相应日志.
需要注意,MDC是ThreadLocal实现,因此在多线程环境下使用需要注意.
最终日志
最终日志如下图所示:
{"date":"2019-09-05 21:16:44.643","level":"INFO","system":"ALI_YUN ","region":"HUABEI","filepath":"com.test.Application:38","msg":"请求成功!OK时延 = 439ms"}
{"date":"2019-09-05 21:16:45.326","level":"INFO","system":"HUAWEI_YUN ","region":"HUABEI","filepath":"com.test.Application:38","msg":"请求成功!OK时延 = 165ms"}
{"date":"2019-09-05 21:16:46.513","level":"INFO","system":"ALI_YUN ","region":"HUABEI","filepath":"com.test.Application:38","msg":"请求成功!OK时延 = 485ms"}
{"date":"2019-09-05 21:16:56.130","level":"INFO","system":"HUAWEI_YUN ","region":"HUABEI","filepath":"com.test.Application:38","msg":"请求成功!OK时延 = 419ms"}
PS:
如果您觉得我的文章对您有帮助,请关注我的微信公众号,谢谢!
Maven项目配置Logback输出JSON格式日志的更多相关文章
- logback输出json格式日志(包括mdc)发送到kafka
1,pom.xml <!-- kafka --> <dependency> <groupId>com.github.danielwegener</groupI ...
- Maven项目配置logback
首先,在pom.xml中加入maven依赖 <!-- log start --> <dependency> <groupId>org.slf4j</group ...
- springboot项目配置logback日志系统
记录springboot项目配置logback日志文件管理: logback依赖jar包 SpringBoot项目配置logback理论上需要添加logback-classic依赖jar包: < ...
- Nginx 高级配置-自定义json格式日志
Nginx 高级配置-自定义json格式日志 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在大数据运维工作中,我们经常会使用flume,filebeat相关日志收集工具取收集日志 ...
- Logback 输出 JPA SQL日志 到文件
Logback 输出 JPA SQL日志 到文件 使用Spring Boot 配置 JPA 时可以指定如下配置在控制台查看执行的SQL语句 spring.jpa.show-sql=true Sprin ...
- filebeat收集nginx的json格式日志
一.在nginx主机上安装filebeat组件 [root@zabbix_server nginx]# cd /usr/local/src/ [root@zabbix_server src]# wge ...
- WCF兼容WebAPI输出Json格式数据,从此WCF一举两得
问题起源: 很多时候为了业务层调用(后台代码),一些公共服务就独立成了WCF,使用起来非常方便,添加服务引用,然后简单配置就可以调用了. 如果这个时候Web站点页面需要调用怎么办呢? 复杂的XML , ...
- maven项目配置findbugs插件 使用git钩子控制代码的提交
maven项目配置findbugs插件对代码进行静态检测 当发现代码有bug时,就不让用户commit代码到远程仓库里 没有bug时才可以commit到远程仓库中 (1)新建maven项目 ,配置fi ...
- ELK之收集Nginx、Tomcat的json格式日志
1.安装Nginx yum -y install nginx vim /etc/nginx/nginx.conf # 修改日志格式为json格式,并创建一个nginxweb的网站目录 log_form ...
随机推荐
- Python学习笔记6 函数式编程_20170619
廖雪峰python3学习笔记: # 高阶函数 将函数作为参数传入,这样的函数就是高阶函数(有点像C++的函数指针) def add(x, y): return x+y def mins(x, y): ...
- python27期day13:闭包、装饰器初始、标准版装饰器、作业题
1.闭包: 保护数据安全.保护数据干净性. 2.闭包的定义:在嵌套函数内.使用非全局变量(且不使用本层变量) 将嵌套函数返回 闭包的目的:要接受被装饰的函数和被装饰函数需要的参数3.闭包举例子: de ...
- 洛谷P2996 [USACO10NOV]拜访奶牛Visiting Cows
题目 树形dp 设f[i][j]表示走到第i号节点的最大权值 j为0/1表示这个点选或者不选 如果这个点不选 就从他的子树里的选或者不选选最大 如果这个点选 就加上他子树的不选 f[x][0] += ...
- STL map 简介
STL map 简介 转载于:http://www.cnblogs.com/TianFang/archive/2006/12/30/607859.html 1.目录 map简介 map的功能 使用ma ...
- 数据库多行数据合并一行(sqlserver、Oracle、Mysql)
我们日常查询数据时,经常会有将查询到的数据按照某一列分组显示(合并多行数据),比如: 表结构: ),coursename )); 需要将以上数据按照用户名分组,所选课程列不同项之间用逗号隔开,在一行中 ...
- Loj #3045. 「ZJOI2019」开关
Loj #3045. 「ZJOI2019」开关 题目描述 九条可怜是一个贪玩的女孩子. 这天,她和她的好朋友法海哥哥去玩密室逃脱.在他们面前的是 \(n\) 个开关,开始每个开关都是关闭的状态.要通过 ...
- 使用GitHub的仓库以及介绍
一.创建仓库 假如Responsitory name是Hello-World Description一栏中可以设置仓库的说明. Public, Private 在这一栏可以选择Public还是Pri ...
- 【layui】【laydate】设置可以选择相同的年份范围
1.效果: 2.解决方法: 修改laydate.js源码 全局查询T.prototype.setBtnStatus这个只有一个,就是点击控件时调用的事件,里面添加下面代码 if( this.confi ...
- 23 Maven工程module的移除和重新导入
1.移除module 移除后: 点击右侧的maven projects: 2.重新导入刚才移除的module (1)方法1 (2)方法2 Ctrl+Shift+ALT+S的快捷键 选择modules ...
- RC4算法
RC4算法简介:https://baike.baidu.com/item/RC4%E7%AE%97%E6%B3%95/9686396?fr=aladdin RC4算法java实现: /** * RC4 ...
