欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談java日志格式化

 更新時(shí)間:2019年05月23日 14:29:30   作者:jasonlu  
不管我們使用何種語言開發(fā),一旦程序發(fā)生異常,日志是一個(gè)很重要的數(shù)據(jù)。但是并不是意味著打印的日志越多越好,我們需要的是有用的日志。下面小編來和大家一起學(xué)習(xí)以下知識(shí)

1.日志的重要性

不管我們使用何種語言開發(fā),一旦程序發(fā)生異常,日志是一個(gè)很重要的數(shù)據(jù)。但是并不是意味著打印的日志越多越好,我們需要的是有用的日志。
曾經(jīng)參與一個(gè)很重要的項(xiàng)目?jī)?yōu)化,他們的日志沒有進(jìn)行規(guī)范,開發(fā)、運(yùn)維也沒有把這個(gè)事情放在心上。等到壓測(cè)的時(shí)候TPS和響應(yīng)時(shí)間一直上不去。通過jstack分析發(fā)現(xiàn),大部分的log數(shù)據(jù)在阻塞!
今天我們不討論具體的日志規(guī)范,我從日志中心的角度來聊下LOG的規(guī)范

2.日志采集分析 -ELK

目前主流的ELK系統(tǒng)應(yīng)該都是通過agent端(filebeat/flume)采集具體.log文件,對(duì)于日志沒有多大處理的話,我們可能把整條日志采集過來后,通過logstash后把message存儲(chǔ)到elasticsearch中。

1.當(dāng)我們需要從每條日志中提取日志時(shí)間、日志級(jí)別等等信息的時(shí)候,我們需要在logstash配置相應(yīng)的 grok語法解析其中的message信息。

2.當(dāng)我們的日志中有異常信息,我們需要提取異常信息的時(shí)候,你會(huì)發(fā)現(xiàn)用grok來清洗message很困難!其實(shí)也有解決的方法,需要你去慢慢寫正則匹配

不錯(cuò),logstash強(qiáng)大的grok及mutate可以滿足需求,但是當(dāng)日志量很大的時(shí)候,logstash的grok和mutate會(huì)消耗大量的資源。那我們有沒有更有的方案呢?

下面我們用java日志來舉例吧

在想要得到答案之前,我們需要知道存儲(chǔ)到es的最終數(shù)據(jù)是JSON,logstash清洗數(shù)據(jù)最終的結(jié)果是轉(zhuǎn)換成JSON。一般的agent采集端僅僅只是做日志的采集,即使kafka做緩沖,kafka也不做處理。因此我們需要從日志的根源來解決這個(gè)問題。

3.為什么使用logstash處理Java的異常信息不好做呢?

這就涉及到日志框架輸出的異常信息通常是多行的,這就意味著我們需要在filebeat(flume)或者logstash來處理多行的問題。當(dāng)我們?cè)谌罩镜呐渲梦募]有很好的區(qū)分日志的message和stack時(shí),日志是糅雜一塊的。提前其中的信息很難很難

4. 日志json化

既然原生的日志數(shù)據(jù)不好處理,那么我們需要對(duì)日志框架做些美容手術(shù)。
在日志中,我們一般都會(huì)打印,時(shí)間/日志級(jí)別/線程/日志內(nèi)容/當(dāng)前文件名/loggerName/異常信息等等。
其中 日志內(nèi)容和異常信息可能會(huì)出現(xiàn)多行。這個(gè)需要處理下,下面我們使用fastjson來處理這兩個(gè)字段,見代碼

public class MsgConverter extends ClassicConverter {

 @Override
 public String convert(ILoggingEvent event) {
 return JsonUtils.serialize(event.getFormattedMessage());

 }
}
public class StackTraceConverter extends ThrowableProxyConverter {
 @Override
 public String convert(ILoggingEvent event) {
 IThrowableProxy throwableProxy = event.getThrowableProxy();
 // 如果沒有異信息
 if (throwableProxy == null) {
 //返回字符串 : "\"\""
 return JsonUtils.serialize("");
 }
 String ex = super.convert(event);
 return JsonUtils.serialize(ex);
 }
}

其中JsonUtils可以選擇合適的json框架來處理

之后在logback.xml中配置

<configuration>
 <conversionRule conversionWord="exdiy" converterClass="xxx.logback.converter.StackTraceConverter" />
 <conversionRule conversionWord="msgdiy" converterClass="xxx.logback.converter.MsgConverter" />
</configuration>

修改layout -> Pattern

