美文网首页
ELK实时获取tomcat日志不准问题

ELK实时获取tomcat日志不准问题

作者: Daisy小朋友 | 来源:发表于2019-08-14 14:51 被阅读0次

问题:

Q1:ELK搭建好运行一段时间后发现在kibana中显示的日志顺序与linux系统中打出的log中的顺序是不一致的,在kibana中显示的日志到s或者微妙就乱序了,如


image.png

Q2:对于tomcat中的错误日志kibana打出的是多条的,不是很容易排查问题


image.png

思路:

1 发现原来是event time 和process time 的问题,我的日志是通过filebeat抓取传送到logstash的,并没有将日志的时间截取传送给es,所以es使用的是自带的timestamp,就会跟系统实际日志时间不同啦,所以会出现乱序的问题
2 将没有日期的日志判断为一条数据

解决:

1 首先需要统一日志格式,tomcat和log4j打出的日志均统一为
“2019-11-23 08:06:24,445” 年-月-日 时:分:秒,毫秒

  • tomcat7统一格式
    修改logging.properties配置文件
    image.png
##添加
[1catalina.org.apache.juli.FileHandler.formatter](http://1catalina.org.apache.juli.filehandler.formatter/) = java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format = %1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS,%1$tL %1$te %4$s %3$s %2$s %5$s %6$s%n
##日期含义
%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS,%1$tL %1$te %4$s %3$s %2$s %5$s %6$s%n
年               月          日         时        分         秒      毫秒     
  • log4j统一格式
Using ISO8601 date format specifier:
-          Pattern: [%p] %d{ISO8601} %c %M - %m%n
-          Example output:
[INFO] 2012-11-02 23:13:58,300 MyClass foo - this is a log message

2 将日志格式统一后,通过filebeat传输到logstash中,并在logstash中设置筛选条件,筛选条件有两条,第一将日志的时间在logstash中截取出来并且在kibana界面通过截取的日志时间来进行排序,第二通过正则将多行判断为1行

  • 截取日志
    if [fields][env] == "test" {
        grok {
            match => {
            "message" => "(?<datetime>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2},\d{3})"}   ##注意这个位置还要看你的日志格式,我的格式为如 2019-08-14 14:23:34,234  
         }    
        date {
            match => ["datetime","yyyy-MM-dd HH:mm:ss,SSS"]
            target => "@timestamp"     #将截取的值赋给默认的timestamp
        }

     }

调试可以使用http://grokdebug.herokuapp.com/

其它记录:

第一种

filter {
if [type] == "kube-logs" {
mutate {
rename => ["log", "message"]
}
date {
match => ["time", "ISO8601"]
remove_field => ["time"]
}

第二种--放到grok中即可

2012-11-02 23:13:58,300 INFO CreateSale:179 - ***获取所有关联人(卖网店人员信息结束)
%{TIMESTAMP_ISO8601:time} %{WORD:log_type} %{GREEDYDATA:log_content}
或者
06:02:12,999  INFO CreateSale:179 - ***获取所有关联人(卖网店人员信息结束)
(?<datetime>\d{2}:\d{2}:\d{2},\d{3})
或者
%{GREEDYDATA:timestamp}\sINFO\s%{GREEDYDATA:NoticeController} - %{GREEDYDATA:message}
image.png
  • 将多行日志输出为1行
       multiline {
            pattern => "^\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2}"
            negate => true
            what => "previous"
        }

pattern与what,pattern是用来匹配文本行的正则表达式,解码(过滤)器会依据匹配结果来判断当前文本行是否是一个多行事件的组成部分。
what可以设置:previous和next,分别表示“向前”和“向后”的意思。那么结合pattern的匹配结果来讲,“向前”的含义就是说当前被匹配成功的行与上一行合为同一个多行事件的一部分,“向后”的含义就是说当前被匹配成功的行与下一行合为同一个多行事件的一部分。
negate选项的作用在于设置是否对pattern匹配结果取反,其默认值是false,意思就是不起作用。如果设置为true会将pattern匹配结果取反,进而将多行事件扫描过程中的行匹配逻辑反置

参考:
https://github.com/wso2/carbon-kernel/blob/master/features/org.wso2.carbon.runtime.feature/resources/wso2/default/bin/bootstrap/logging.properties
https://my.oschina.net/andChow/blog/718320
https://www.codejava.net/coding/common-conversion-patterns-for-log4js-patternlayout
https://zhuanlan.zhihu.com/p/37128731
https://blog.csdn.net/shan1369678/article/details/51353909

相关文章

网友评论

      本文标题:ELK实时获取tomcat日志不准问题

      本文链接:https://www.haomeiwen.com/subject/jznfqctx.html