流利的日志为Java Stacktrace日志解析缺少新行\ n

时间:2019-11-27 14:19:12

标签: elasticsearch logging log4j kibana fluentd

我具有以下用于解析java stacktrace日志的流利配置:

  @id fluentd-containers.log
  @type tail
  path /var/log/containers/*.log
  pos_file /var/log/es-containers.log.pos
  tag raw.kubernetes.*
  read_from_head true
  <parse>
    @type multi_format
    <pattern>
      format json
      time_key time
      time_format %Y-%m-%dT%H:%M:%S.%NZ
    </pattern>
    <pattern>
      format multiline
      format_firstline /\d{4}-\d{1,2}-\d{1,2}/
      format1 /^(?<time>\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}) \[(?<thread>.*)\] (?<level>[^\s]+)(?<message>.*)/
    </pattern>
    <pattern>
      format /^(?<time>.+) (?<stream>stdout|stderr) [^ ]* (?<log>.*)$/
      time_format %Y-%m-%dT%H:%M:%S.%N%:z
    </pattern>
  </parse>
</source>

我希望收到该日志,如syslog中所示,如下所示:

java.lang.NullPointerException: Name is null
    at java.lang.Enum.valueOf(Enum.java:236)
    at sa.com.stcs.tracking.events.ProfileType.valueOf(ProfileType.java:3)
    at sa.com.stcs.geofence.GeofenceProfileRepository.mapToGeofenceProfile(GeofenceProfileRepository.java:110)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.Iterator.forEachRemaining(Iterator.java:116)
    at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)

但不幸的是,它涉及通过弹性搜索的基巴纳语,缺少新行\n 参见图片。enter image description here

问题:我应该在哪里确切地引入新行特殊字符\n。 ??

1 个答案:

答案 0 :(得分:-1)

您不应使用\n。如果您查看文档hereformat_firstlineformat1,则表示fluentd在找到与format_firstline相匹配的正则表达式时会考虑一个新事件(即新的日志消息)。应该是您的情况下的日期。找到日期后,它将根据format1解析日志消息。在遇到带有日期的行之前,它不会记录新行,因此您不必担心。

  • 以下内容将解析时间(例如:2019-11-28 22:22:14),线程(例如:pool.thread.2),级别(例如INFOERROR等)和消息(例如java.lang....),直到找到以日期开头的下一行。

format1 /^(?<time>\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}) \[(?<thread>.*)\] (?<level>[^\s]+)(?<message>.*)

  • 如果要保持简单,则只能使用以下命令将日志时间和其他所有内容解析为消息:

format_firstline /\d{4}-\d{1,2}-\d{1,2}/ format1 /^(?<logtime>\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}.\d{1,9}) (?<log>.*)/