<layout>
 <!--<Pattern>{"date":"%date{yyyy-MM-dd HH:mm:ss.SSS}","level":"%level","tid":"%tid","className":"%logger","fileLine":"%file:%line","msg":%message, "stack_trace":%ex }%n</Pattern>-->
 <Pattern>{"date":"%date{yyyy-MM-dd HH:mm:ss.SSS}","level":"%level","className":"%logger","fileName":"%file","thread":"%thread","msg":%msgdiy, "stack_trace":%exdiy}%n</Pattern>
</Pattern>
{
 "date":"2019-01-02 16:16:33.817",
 "level":"INFO",
 "className":"org.springframework.web.servlet.DispatcherServlet","fileName":"FrameworkServlet.java","thread":"http-nio-8762-exec-1","msg":"FrameworkServlet 'dispatcherServlet': initialization completed in 38 ms", "stack_trace":"" 
}

logstash將json字符串轉(zhuǎn)換成json即可

json {
 source => "message"
 #target => "doc"
 remove_field => ["message"]
 }
 date {
 match => ["date","yyyy-MM-dd HH:mm:ss.SSS"]
 target => "@timestamp"
 locale => "cn"
 timezone => "Asia/Shanghai"
 }

最終效果

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springboot新建項(xiàng)目Spring Initializr Error問題及解決

    Springboot新建項(xiàng)目Spring Initializr Error問題及解決

    這篇文章主要介紹了Springboot新建項(xiàng)目Spring Initializr Error問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 一文帶你搞懂Java中的泛型和通配符

    一文帶你搞懂Java中的泛型和通配符

    泛型機(jī)制在項(xiàng)目中一直都在使用,甚至很多源碼中都用到了泛型機(jī)制。但是里面很多的機(jī)制和特性一直沒有明白,尤其通配符這塊,經(jīng)常忘記。本文對(duì)此做了一些總結(jié),具有一定借鑒價(jià)值,希望有所幫助
    2022-09-09
  • SpringBoot?+?MyBatis-Plus構(gòu)建樹形結(jié)構(gòu)的幾種方式

    SpringBoot?+?MyBatis-Plus構(gòu)建樹形結(jié)構(gòu)的幾種方式

    在實(shí)際開發(fā)中,很多數(shù)據(jù)都是樹形結(jié)構(gòu),本文主要介紹了SpringBoot?+?MyBatis-Plus構(gòu)建樹形結(jié)構(gòu)的幾種方式,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • java多線程Thread-per-Message模式詳解

    java多線程Thread-per-Message模式詳解

    本篇文章給大家分享java多線程Thread-per-Message模式的相關(guān)知識(shí)點(diǎn),對(duì)此有興趣的朋友參考學(xué)習(xí)下。
    2018-05-05
  • java線程組構(gòu)造方法源碼解析

    java線程組構(gòu)造方法源碼解析

    這篇文章主要為大家介紹了java線程組構(gòu)造方法源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 解決springboot利用ConfigurationProperties注解配置數(shù)據(jù)源無法讀取配置信息問題

    解決springboot利用ConfigurationProperties注解配置數(shù)據(jù)源無法讀取配置信息問題

    今天在學(xué)習(xí)springboot利用ConfigurationProperties注解配置數(shù)據(jù)源的使用遇到一個(gè)問題無法讀取配置信息,發(fā)現(xiàn)全部為null,糾結(jié)是哪里出了問題呢,今天一番思考,問題根源找到,下面把我的解決方案分享到腳本之家平臺(tái),感興趣的朋友一起看看吧
    2021-05-05
  • java下載url路徑包含中文需要轉(zhuǎn)義的操作

    java下載url路徑包含中文需要轉(zhuǎn)義的操作

    這篇文章主要介紹了java下載url路徑包含中文需要轉(zhuǎn)義的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Spring中字段格式化的使用小結(jié)

    Spring中字段格式化的使用小結(jié)

    Spring提供的一個(gè)core.convert包?是一個(gè)通用類型轉(zhuǎn)換系統(tǒng)。它提供了統(tǒng)一的?ConversionService??API和強(qiáng)類型的Converter SPI,用于實(shí)現(xiàn)從一種類型到另一種類型的轉(zhuǎn)換邏輯,這篇文章主要介紹了Spring中字段格式化的使用詳解,需要的朋友可以參考下
    2022-06-06
  • 聊聊spring boot的WebFluxTagsProvider的使用

    聊聊spring boot的WebFluxTagsProvider的使用

    這篇文章主要介紹了聊聊spring boot的WebFluxTagsProvider的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • mybatis QueryWrapper的條件構(gòu)造之a(chǎn)pply、last、select解析

    mybatis QueryWrapper的條件構(gòu)造之a(chǎn)pply、last、select解析

    這篇文章主要介紹了mybatis QueryWrapper的條件構(gòu)造之a(chǎn)pply、last、select,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評(píng)論