java日志規(guī)范及模板

日志規(guī)約

  1. 【強(qiáng)制】應(yīng)用中不可直接使用日志系統(tǒng)(Log4j、Logback)中的 API欣福,而應(yīng)依賴使用日志框架(如SLF4J)中的 API,使用門面模式的日志框架,有利于維護(hù)和各個類的日志處理 方式統(tǒng)一瞬测。

  2. 【強(qiáng)制】日志文件至少保存 15 天,因為有些異常具備以“周”為頻次發(fā)生的特點。對于當(dāng)天日志涣楷,以 “應(yīng)用名.log”來保存分唾,保存在/{統(tǒng)一目錄}/logs/{應(yīng)用名}目錄下,過往日志文件名帶有yyyy-MM-dd格式日期狮斗。

  3. 【強(qiáng)制】在日志輸出時绽乔,字符串變量之間的拼接使用占位符的方式。 說明:因為 String 字符串的拼接會使用 StringBuilder 的 append() 方式碳褒,有一定的性能損耗折砸。使用占位符僅是替換動 作,可以有效提升性能沙峻。
    正例logger.debug("Processing trade with id : {} and symbol : {}", id, symbol);

  4. 【強(qiáng)制】生產(chǎn)環(huán)境禁止使用 System.out 或 System.err 輸出或使用 e.printStackTrace() 打印異常堆棧睦授。

  5. 【強(qiáng)制】異常信息應(yīng)該包括兩類信息:案發(fā)現(xiàn)場信息和異常堆棧信息。如果不處理摔寨,那么通過關(guān)鍵字 throws 往上拋出去枷。

    注意:一定要攜帶最后一個參數(shù)e(java.lang.Throwable),禁止僅打印 e.getMessage()

    正例logger.error("inputParams: {}", 各類參數(shù)或者對象 toString(), e);

  6. 【推薦】謹(jǐn)慎地記錄日志。生產(chǎn)環(huán)境禁止輸出 debug 日志是复;有選擇地輸出 info 日志删顶;如果使用 warn 來記錄剛上線時的業(yè)務(wù)行為信息,一定要注意日志輸出量的問題淑廊,避免把服務(wù)器磁盤撐爆逗余,并記得及時 刪除這些觀察日志。

日志格式

統(tǒng)一的日志格式不僅對用戶友好季惩,也有利于日志收集等運(yùn)維平臺做進(jìn)一步處理录粱。因此,日志格式必須在系統(tǒng)內(nèi)達(dá)成共識画拾。

一條完整的日志由系統(tǒng)自動捕獲的公共信息(由日志模板定義)啥繁,和開發(fā)者手動記錄的日志信息拼接組成,即一條日志=公共信息+日志體青抛。

格式定義

以下日志格式配置適用于log4j2與logback输虱,對應(yīng)xml中的pattern配置:

|%d{yyyy-MM-dd HH:mm:ss.SSS}|%-5level|%X{traceId}|%X{spanId}|${appName}|%t|%C|%M|%L|%m%n

分段釋義:

|日期時間|日志級別|鏈路ID|鏈路跨度ID|應(yīng)用名詞|線程名稱|類名|方法名|行號|日志體

其中traceId與spanId是鏈路追蹤參數(shù),需要基于鏈路追蹤框架生成脂凶,可以結(jié)合鏈路追蹤系統(tǒng)使用宪睹;appName由應(yīng)用系統(tǒng)定義。

日志樣例

  • INFO(DEBUG,WARN等)日志

    |2023-01-30 14:15:26.220|INFO |trace0|span1|iot.spaceFence|http-nio-8080-exec-1|com.iot.spaceFence.controller.IotAlarmFenceController|findOne|31|正常日志:0e178fbb5907676c38959eb7bf1c5f2b
    
  • ERROR日志

    |2023-01-30 14:15:26.221|ERROR|trace1|span1|iot.spaceFence|http-nio-8080-exec-1|com.iot.spaceFence.controller.IotAlarmFenceController|findOne|35|異常日志: 0e178fbb5907676c38959eb7bf1c5f2b
    java.lang.RuntimeException: 測試異常
      at com.iot.spaceFence.controller.IotAlarmFenceController.findOne(IotAlarmFenceController.java:33) [classes/:?]
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_351]
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_351]
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_351]
      at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_351]
    

ELK配置

filebeat

每臺服務(wù)器運(yùn)行一個filebeat即可蚕钦,負(fù)責(zé)采集日志并發(fā)送到logstash:

注意tags表示所屬項目亭病,最終會對應(yīng)到elasticsearch的不同索引。

#=========================== Agent name =============================
name: 100.127.6.231
#=========================== Filebeat inputs =============================

