2016-04-27 6 views
2

Ich habe eine Rsyslog Konfiguration, die wie folgt aussieht:Dynamische Rsyslog Vorlage

template(name="extract" type="string" string="%msg:R:/(?:"(level)":")((\\"| 

[^"])*)"/g–end%") 

if $InputFileTag == 'esblog' then { 
    set $!level = exec_template("extract"); 
} else { 
    set $!level = $syslogseverity-text; 
} 

template(name="json_lines" type="list") { 
    constant(value="{") 
     constant(value="\"@timestamp\":\"")  property(name="timereported" dateFormat="rfc3339") 
     constant(value="\",\"host\":\"")  property(name="hostname") 
     constant(value="\",\"json.level\":\"") property(name="$!level" format="json") 
     constant(value="\",\"facility\":\"") property(name="syslogfacility-text") 
     constant(value="\",\"tag\":\"") property(name="syslogtag" format="json") 
     constant(value="\",\"message\":\"") property(name="msg" format="json") 
    constant(value="\"}") 
} 

Grundsätzlich, wenn der Quell-Tag esblog ist, mag ich diesen regulären Ausdruck verwenden, aus „Extrakt“, um die Schwere zu ziehen aus die Protokollnachricht Ansonsten möchte ich den Standardschweregrad verwenden. Dann benutze diese Variable innerhalb der json.level-Bezeichnung, so dass ich nur eine Vorlage für die ausgehende Nachricht benötige. Aber kein Glück, dass es noch funktioniert.

Beispielnachricht mit RegEx: https://regex101.com/r/lN4tD4/1

ERROR LOG

0341.407068000:main thread : error: can not find regex end in: '(?:"level":")(\"|[^"]*)"–end%' 
0341.407084000:main thread : PROP_INVALID for name '' 
0341.407097000:main thread : Called LogMsg, msg: error during parsing file /etc/rsyslog.conf, on or before line 32: invalid property '' 
0341.407195000:main thread : Called LogMsg, msg: error during parsing file /etc/rsyslog.conf, on or before line 32: error processing template object 
0341.407350000:main thread : Called LogMsg, msg: error during parsing file /etc/rsyslog.conf, on or before line 33: exec_template(): template 'extract' 

Antwort

1

Die RegEx Wechsel gerade benötigt wird.

template(name="extract" type="string" string="%msg:R,ERE,2,DFLT:(\"level\":\")(\\\"|[^\"]*)\"--end%") 


if $programname contains "esb-log" then { 
    set $!level = exec_template("extract"); 
} else { 
    set $!level = $syslogseverity-text; 
} 

Online Rsyslog RegEx-Tool: http://www.rsyslog.com/regex/