同事整理的,在此分享。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 设置

logstash-java-log
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.yml
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的更多相关文章

  1. SpringBoot(三) - Slf4j+logback 日志,异步请求,定时任务

    1.Slf4j+logback 日志 SpringBoot框架的默认日志实现:slf4j + logback: 默认日志级别:info,对应了实际生产环境日志级别: 1.1 日志级别 # 常见的日志框 ...

  2. ELK之nginx日志使用json格式输出

    json Nginx默认日志输出格式为文本非json格式,修改配置文件即可输出json格式便于收集以及绘图 修改nginx配置文件添加配置,增加一个json输出格式的日志格式 log_format a ...

  3. SpringBoot整合Slf4j+logback日志框架

    一.Slf4j简单介绍与优势 1.介绍 Slf4j的全称是Simple Loging Facade For Java(Java简单日志门面),它仅仅是一个为Java程序提供日志输出的统一接口,并不是一 ...

  4. Golang:将日志以Json格式输出到Kafka

    在上一篇文章中我实现了一个支持Debug.Info.Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手.有兴趣的可以通过这个链接前往:https://github.com/ ...

  5. slf4j+logback日志框架 的具体使用操作【spring boot自带的默认日志框架】

    1.前言 是不是还在使用System.out.println()打印数据到控制台看? 东西少还好,如果多起来,那就看的很烦人了,特别还有加时间等信息. 怎么解决? 可以使用日志框架 ,常见的有 log ...

  6. 日志框架之2 slf4j+logback实现日志架构 · 远观钱途

    如何从缤纷复杂的日志系统世界筛选出适合自己的日志框架以及slf4j+logback的组合美妙之处?此文可能有帮助 logback介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网 ...

  7. nginx log的json格式:

    nginx log的json格式: 为了elk便于统计: yum安装nginx: log_format json '{"@timestamp": "$time_iso86 ...

  8. Docker安装ELK并实现JSON格式日志分析

    ELK是什么 ELK是elastic公司提供的一套完整的日志收集以及前端展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch.Logstash和Kibana. 其中Logstash ...

  9. Maven项目配置Logback输出JSON格式日志

    最近,项目提出需求,日志需要固定输出为JSON格式,以便后端Flink程序解析. 项目背景 项目为简单的Maven项目,日志由Filebeat采集,因此不需要配置输出至Logstash. 下面为pom ...

随机推荐

  1. 深入浅出docker

    笔者在海外工作多年,所以文中多用英文单词,有些时候是为了更精准的描述,请见谅.希望这篇随笔能帮大家入门docker.由于在海外连博客园有些慢,所以我图片用的比较少,以后再考虑一下如何更好的解决图片上传 ...

  2. 2017-07-03(VIM ACL权限 )

    VIM 底行模式 :w 保存 :q 退出 :! 强制执行 :ls 列出打开的所有文件 :n 进行下一个查询 :15 定位到15行 /xxx 从光标处向下查找xxx出现的位置 ?xxx 从光标处向上查找 ...

  3. js_2_json

    js如何使用json? json.stringify(需要序列化对象)  // 序列化 josn.parse(已经序列化对象)       // 反序列化

  4. JS正则表达式的基础用法

    RegExp(正则表达式)对象 正则表达式是一个描述字符模式的对象,可以处理更复杂的字符串.进行匹配替换. 常用的修饰符: i/m/g 使用方法: [声明方法一: new RegExp(value)] ...

  5. CentOS7 配置花生壳开机启动

    在家安装服务器,外地可以随时登陆,感觉花生壳特别方便,具体路由器配置请参考http://service.oray.com/question/2486.html. 我使用的操作系统是 [root@loc ...

  6. POI--帮助文档

    1.创建工作簿 (WORKBOOK) HSSFWorkbook wb = new HSSFWorkbook(); FileOutputStream fileOut = new FileOutputSt ...

  7. JAVA中使用log4j及slf4j进行日志输出的方法详解

    JAVA中输出日志比较常用的是log4j,这里讲下log4j的配置和使用方法,以及slf4j的使用方法.  一.下载log4j的架包,并导入项目中,如下: 二.创建log4j.properties配置 ...

  8. 深入理解Java虚拟机读书笔记(一)- java内存区域和垃圾收集

    jvm内存模型如下图 垃圾回收: 方法区: 这部分的垃圾回收性价比低,一般不要求回收,暂认为是永久代 heap:新生代和永久代之分.永久代主要回收废弃常量和无用的类. 垃圾回收算法: 1. 标记-清除 ...

  9. hibernate 持久化对象的三个状态

    Hibernate中的对象有3种状态 瞬时对象(TransientObjects).持久化对象(PersistentObjects)和离线对象(DetachedObjects也叫做脱管对象) Tran ...

  10. js事件绑定函数

    js中事件绑定方法大致有三种: 1.在DOM元素中绑定 <input onclick="alert('在DOM中绑定')" type="button" v ...