Fluent-Bit解析的Tomcat日志在Opensearch-Dashboards时间偏移问题排查
技术栈
Opensearch + Opensearch-Dashboards + Fluent-Bit
目标
解析Apache Tomcat的catalina.out日志文件
配置
fluent-bit.conf
[SERVICE] Flush 5 Log_Level info Parsers_File parsers.conf [INPUT] Name tail Tag tomcat.access Path /u01/tomcat/apache-tomcat/logs/access*.txt Parser tomcat_access [INPUT] Name tail Tag tomcat.catalina Path /u01/tomcat/apache-tomcat/logs/catalina.out [FILTER] Name multiline Match tomcat.catalina multiline.key_content log multiline.parser tomcat_catalina_multiline, java [FILTER] Name parser Match tomcat.catalina Key_Name log Parser tomcat_catalina_spring Preserve_key On [OUTPUT] Name file Match tomcat.catalina Path /u01/fluent-bit Format out_file [OUTPUT] Name opensearch Match tomcat* Host <host> Port <port> Suppress_Type_Name On Index tomcat-test
parsers.conf
[PARSER] Name tomcat_access Format regex Regex ^(?<host>\S+) (?<ident>\S+) (?<user>\S+) \[(?<time>.*)\] "(?<method>\S+) (?<url>\S+) (?<protocol>\S+)" (?<status>\S+) (?<size>\S+)$ Time_Key time Time_Format %d/%b/%Y:%H:%M:%S %z [PARSER] Name tomcat_catalina_spring Format regex Regex ^(?<time>\d+-\d+-\d+ \d+:\d+:\d+\.\d+)\s+(?<level>\S+) \d+ --- \[\s*(?<thread>[^\]]+)\] (?<context>\S+)\s+: (?<message>.*)$ Time_Key time Time_Format %Y-%m-%d %H:%M:%S.%L [MULTILINE_PARSER] name tomcat_catalina_multiline type regex flush_timeout 500 # # rules | state name | regex pattern | next state # ------|-----------------|-------------------------------------------------------- rule "start_state" "/^(\d+-\d+-\d+ \d+:\d+:\d+\.\d+)(.*)$/" "empty_row" rule "empty_row" "/^$/" "error_row" rule "error_row" "/^.*$/" "stacktrace" rule "stacktrace" "/^(\s*at .*|)$/" "stacktrace"
文件输出调试
为调试配置了文件输出,tomcat.catalina的日志内容显示正常,包含已解析的单行日志(带有level、thread、context、message字段)、多行日志及仅含\n的空行日志。
问题
最初在Opensearch-Dashboards的Discover页面无法找到已解析的单行日志,仅能看到多行日志和空行日志。相关字段已存在于tomcat-test索引的映射及索引模式的字段列表中,尝试刷新索引模式字段、删除重建索引、重启Fluent-Bit与Tomcat均未解决问题,且无报错信息。
更新
日志实际已写入索引,但时间偏移了3小时,调整时间过滤器后可在Dashboards中找到。现需排查该时间偏移问题的根本原因。
时间偏移问题排查方向
1. 日志解析器时区配置缺失
Tomcat输出的catalina.out日志时间为本地时区(比如UTC+3),但当前tomcat_catalina_spring解析器仅定义了时间格式,未指定时区。Fluent-Bit默认会将解析到的时间当作UTC时间存入Opensearch,若Dashboards使用本地时区显示,就会出现3小时的偏移。
解决方式:在tomcat_catalina_spring解析器中添加Time_Zone配置,指定Tomcat日志使用的时区:
[PARSER] Name tomcat_catalina_spring Format regex Regex ^(?<time>\d+-\d+-\d+ \d+:\d+:\d+\.\d+)\s+(?<level>\S+) \d+ --- \[\s*(?<thread>[^\]]+)\] (?<context>\S+)\s+: (?<message>.*)$ Time_Key time Time_Format %Y-%m-%d %H:%M:%S.%L Time_Zone UTC+3 # 替换为实际时区,如Asia/Shanghai对应东八区
2. Opensearch-Dashboards时区设置
检查Dashboards的时区配置:进入Stack Management > Advanced Settings,找到timezone选项,确认其是否与Tomcat日志时区一致,或是否设置为Browser(使用浏览器所在时区)。若两者时区差3小时,会直接导致显示偏移。
3. Fluent-Bit服务器系统时区
Fluent-Bit运行的服务器系统时区若与Tomcat日志时区不一致,也可能影响时间解析。可在Fluent-Bit的[SERVICE]段添加Time_Zone配置指定全局时区,或确保服务器系统时区与Tomcat日志时区一致。
4. 验证解析后的时间
查看文件输出的日志内容,对比@timestamp字段(Fluent-Bit默认存储解析后的时间)与日志原始时间,确认是否存在时区转换偏差。若@timestamp比原始时间少3小时,说明Fluent-Bit将本地时间当作UTC处理,添加Time_Zone配置即可解决。
内容的提问来源于stack exchange,提问作者manururu

