時間格式里,sss與SSS的區別


我們在寫程序時,格式化時間是家常便飯。

我們知道,通常的格式有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有什么區別呢?
根據經驗,我們馬上得到結論,s代表的是秒,比如5/55;ss代表的是兩位的秒,比如05/55;sss代表什么,就是3位的秒唄!有3位的秒嗎?當然沒有了!那是什么呢?那是在兩位的秒前面又補了個0,比如005、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的區別(捂臉笑)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM