91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

淺談java日志格式化

發布時間:2020-10-07 21:20:17 來源:腳本之家 閱讀:167 作者:jasonlu 欄目:編程語言

1.日志的重要性

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

2.日志采集分析 -ELK

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

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

2.當我們的日志中有異常信息,我們需要提取異常信息的時候,你會發現用grok來清洗message很困難!其實也有解決的方法,需要你去慢慢寫正則匹配

不錯,logstash強大的grok及mutate可以滿足需求,但是當日志量很大的時候,logstash的grok和mutate會消耗大量的資源。那我們有沒有更有的方案呢?

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

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

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

這就涉及到日志框架輸出的異常信息通常是多行的,這就意味著我們需要在filebeat(flume)或者logstash來處理多行的問題。當我們在日志的配置文件沒有很好的區分日志的message和stack時,日志是糅雜一塊的。提前其中的信息很難很難

4. 日志json化

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

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字符串轉換成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"
 }

最終效果

淺談java日志格式化

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

双柏县| 江油市| 申扎县| 洪洞县| 罗城| 丰台区| 双辽市| 时尚| 屯留县| 凌云县| 南丹县| 衡东县| 石河子市| 岢岚县| 阿图什市| 罗山县| 肃北| 雅安市| 山阴县| 韶山市| 皮山县| 乌拉特前旗| 云梦县| 丹棱县| 西乡县| 辽源市| 武宁县| 瑞昌市| 桐庐县| 池州市| 石家庄市| 正蓝旗| 阜新| 吴旗县| 湖北省| 颍上县| 满城县| 达孜县| 咸宁市| 金秀| 胶州市|