ตัวอย่างการอ่าน log แบบ multiline ด้วย logstash

Prawit Tangmanopeanchai
3 min readJun 30, 2019

--

ตัวอย่าง log นี้เป็นของ db2diag มีทั้งหมด 3 events และละ event จะเริ่มต้นด้วย datetime ใน format ของ DB2

DB2DIAG_TIMESTAMP %{YEAR}-%{MONTHNUM}-%{MONTHDAY}-%{HOUR}\.%{MINUTE}\.%{SECOND}\.%{INT}%{INT:timezone}

2018–09–24–21.00.01.932752+420 I1A1576 LEVEL: Event
PID : 2294076 TID : 1 PROC : db2diag
INSTANCE: inst1 NODE : 000
HOSTNAME: server1
EDUID : 1
FUNCTION: DB2 UDB, RAS/PD component, pdLogInternal, probe:120
START : New Diagnostic Log file
DATA #1 : Build Level, 232 bytes
Instance “inst1” uses “64” bits and DB2 code release “SQL10057”
with level identifier “0608010E”.
Informational tokens are “DB2 v10.5.0.7”, “s151221”, “IP23949”, Fix Pack “7”.
DATA #2 : System Info, 416 bytes
System: AIX sermsdb02 1 7 00FA14E04C00
CPU: total:512 online:128 Cores per socket:10 Threading degree per core:8 SIMD:Y
Physical Memory(MB): total:102400 free:8870
Virtual Memory(MB): total:110592 free:16814
Swap Memory(MB): total:8192 free:7944
Kernel Params: msgMaxMessageSize:4194304 msgMaxQueueIDs:1048576
msgMaxQueueSize:4194304 shmMax:35184372088832 shmMin:1
shmIDs:1048576 shmSegments:268435456 semIDs:1048576
semNumPerID:65535 semOps:1024 semUndoPerProcess:1024
semMaxVal:32767 semAdjustOnExit:16384
Cur cpu time limit (seconds) = 0x7FFFFFFFFFFFFFFF
Cur file size limit (bytes) = 0x7FFFFFFFFFFFFFFF
Cur data size (bytes) = 0x7FFFFFFFFFFFFFFF
Cur stack size (bytes) = 0x0000000002000000
Cur core size (bytes) = 0x7FFFFFFFFFFFFFFF
Cur memory size (bytes) = 0x7FFFFFFFFFFFFFFF
nofiles (descriptors) = 0x7FFFFFFFFFFFFFFF
Information in this record is only valid at the time when this file was
created (see this record’s time stamp)
2018–09–24–21.00.01.949833+420 I1578A395 LEVEL: Event
PID : 2294076 TID : 1 PROC : db2diag
INSTANCE: inst1 NODE : 000
HOSTNAME: server1
EDUID : 1
FUNCTION: DB2 UDB, RAS/PD component, pdDiagArchiveDiagnosticLog, probe:88
CREATE : DB2DIAG.LOG ARCHIVE : /db2dump/db2diag.log_2018–09–24–21.00.01 : success
IMPACT : Potential
2018–09–24–21.00.11.389338+420 I1974A650 LEVEL: Info
PID : 29687914 TID : 5142 PROC : db2sysc 0
INSTANCE: inst1 NODE : 000 DB : CPMOPPRD
HOSTNAME: server1
EDUID : 5142 EDUNAME: db2lfr.0 (CPMOPPRD) 0
FUNCTION: DB2 UDB, recovery manager, sqlplfrDoScanNext, probe:2400
DATA #1 : SQLPLFR_SCAN_ID, PD_TYPE_SQLPLFR_SCAN_ID, 8 bytes
LFR Scan Num = 4
LFR Scan Caller’s EDUID = 16707
MESSAGE : HADR: finished disk scan, next pages read from memory
DATA #2 : String, 26 bytes
lfrReadBeforeAfterXhdrFlag
DATA #3 : Hex integer, 8 bytes
0x0000000000000000

ซึ่งรูปแบบ datetime ของ DB2 ไม่อยู่ใน grok pattern จึงต้องกำหนด pattern เอง โดยเขียน snippet ดังนี้

กำหนดให้ข้อมูลสำหรับแยก event ให้ขึ้นต้นด้วย ปี แล้วตามด้วยเครื่องหมาย “-” ส่วน keyword “previous” หมายถึง message ใด ๆ ที่ไม่ได้ขึ้นด้วยด้วย pattern (ปีตามด้วย “-”) จะถือว่าเป็นส่วนหนึ่งของ log event ของบรรทัดก่อนหน้านี้

ส่วนของ “auto_flush_interval” (มีหน่วยเป็นวินาที) ปกติแล้วหากยังไม่พบ pattern ของ new event (ปีตามด้วย “-”) ตัว logstash เองจะยังไม่รู้ว่าจบ message ของ event นั้นแล้ว ทำให้ log ของ event ตัวล่าสุดจะยังไม่ส่งไปให้ elasticsearch ซึ่งโดยปกติแล้วใช้เวลาอีกสักพัก logstash ก็จะถือว่าจบ message ของ event นั้นแล้วส่งข้อมูลไปให้ elasticsearch เองเลย แต่หากว่าเราต้องการกำหนดเวลาเองก็สามารถกำหนดได้เองโดยกำหนดค่านี้

input {
file {
path => “/datatest/db2diag”
codec => multiline {
pattern => “^%{YEAR}-”
negate => true
what => “previous”
auto_flush_interval => 5
}
}
}
filter {
grok {
match => { “message” => “%{DATA:logdate} %{GREEDYDATA:infomsg}” }
}
}
output {
stdout {}
}

ตัวอย่างการอ่านโดยใช้ custom pattern ตามรูปแบบของ DB2DIAG_TIMESTAMP

รูปแบบการใช้ custom pattern

(?<field_name>the pattern here)

ตัวอย่างการใช้ custom pattern

(?<queue_id>[0-9A-F]{10,11})

ตัวอย่างการใช้ custom pattern กับ db2diag_timestamp

?<logdate>%{YEAR}-%{MONTHNUM}-%{MONTHDAY}-%{HOUR}\.%{MINUTE}\.%{SECOND}\.%{INT}%{INT:timezone})

filter {
grok {
match => { “message” => “(?<logdate>%{YEAR}-%{MONTHNUM}-%{MONTHDAY}-%{HOUR}\.%{MINUTE}\.%{SECOND}\.%{INT}%{INT:timezone}) %{GREEDYDATA:infomsg}” }
}
}

reference :

datetime ของ WAS (WebSphere Application Server) มีรูปแบบดังนี้

WAS_DATETIME %{MONTHNUM}[./]%{MONTHDAY}[./]%{YEAR} %{TIME}:%{INT} \S{,4}

--

--

Prawit Tangmanopeanchai
Prawit Tangmanopeanchai

Written by Prawit Tangmanopeanchai

Head of Cloud Implementation Unit at gosoft (Thailand)

No responses yet