我們在寫程式時,格式化時間是家常便飯,
我們知道,通常的格式有yyyy-MM-dd HH:mm:ss,
那么毫秒呢?
是sss還是SSS?
哈哈,時間格式里,壓根沒有sss,
也就是說,毫秒是用SSS來表示的,
------------------------------ 分割線 ------------------------------
話說,這個sss可把我困惑很久了,
我們的系統用的日志框架是log4j,
最近隨著交易量的增大,我在觀察執行緒池任務處理情況時,總是奇怪的發現,一個請求鏈路記錄的log里,竟然是同一毫秒,
按說不應該呀,一個請求鏈路有包括方法呼叫、rpc呼叫、db讀寫,這么一串操作下來,怎么說也得超過1毫秒呀!


今天和同事分析執行緒池里的active任務,
出于對log4j這個時間的疑惑,我們程式里在列印log的地方加上了當時的時間戳,即:
logger.info("{}下游商戶處理付款通知回傳={}",System.currentTimeMillis(),result);
重新部署之后,發現log4j所列印出來的時間跟我們的時間還真不一樣,
莫非是log4j的問題?
我們知道,log4j、logback這些日志框架是異步記日志的,那么,是不是說,log4j在異步“批量”記日志的時候,所列印的時間是記日志時的時間呢?按道理來講,log4j不能這么弱吧,應該是我們的應用程式呼叫slf4j的api時的時間才對呀!
我曾有意無意地看過應用里log4j.properties配置,并沒在意如下pattern有什么問題,
log4j.appender.A4.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,sss} [%5p] [%t] [%c:%L] %m%n
------------------------------ 分割線 ------------------------------
我們另一個專案用的日志框架是logback,我們再去驗證一下那個專案里記日志有沒有這個現象,
經簡單驗證,logback沒有這個現象,
------------------------------ 分割線 ------------------------------
后來,我同事百度了一下,網上有用SSS的,就改為SSS試試,
簡單寫了個main方法,一跑才發現,果然,正常了,頓時興奮難以言表,
------------------------------ 分割線 ------------------------------
那么,sss與SSS有什么區別呢?
根據經驗,我們馬上得到結論,ss代表的是秒,sss代表什么,就是3位的秒唄!有3位的秒嗎?當然沒有了!那是什么呢?那是在兩位的秒前面補了個0,比如001、055,
這時候,再看上面的log截圖,就不難理解了,原來諸如2020-12-16 17:28:52,052 2020-12-16 17:28:55,055里面的毫秒是假的,是0+ss,
醍醐灌頂!再一次證明,沒有奇怪的問題,沒有百思不得解的問題,如果有,只能是自己沒有百思,>>百思得解,
話說回來,最初在log4j.properties寫出來%d{yyyy-MM-dd HH:mm:ss,sss}這個格式的同學,就應該拉出來突突5分鐘,他的一個手誤,害得我們糾結這么久,————不過,也未必呀,也許他也不清楚sss與SSS的區別(捂臉笑),
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/235895.html
標籤:其他
