相关环境参考: Java 输出 JSON 日志
net.logstash.logback logstash-logback-encoder 7.2
5 seconds %d{HH:mm:ss.SSS} [%thread] - %-5level %logger:%L - %msg%n 172.30.225.232:5000 5 minutes 5 seconds 30 second sleeping {"host":"${HOSTNAME}", "appname":"cloud-user"}
如果原有配置文件中需要保留一些特殊配置时,需要理解这里的配置才能将配置应用到已有的配置中。
想要在应用运行时看到修改配置文件后的效果,可以在原有配置添加:
增加logstash配置后,为了让程序在关闭时能正确关闭相关的资源,建议配置:
5 seconds
服务会等待5秒后执行释放资源的相关操作。
添加下面的配置,各部分说明看下面注释:
IP:5000 5 minutes 5 seconds 30 second sleeping {"host":"${HOSTNAME}", "appname":"cloud-user"}
这里特别说明 :
host 会在 json 中添加主机信息,以后有类似 POD 相关信息时,可以参考这里使用环境变量。appname 定义当前的应用名,这里配置死的,后续使用容器或者POD时,也可以通过环境变量进行设置。除此之外,还可以添加额外的自定义字段。
将 logstash appender 添加到某个 logger 下面,例如全局的:
到这里可以看到,上面提供的完整配置中,没有介绍常见的 控制台输出,其他都是必要的配置。
配置正常后,就可以将日志以 JSON 形式输出到 logstash 中了,logstash 可以参考下面的配置,提供 tcp 端口的服务:
input {tcp {port => 5000codec => json_lines}
}output {elasticsearch {hosts => ["elasticsearch:9200"]index => "app-%{[appname]}-%{+YYYY.MM.dd}"}stdout {}
}
elasticsearch 插件文档:https://www.elastic.co/guide/en/logstash/8.5/plugins-outputs-elasticsearch.html
上面的配置会为每个 appname 创建对应的索引,在 Kibana 中的 DavaView 可以配置 app* 索引来查看所有应用的日志。
默认情况下,代码中仍然通过 logger.info(...) 方式输出日志即可,日志的内容会作为 message 字段存储。
如果想要额外记录其他信息,全局的信息可以通过 slf4j 的 MDC 机制记录,如下:
//记住用slf4j,不要依赖具体的实现
//import org.slf4j.MDC;
MDC.put("xxx", "xxx");
logger.info(....);
MDC.remove("XXX");
MDC信息和线程绑定,处理不好可能会乱,logstash-logback-encoder 提供了 StructuredArguments,参考文档:
https://github.com/logfellow/logstash-logback-encoder#event-specific-custom-fields
由于这种方式依赖了具体的日志实现,需要做一层封装才适合使用。




对应的 JSON:
{"_index": "app-cloud-user-2022.11.26","_id": "qbYdsoQBuYtdaHhXAY0t","_version": 1,"_score": 0,"_source": {"message": "hello indexStr=201, 2022-11-26T04:05:55.852Z","@version": "1","appname": "cloud-user","host": "liuzh-pc","level_value": 20000,"config": {"date": "2022-11-26 12:05:55","uuid": "dd0cedcc-82e4-4783-8bcc-09c32b2fd051"},"thread_name": "Thread-9","level": "INFO","dateStr": "2022-11-26T04:05:55.852Z","logger_name": "com.example.springbootjsonlog.SpringBootJsonLogApplication","@timestamp": "2022-11-26T04:05:55.852Z","HOSTNAME": "liuzh-pc","indexStr": "201"},"fields": {"config.date": ["2022-11-26 12:05:55"],"indexStr": ["201"],"appname.keyword": ["cloud-user"],"config.date.keyword": ["2022-11-26 12:05:55"],"appname": ["cloud-user"],"host": ["liuzh-pc"],"@version": ["1"],"logger_name": ["com.example.springbootjsonlog.SpringBootJsonLogApplication"],"host.keyword": ["liuzh-pc"],"logger_name.keyword": ["com.example.springbootjsonlog.SpringBootJsonLogApplication"],"config.uuid.keyword": ["dd0cedcc-82e4-4783-8bcc-09c32b2fd051"],"thread_name.keyword": ["Thread-9"],"dateStr": ["2022-11-26T04:05:55.852Z"],"level": ["INFO"],"HOSTNAME.keyword": ["liuzh-pc"],"@version.keyword": ["1"],"message": ["hello indexStr=201, 2022-11-26T04:05:55.852Z"],"@timestamp": ["2022-11-26T04:05:55.852Z"],"HOSTNAME": ["liuzh-pc"],"level.keyword": ["INFO"],"level_value": [20000],"thread_name": ["Thread-9"],"message.keyword": ["hello indexStr=201, 2022-11-26T04:05:55.852Z"],"indexStr.keyword": ["201"],"config.uuid": ["dd0cedcc-82e4-4783-8bcc-09c32b2fd051"]}
}