slf4j-logback 日志以json格式导入ELK
同事整理的,在此分享。logback,log4j2 等slf4j的日志实现都可以以json格式输出日志, 这里采用的是logback。当然也可以以文本行的格式输出,然后在logstash里通过grok解析,但是直接以json格式输出,在logstash处理时效率会高一点。
Logback 输出 Json格式日志文件
为了让 logback 输出JSON 格式的日志文件,需要在pom.xml 加入如下依赖
<dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version> 4.8 </version> <scope>runtime</scope> </dependency> |
logback日志配置示例
<appender name= "errorFile" class = "ch.qos.logback.core.rolling.RollingFileAppender" > <filter class = "ch.qos.logback.classic.filter.LevelFilter" > <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <file>${log.dir}/elk/error.log</file> <!-- 当前的日志文件文件放在 elk文件下,该日志的内容会被filebeat传送到es --> <rollingPolicy class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" > <! -- 历史日志会放到 bak 文件下,最多保存 7 天的历史,最多占用 1G的空间 --> <fileNamePattern>${log.dir}/bak/error.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory> 7 </maxHistory> <totalSizeCap>1GB</totalSizeCap> </rollingPolicy> <encoder class = "net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder" > <providers> <pattern> <pattern> { "tags" : [ "errorlog" ], "project" : "myproject" , "timestamp" : "%date{\"yyyy-MM-dd'T'HH:mm:ss,SSSZ\"}" , "log_level" : "%level" , "thread" : "%thread" , "class_name" : "%class" , "line_number" : "%line" , "message" : "%message" , "stack_trace" : "%exception{5}" , "req_id" : "%X{reqId}" , "elapsed_time" : "#asLong{%X{elapsedTime}}" } </pattern> </pattern> </providers> </encoder> </appender> |
Json 字段说明:
名称
|
说明
|
备注
|
|
|
|
|
|
---|---|---|---|---|---|---|---|
tags | 用于说明这条日志是属于哪一类日志 | ||||||
timestamp |
日志记录时间 | ||||||
project |
系统名称,该日志来自于哪个系统 | ||||||
log_level |
输出日志级别 | ||||||
thread |
输出产生日志的线程名。 | ||||||
class_name |
输出执行记录请求的调用者的全限定名 |
|
|||||
line_number |
输出执行日志请求的行号 |
|
|||||
message |
输出应用程序提供的信息 | ||||||
stack_trace |
异常栈信息 | ||||||
req_id |
请求ID,用于追踪请求 | 需要引入aop-logging | |||||
elapsed_time |
该方法执行时间,单位: 毫秒 | 需要引入aop-logging |
%X{key}: 表示该项来自于SLF4j MDC,需要引入 aop-logging
<dependency> <groupId>com.cloud</groupId> <artifactId>xspring-aop-logging</artifactId> <version> 0.7 . 1 </version> </dependency> 针对web应用,在 web.xml 中加入 ReqIdFilter,该过滤器会在MDC 加入 reqId <filter> <filter-name>aopLogReqIdFilter</filter-name> <filter- class >com.github.nickvl.xspring.core.log.aop.ReqIdFilter</filter- class > </filter> <filter-mapping> <filter-name>aopLogReqIdFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> or register in springboot like this : @Bean public FilterRegistrationBean getDemoFilter(){ ReqIdFilter reqIdFilter= new ReqIdFilter(); FilterRegistrationBean registrationBean= new FilterRegistrationBean(); registrationBean.setFilter(reqIdFilter); List<String> urlPatterns= new ArrayList<String>(); urlPatterns.add( "/*" ); registrationBean.setUrlPatterns(urlPatterns); registrationBean.setOrder( 100 ); return registrationBean; } 如果需要记录该方法执行时间: elapsed_time,如果在该类或者方法上加入如下注解: import com.github.nickvl.xspring.core.log.aop.annotation.LogDebug; import com.github.nickvl.xspring.core.log.aop.annotation.LogInfo; @LogInfo // 当logger 设为level=INFO 会输出 @LogException (value = { @Exc (value = Exception. class , stacktrace = false )}, warn = { @Exc ({IllegalArgumentException. class })}) // 当logger 设为level=error 会输出 针对dubbo 消费者的日志记录,dubbo消费者是通过 javassist 生成的动态类型,如果要监控该dubbo接口的传入参数,返回值,和调用时间 需要引入aop-logging, 以及在 eye-rpc包中的接口上给对应的类或方法 加上上面的注解。 dubbo 消费者的日志会输出如下配置: <logger name= "com.alibaba.dubbo.common.bytecode" level= "INFO" additivity= "false" > <appender-ref ref= "dubboApiFile" /> </logger> |
ElasticSearch 模板设置
curl -XPUT http: //localhost:9200/_template/log -d '{ "mappings" : { "_default_" : { "_all" : { "enabled" : false }, "_meta" : { "version" : "5.1.1" }, "dynamic_templates" : [ { "strings_as_keyword" : { "mapping" : { "ignore_above" : 1024 , "type" : "keyword" }, "match_mapping_type" : "string" } } ], "properties" : { "@timestamp" : { "type" : "date" }, "beat" : { "properties" : { "hostname" : { "ignore_above" : 1024 , "type" : "keyword" }, "name" : { "ignore_above" : 1024 , "type" : "keyword" }, "version" : { "ignore_above" : 1024 , "type" : "keyword" } } }, "input_type" : { "ignore_above" : 1024 , "type" : "keyword" }, "message" : { "norms" : false , "type" : "text" }, "offset" : { "type" : "long" }, "source" : { "ignore_above" : 1024 , "type" : "keyword" }, "tags" : { "ignore_above" : 1024 , "type" : "keyword" }, "type" : { "ignore_above" : 1024 , "type" : "keyword" } } } }, "order" : 0 , "settings" : { "index.refresh_interval" : "5s" }, "template" : "log-*" }' curl -XPUT http: //localhost:9200/_template/log-java -d ' { "mappings" : { "_default_" : { "properties" : { "log_level" : { "ignore_above" : 1024 , "type" : "keyword" }, "project" : { "ignore_above" : 1024 , "type" : "keyword" }, "thread" : { "ignore_above" : 1024 , "type" : "keyword" }, "req_id" : { "ignore_above" : 1024 , "type" : "keyword" }, "class_name" : { "ignore_above" : 1024 , "type" : "keyword" }, "line_number" : { "type" : "long" }, "exception_class" :{ "ignore_above" : 1024 , "type" : "keyword" }, "elapsed_time" : { "type" : "long" }, "stack_trace" : { "type" : "keyword" } } } }, "order" : 1 , "settings" : { "index.refresh_interval" : "5s" }, "template" : "log-java-*" }' |
logstatsh 设置
if [fields][logType] == "java" { json { source => "message" remove_field => [ "offset" ] } date { match => [ "timestamp" , "yyyy-MM-dd'T'HH:mm:ss,SSSZ" ] remove_field => [ "timestamp" ] } if [stack_trace] { mutate { add_field => { "exception_class" => "%{stack_trace}" } } } if [exception_class] { mutate { gsub => [ "exception_class" , "\n" , "" , "exception_class" , ":.*" , "" ] } } } |
filebeat 设置
filebeat.prospectors: - input_type: log paths: - /eyebiz/logs/eyebiz-service/elk/*.log # eyebiz-service 日志 - /eyebiz/logs/eyebiz-web/elk/*.log # eyebiz-web 日志 fields: logType: "java" docType: "log-java-dev" |
slf4j-logback 日志以json格式导入ELK的更多相关文章
- SpringBoot(三) - Slf4j+logback 日志,异步请求,定时任务
1.Slf4j+logback 日志 SpringBoot框架的默认日志实现:slf4j + logback: 默认日志级别:info,对应了实际生产环境日志级别: 1.1 日志级别 # 常见的日志框 ...
- ELK之nginx日志使用json格式输出
json Nginx默认日志输出格式为文本非json格式,修改配置文件即可输出json格式便于收集以及绘图 修改nginx配置文件添加配置,增加一个json输出格式的日志格式 log_format a ...
- SpringBoot整合Slf4j+logback日志框架
一.Slf4j简单介绍与优势 1.介绍 Slf4j的全称是Simple Loging Facade For Java(Java简单日志门面),它仅仅是一个为Java程序提供日志输出的统一接口,并不是一 ...
- Golang:将日志以Json格式输出到Kafka
在上一篇文章中我实现了一个支持Debug.Info.Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手.有兴趣的可以通过这个链接前往:https://github.com/ ...
- slf4j+logback日志框架 的具体使用操作【spring boot自带的默认日志框架】
1.前言 是不是还在使用System.out.println()打印数据到控制台看? 东西少还好,如果多起来,那就看的很烦人了,特别还有加时间等信息. 怎么解决? 可以使用日志框架 ,常见的有 log ...
- 日志框架之2 slf4j+logback实现日志架构 · 远观钱途
如何从缤纷复杂的日志系统世界筛选出适合自己的日志框架以及slf4j+logback的组合美妙之处?此文可能有帮助 logback介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网 ...
- nginx log的json格式:
nginx log的json格式: 为了elk便于统计: yum安装nginx: log_format json '{"@timestamp": "$time_iso86 ...
- Docker安装ELK并实现JSON格式日志分析
ELK是什么 ELK是elastic公司提供的一套完整的日志收集以及前端展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch.Logstash和Kibana. 其中Logstash ...
- Maven项目配置Logback输出JSON格式日志
最近,项目提出需求,日志需要固定输出为JSON格式,以便后端Flink程序解析. 项目背景 项目为简单的Maven项目,日志由Filebeat采集,因此不需要配置输出至Logstash. 下面为pom ...
随机推荐
- 2018/1/28 每日一学 单源最短路的SPFA算法以及其他三大最短路算法比较总结
刚刚AC的pj普及组第四题就是一种单源最短路. 我们知道当一个图存在负权边时像Dijkstra等算法便无法实现: 而Bellman-Ford算法的复杂度又过高O(V*E),SPFA算法便派上用场了. ...
- LINUX下文件编译
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- 2017-06-25(常用快捷键 history 用户及用户组)
常用快捷键 ctrl+l 清屏 (与clear命令功能相似) ctrl+c 强制终止当前命令 crtl+a 光标移到命令行首 crtl+e 光标移到命令行尾 ctrl+u 从光标所在位置删除至行首 c ...
- Servlet--SingleThreadModel接口,RequestDispatcher接口
SingleThreadModel接口 定义 public interface SingleThreadModel; 这是一个空接口,它指定了系统如何处理对同一个 Servlet 的调用.如果一个 S ...
- Django简介--Django从入门到精通系列教程
该系列教程系个人原创,并同步发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...
- 《.NET 设计规范》第 3 章 命名规范
<.NET 规范>第 3 章 命名规范 3.1 大小写约定 要把 PascalCasing 用于由多个单词构成的命名空间.类型以及成员的名字. 要把 camelCasing 用于参数的名字 ...
- vue项目中关于axios的简单使用
axios介绍 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中 官方仓库:https://github.com/axios/axios 中文文档:htt ...
- 18_Python列表常用方法总结
''' 1.列表切片索引\截取 2.列表的增删改查 3.列表最大值\列表最小值\排序 4.列表的遍历 5.列表的嵌套 6.列表和字符串的互转 7.判断元素是否在列表中 ''' #列表使用中括号表示 元 ...
- js判断是pc端还是移动端
function checkMobile() { var pda_user_agent_list = new Array("2.0 MMP", "240320" ...
- HTTP协议篇(一):多工、数据流
管道机制.多工 管道机制(Pipelining) HTTP 1.1 引入了管道机制(Pipelining),即客户端可通过同一个TCP连接同时发送多个请求.如果客户端需要请求两个资源,以前的做法是在同 ...