本文主要說明在使用Logtail進行日志采集時,如何有效地提取和處理具有納秒精度的時間戳信息,確保對原始日志中的高精度時間數據進行準確捕獲。
應用場景
某些業務場景下對時間精度要求較高(例如不同子模塊日志保序要求),依賴毫秒甚至更高精度的時間戳,此時往往會在業務日志中打印毫秒精度的時間,這也就要求日志分析平臺能夠提供高精度時間戳的存儲與查詢分析能力。
使用Logtail進行日志采集時,可突破日志服務中存儲模型中秒級精度時間戳的限制,根據業務需求提取納秒精度的時間戳。
前提條件
已創建Project和Logstore。更多信息,請參見管理Project和管理Logstore。
已在服務器上安裝Logtail,并已經創建了包含該服務器的機器組。
說明ECS安裝具體操作,請參見安裝Logtail(ECS實例)。
如果您的服務器是與日志服務屬于不同賬號的ECS、其他云廠商的服務器和自建IDC時,您需要手動安裝Logtail。更多信息,請參見安裝Logtail(Linux系統)。手動安裝Logtail后,您必須在該服務器上手動配置用戶標識。具體操作,請參見配置用戶標識。
納秒精度時間戳的提取功能需要Linux Logtail1.8.0及以上版本。
文件采集場景
原生插件解析
源日志樣例:
2023.11.06-15.12.12.123456,10.10.*.*,"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1",200,18204,aliyun-sdk-java
在Logtail配置中,單擊其他全局配置,開啟高級參數開關,輸入
{ "EnableTimestampNanosecond": true}
。日志采集步驟請參見采集主機文本日志。
添加分隔符解析插件。具體配置說明,請參見分隔符模式解析。
添加時間解析插件。具體配置說明,請參見時間解析。
時間解析插件需要配置時間格式,例如分隔符插件解析后的字段
time
為2023.10.26-20.58.12.123456
,時間轉換格式
應調整為%Y.%m.%d-%H.%M.%S.%f
,其中%f
為秒的小數部分,精度最高支持為納秒。時間轉換格式需要與原始日志中的時間格式保持一致,若不一致,就無法正常解析納秒時間戳,詳情參見常見問題。時間完整格式參考時間格式。配置索引結束后,在控制臺查看解析結果,可以看到解析后的時間帶有納秒的時間戳。更多信息,請參見創建索引。
擴展插件提取日志時間(strptime時間格式)
源日志樣例:
{
"asctime": "2023-10-25 23:51:10,199999999",
"filename": "generate_data.py",
"levelname": "INFO",
"lineno": 51,
"module": "generate_data",
"message": "{\"no\": 14, \"inner_loop\": 166, \"loop\": 27451, \"uuid\": \"9be98c29-22c7-40a1-b7ed-29ae6c8367af\"}",
"threadName": "MainThread"
}
在Logtail配置中,單擊其他全局配置,開啟高級參數開關,輸入
{ "EnableTimestampNanosecond": true}
。日志采集步驟請參見采集主機文本日志。
添加展開JSON字段插件。具體配置說明,請參見展開JSON字段。
說明如果源日志為類似樣例中的單層JSON,沒有多層嵌套,配置JSON展開連接符用
""
。多層嵌套的JSON,配置JSON展開連接符用"_"
。添加提取日志時間(strptime時間格式)插件。具體配置說明,請參見strptime時間格式。
提取日志時間(strptime時間格式)插件需要配置時間格式,例如原始日志時間字段為
"asctime": "2022-04-29 21:37:40,251"
,時間轉換格式
應調整為%Y-%m-%d %H:%M:%S,%f
,其中%f
為秒的小數部分,精度最高支持為納秒。時間轉換格式需要與原始日志中的時間格式保持一致,完整格式參考時間格式。配置索引結束后,在控制臺查看解析結果,可以看到解析后的時間帶有納秒的時間戳。更多信息,請參見創建索引。
擴展插件提取日志時間(Go語言時間格式)
源日志樣例:
{
"asctime": "2023-10-25 23:51:10,199999999",
"filename": "generate_data.py",
"levelname": "INFO",
"lineno": 51,
"module": "generate_data",
"message": "{\"no\": 14, \"inner_loop\": 166, \"loop\": 27451, \"uuid\": \"9be98c29-22c7-40a1-b7ed-29ae6c8367af\"}",
"threadName": "MainThread"
}
在Logtail配置中,單擊其他全局配置,開啟高級參數開關,輸入
{ "EnableTimestampNanosecond": true}
。日志采集步驟請參見采集主機文本日志。
添加展開JSON字段插件。具體配置說明,請參見展開JSON字段。
說明如果源日志為類似樣例中的單層JSON,沒有多層嵌套,配置JSON展開連接符用
""
。多層嵌套的JSON,配置JSON展開連接符用"_"
。添加提取日志時間(Go語言時間格式)插件。具體配置說明,請參見Go語言時間格式。
提取日志時間(Go語言時間格式)的時間格式需要按照Golang的時間格式規范來編寫。其中的格式化時間模板不是常見的
%Y-%m-%d %H:%M:%S
,而是使用Go語言的誕生時間2006-01-02 15:04:05 -0700 MST
。例如:2023-10-25 01:36:10,199999999
對應的時間格式應該為2006-01-02 15:04:05,999999999
。以下提供Golang官方的時間格式示例:
const ( Layout = "01/02 03:04:05PM '06 -0700" // The reference time, in numerical order. ANSIC = "Mon Jan _2 15:04:05 2006" UnixDate = "Mon Jan _2 15:04:05 MST 2006" RubyDate = "Mon Jan 02 15:04:05 -0700 2006" RFC822 = "02 Jan 06 15:04 MST" RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone RFC850 = "Monday, 02-Jan-06 15:04:05 MST" RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST" RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone RFC3339 = "2006-01-02T15:04:05Z07:00" RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00" Kitchen = "3:04PM" // Handy time stamps. Stamp = "Jan _2 15:04:05" StampMilli = "Jan _2 15:04:05.000" StampMicro = "Jan _2 15:04:05.000000" StampNano = "Jan _2 15:04:05.000000000" )
配置索引結束后,在控制臺查看解析結果,可以看到解析后的時間帶有納秒的時間戳。更多信息,請參見創建索引。
常見問題
采集日志無法正常解析納秒時間戳
配置采集后,發現高精度時間并未正常提取。
錯誤原因
插件模式支持%f,但是時間格式需要與源時間內容保持一致。
解決方法
登錄Logtail機器,查看日志,發現大量STRPTIME_PARSE_ALARM異常日志。
tail -f /usr/local/ilogtail/logtail_plugin.LOG 2023-10-26 00:30:39 [WRN] [strptime.go:164] [processLog] [##1.0##xxxx,xxx] AlarmType:STRPTIME_PARSE_ALARM strptime(2023-10-26 00:30:10,199999999, %Y-%m-%d %H:%M:%S %f) failed: 0001-01-01 00:00:00 +0000 UTC, <nil>
修改插件日志解析格式。
原始日志時間為
2023-10-26 00:30:10,199999999
,秒與高精度時間(這里是毫秒)之間分隔符為半角逗號(,),解析格式為%Y-%m-%d %H:%M:%S %f
,秒與高精度時間之間分隔符為空格 。修改采集配置中時間轉換格式為
%Y-%m-%d %H:%M:%S,%f
即可。