filebeat.inputs:

- type: log

  # Change to true to enable this input configuration.
  enabled: true

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /apps/logs/iot/*/app.log

  # The regexp Pattern that has to be matched. The example pattern matches all lines starting with [
  multiline.pattern: ^\|

  # Defines if the pattern set under pattern should be negated or not. Default is false.
  multiline.negate: true

  # Match can be set to "after" or "before". It is used to define if lines should be append to a pattern
  # that was (not) matched before or after or as long as a pattern is not matched based on negate.
  # Note: After is the equivalent to previous and before is the equivalent to to next in Logstash
  multiline.match: after
  tags: ['iot']
- type: log
  enabled: true
  paths:
    - /apps/logs/lms/lms-*.log
  multiline.pattern: ^\|
  multiline.negate: true
  multiline.match: after
  tags: ['lms']

#============================= Filebeat modules ===============================

filebeat.config.modules:
  # Glob pattern for configuration loading
  path: ${path.config}/modules.d/*.yml

  # Set to true to enable config reloading
  reload.enabled: false

#==================== Elasticsearch template setting ==========================

setup.template.settings:
  index.number_of_shards: 1

#============================== Dashboards =====================================
setup.kibana:

#----------------------------- Logstash output --------------------------------
output.logstash:
  # The Logstash hosts
  hosts: ["192.168.3.39:5044","192.168.3.214:5044"]

#================================ Processors =====================================

# Configure processors to enhance or manipulate events generated by the beat.

processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~

logstash

# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.

input {
  beats {
    port => 5044
  }
}

filter {
    if "iot" in [tags] {
        mutate { add_field => { "[@metadata][target_index]" => "iot-%{+YYYY.MM.dd}" } }
    } else if "lms" in [tags] {
        mutate { add_field => { "[@metadata][target_index]" => "lms-%{+YYYY.MM.dd}" } }
    } else {
        mutate { add_field => { "[@metadata][target_index]" => "default-%{+YYYY.MM.dd}" } }
    }
    
    grok {
        match => { "message" => "\|%{DATA:datetime}\|%{NOTSPACE:level}\s?\|%{DATA:traceId}\|%{DATA:spanId}\|%{DATA:app}\|%{NOTSPACE:thread}\|%{NOTSPACE:class}\|%{NOTSPACE:method}\|%{INT:line}\|(?<content>(.|\n)*)" }
        # 移除一些不太有用的默認(rèn)字段
        remove_field => ["[agent][ephemeral_id]","[agent][id]","[agent][id]","[agent][type]","[agent][version]","[host][mac]","[host][ip]","[host][id]","[host][architecture]","[host][containerized]","[host][os][codename]","[host][os][family]","[host][os][name]","[host][os][kernel]","[ecs][version]"]
    }
}

output {
  elasticsearch {
    hosts => ["http://192.168.0.184:9200","http://192.168.0.182:9200","http://192.168.0.59:9200"]
    index => "%{[@metadata][target_index]}"
    user => "elastic"
    password => "*********"
  }
}

參考文獻(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘶居,一起剝皮案震驚了整個濱河市罪帖,隨后出現(xiàn)的幾起案子促煮,更是在濱河造成了極大的恐慌,老刑警劉巖整袁,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菠齿,死亡現(xiàn)場離奇詭異,居然都是意外死亡坐昙,警方通過查閱死者的電腦和手機(jī)绳匀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炸客,“玉大人疾棵,你說我怎么就攤上這事”韵桑” “怎么了是尔?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長开仰。 經(jīng)常有香客問我拟枚,道長,這世上最難降的妖魔是什么众弓? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任恩溅,我火速辦了婚禮,結(jié)果婚禮上田轧,老公的妹妹穿的比我還像新娘暴匠。我一直安慰自己鞍恢,他們只是感情好傻粘,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帮掉,像睡著了一般弦悉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蟆炊,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天稽莉,我揣著相機(jī)與錄音,去河邊找鬼涩搓。 笑死污秆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的昧甘。 我是一名探鬼主播良拼,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼充边!你這毒婦竟也來了庸推?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贬媒,沒想到半個月后聋亡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡际乘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年坡倔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚓庭。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡致讥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出器赞,到底是詐尸還是另有隱情垢袱,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布港柜,位于F島的核電站请契,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏夏醉。R本人自食惡果不足惜爽锥,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望畔柔。 院中可真熱鬧氯夷,春花似錦、人聲如沸靶擦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玄捕。三九已至踩蔚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枚粘,已是汗流浹背馅闽。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留馍迄,地道東北人福也。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像攀圈,于是被迫代替她去往敵國和親暴凑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容