Оригинальный syslogd
Cвязка journald + rsyslogd
Форматы syslog сообщений
RFC 3164 (устаревший)
RFC 3164 - The BSD Syslog Protocol
Описание формата сообщения
The first part is called the PRI
, the second part is the HEADER
, and the third part is the MSG
. The total length of the packet MUST be 1024 bytes or less
- The
PRI
part MUST have three, four, or five characters and will be bound with angle brackets as the first and last characters. ThePRI
part starts with a leading “<” (‘less-than’ character), followed by a number, which is followed by a “>” (‘greater-than’ character). - The
HEADER
contains two fields called theTIMESTAMP
and theHOSTNAME
. TheTIMESTAMP
will immediately follow the trailing “>” from thePRI
part and single space characters MUST follow each of theTIMESTAMP
andHOSTNAME
fields. HOSTNAME will contain the hostname, as it knows itself. If it does not have a hostname, then it will contain its own IP address. If a device has multiple IP addresses, it has usually been seen to use the IP address from which the message is transmitted. - The
MSG
part has two fields known as theTAG
field and theCONTENT
field. The value in the TAG field will be the name of the program or process that generated the message. TheCONTENT
contains the details of the message.
Упрощённо он выглядит так:
<PRI>TIMESTAMP HOSTNAME TAG CONTENT
Шаблон rsyslog
<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%
%msg:::sp-if-no-1st-sp%
просто добавляет пробел в качестве разделителя междуTAG
иCONTENT
, если msg начинается НЕ с пробела. Подробнее здесь https://www.rsyslog.com/doc/v8-stable/configuration/property_replacer.html
RFC 5424
RFC 5424 - The Syslog Protocol
Описание формата сообщения
В самом RFC есть очень хорошее описание формата
Упрощённо он выглядит так:
<PRI>VERSION TIMESTAMP HOSTNAME APP-NAME PROCID MSGID STRUCTURED-DATA MSG
Развёрнуто так:
SYSLOG-MSG = HEADER SP STRUCTURED-DATA [SP MSG]
HEADER = PRI VERSION SP TIMESTAMP SP HOSTNAME
SP APP-NAME SP PROCID SP MSGID
PRI = "<" PRIVAL ">"
PRIVAL = 1*3DIGIT ; range 0 .. 191
VERSION = NONZERO-DIGIT 0*2DIGIT
HOSTNAME = NILVALUE / 1*255PRINTUSASCII
APP-NAME = NILVALUE / 1*48PRINTUSASCII
PROCID = NILVALUE / 1*128PRINTUSASCII
MSGID = NILVALUE / 1*32PRINTUSASCII
TIMESTAMP = NILVALUE / FULL-DATE "T" FULL-TIME
FULL-DATE = DATE-FULLYEAR "-" DATE-MONTH "-" DATE-MDAY
DATE-FULLYEAR = 4DIGIT
DATE-MONTH = 2DIGIT ; 01-12
DATE-MDAY = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on
; month/year
FULL-TIME = PARTIAL-TIME TIME-OFFSET
PARTIAL-TIME = TIME-HOUR ":" TIME-MINUTE ":" TIME-SECOND
[TIME-SECFRAC]
TIME-HOUR = 2DIGIT ; 00-23
TIME-MINUTE = 2DIGIT ; 00-59
TIME-SECOND = 2DIGIT ; 00-59
TIME-SECFRAC = "." 1*6DIGIT
TIME-OFFSET = "Z" / TIME-NUMOFFSET
TIME-NUMOFFSET = ("+" / "-") TIME-HOUR ":" TIME-MINUTE
STRUCTURED-DATA = NILVALUE / 1*SD-ELEMENT
SD-ELEMENT = "[" SD-ID *(SP SD-PARAM) "]"
SD-PARAM = PARAM-NAME "=" %d34 PARAM-VALUE %d34
SD-ID = SD-NAME
PARAM-NAME = SD-NAME
PARAM-VALUE = UTF-8-STRING ; characters '"', '\' and
; ']' MUST be escaped.
SD-NAME = 1*32PRINTUSASCII
; except '=', SP, ']', %d34 (")
MSG = MSG-ANY / MSG-UTF8
MSG-ANY = *OCTET ; not starting with BOM
MSG-UTF8 = BOM UTF-8-STRING
BOM = %xEF.BB.BF
UTF-8-STRING = *OCTET ; UTF-8 string as specified
; in RFC 3629
OCTET = %d00-255
SP = %d32
PRINTUSASCII = %d33-126
NONZERO-DIGIT = %d49-57
DIGIT = %d48 / NONZERO-DIGIT
NILVALUE = "-"
SP
- это пробел (ASCII символ%d32
)
[]
- всё, что заключено в квадратные скобки - опциональные параметры, согласно RFC 5234 - Augmented BNF for Syntax Specifications: ABNF, который используется для описания формата
Шаблон rsyslog
<%PRI%>1 %TIMESTAMP:::date-rfc3339% %HOSTNAME% %APP-NAME% %PROCID% %MSGID% %STRUCTURED-DATA% %msg%\n