Filebeatを使用して複数行のログを処理する(複数行)

この記事の元のテキストへのリンク:https://blog.csdn.net/xzk9381/article/details/109571087

Filebeatがログを収集する場合、デフォルトで行ごとに収集されます。つまり、各行はデフォルトで個別のイベントになり、タイムスタンプが追加されます。ただし、いくつかの特別なログを収集する場合、イベントには、Javaスタックトレースログなどの複数の行が含まれることがよくあります。

20-09-25 09:09:01.866 ERROR - {
    
    "traceId":"","where":{
    
    "methodName":"doFilter","className":"com.sohu.smc.channel.news.filter.ResponseTimeFilter","lineNumber":47},"message":"ResponseTimeFilter error","error":"org.apache.catalina.connector.ClientAbortException: java.io.IOException: Connection reset by peer
        at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:309)
        at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:272)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: Connection reset by peer
        at sun.nio.ch.FileDispatcherImpl.write0(Native Method)
        at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47)
        at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
        at sun.nio.ch.IOUtil.write(IOUtil.java:65)
"}

したがって、複数行のログには、filebeatの特別な構成が必要です。

公式ドキュメント:https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html

最初に、いくつかの構成項目について説明します。

  • multiline.pattern:結果と一致することを望んでいます(正規表現)
  • multiline.negate:値はtrueまたはfalseです。falseを使用して、一致した行が前の行にマージされることを示します。trueを使用して、一致しない行が前の行にマージされることを示します。
  • multiline.match:値は後または前です。afterは前の行の終わりにマージすることを意味し、beforeは次の行の先頭にマージすることを意味します
  • multiline.max_lines:マージされる行の最大数。デフォルトは500です。
  • multiline.timeout:マージイベントのタイムアウト時間。デフォルトは5秒で、マージに時間がかかりすぎてファイルビートプロセスがフリーズするのを防ぎます。

1.Javaスタックトレースログ

1.例1

スタックトレースログは複数の行で構成され、各行は最初の行の後のスペースで始まります。例は次のとおりです。

Exception in thread "main" java.lang.NullPointerException
        at com.example.myproject.Book.getTitle(Book.java:16)
        at com.example.myproject.Author.getBookTitles(Author.java:25)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

これらの行をFilebeatの単一のイベントに統合するには、Filebeatに次の構成を追加します。

multiline.pattern: '^[[:space:]]'
multiline.negate: false
multiline.match: after

この構成では、スペースで始まる行が前の行にマージされます。

2.例2

次に、より複雑なスタックログ形式を使用します。

20-09-25 09:09:01.866 ERROR - {
    
    "traceId":"","where":{
    
    "methodName":"doFilter","className":"com.sohu.smc.channel.news.filter.ResponseTimeFilter","lineNumber":47},"message":"ResponseTimeFilter error","error":"org.apache.catalina.connector.ClientAbortException: java.io.IOException: Connection reset by peer
        at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:309)
        at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:272)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: Connection reset by peer
        at sun.nio.ch.FileDispatcherImpl.write0(Native Method)
        at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47)
        ... 72 more
"}

次の構成を使用して、これらの行を1つのイベントに統合します。

multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:|^"}'
multiline.negate: false
multiline.match: after

# 或者如下格式

multiline:
  pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:'
  negate: false
  match: after

# 如果日志中有 ... 72 more 这样的结尾,可以用如下匹配方式:
multiline.type: pattern
multiline.pattern: '^[[:space:]]+(at|\.{3})[[:space:]]+\b|^Caused by:|^"}'
multiline.negate: false
multiline.match: after

この構成では、スペースで始まる行とCausedbyで始まる行が前の行のコンテンツにマージされます。

この記事の元のテキストへのリンク:https://blog.csdn.net/xzk9381/article/details/109571087

2、Cスタイルのログ

一部のプログラミング言語では、以下に示すように、行の終わりにバックスラッシュ()文字を使用して、行がまだ継続していることを示します:

printf ("%10.10ld  \t %10.10ld \t %s\
  %f", w, x, y, z );

次の構成を使用して、これらの行を1つのイベントに統合します。

multiline.pattern: '\\$'
multiline.negate: false
multiline.match: before

この構成では、\文字で終わる行が次の行とマージされます。

3、タイムスタンプ付きのログ

通常、ログ内の1つのイベントにはタイムスタンプがありますが、1つのイベントのログが2行以上に切り捨てられる場合があるため、行をマージするにはタイムスタンプを一致させる必要があります。例は次のとおりです。

たとえば、ニュースコンテンツに関するログの場合、ニュースの本文に改行文字が含まれていると、デフォルトでは、ログに記録されているイベントは改行文字の存在により切り捨てられます。

[2015-08-24 11:49:14,389][INFO ][env                      ] [Letha] using [1] data paths, mounts [[/
(/dev/disk1)]], net usable_space [34.5gb], net total_space [118.9gb], types [hfs]

次の構成を使用して、これらの行を1つのイベントに統合します。

multiline.pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true
multiline.match: after

この構成では、設定後にnegate:trueおよびmatch:afterを使用して、指定されたパターンを満たさない行が前の行に属することを指定します。

4、アプリケーションイベント

アプリケーションログにカスタムタグで開始および終了するイベントが含まれる場合があります。例は次のとおりです。

[2015-08-24 11:49:14,389] Start new event
[2015-08-24 11:49:14,395] Content of processing something
[2015-08-24 11:49:14,399] End event

次の構成を使用して、これらの行を1つのイベントに統合します。

multiline.pattern: 'Start new event'
multiline.negate: true
multiline.match: after
multiline.flush_pattern: 'End event'

この構成では、指定された文字列の先頭と末尾の複数の行が1つのイベントに結合されます。

この記事の元のテキストへのリンク:https://blog.csdn.net/xzk9381/article/details/109571087

おすすめ

転載: blog.csdn.net/xzk9381/article/details/109571087
おすすめ