Log interoperabili su Linux

NB: Il post riguarda il solo formato della data-ora nei log e non dell’intero template. Per semplicità gli esempi seguenti non includono FACILITY/PRIORITY/LEVEL.

Il nuovo modello di interoperabilità prevede che le date utilizzate nei log seguano il formato RFC5424 con timezone in UTC.

Ove non pregiudichi l’operatività dei software, sui sistemi linux è possibile configurare la timezone con il comando

timedatectl set-timezone UTC

Attenzione: gli applicativi non dovrebbero fare affidamento sulla timezone di sistema. Questo perché gli utenti potrebbero risiedere in una timezone differente da quella delle macchine e/o perché l’applicativo potrebbe risiedere su datacenter posti in timezone differenti.

Per default, le nuove versioni di rsyslog utilizzano il formato RFC5424 con timezone (eg. “+02:00”).
Per ottenere il formato seguente, basta commentare in /etc/rsyslog.conf

# vi /etc/rsyslog.conf
# Use traditiona (not current default) timestamp format
#$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

e riavviare il servizio, ottenendoo

2018-08-13T14:57:04.321507+00:00 kong-api systemd[1]: Started System Logging Service.
2018-08-13T14:57:04.321707+00:00 kong-api rsyslogd: imuxsock: Acquired UNIX socket '/run/systemd/journal/syslog' (fd 3) from systemd.  [v8.37.0]

Rsyslog >=8.18 può convertire la timezone in UTC anche su macchine con timezone differente. Basta definire un nuovo log template col parametro date.inUTC="on".

# Define the new `template_1` automatically converted in UTC. 
# The ending "+00:00" can be stripped of with `position.to` which prints only the first 26 chars.
template(name="template_1" type="list") {
     property(name="timereported" dateFormat="rfc3339"  date.inUTC="on" position.to="26")
     constant(value="Z ")
     property(name="msg")
     constant(value="\n")
     }

$ActionFileDefaultTemplate  template_1

ottenendo stavolta

2018-08-13T14:57:04.321507Z kong-api systemd[1]: Started System Logging Service.
2018-08-13T14:57:04.321707Z kong-api rsyslogd: imuxsock: Acquired UNIX socket '/run/systemd/journal/syslog' (fd 3) from systemd.  [v8.37.0]

Per loggare correttamente su wildfly, possiamo modificare la configurazione tramite
la CLI interattiva ed inviare i log al nostro syslog, che si occuperà di tracciarli nel formato richiesto.

$ ./wildfly/bin/jboss-cli.sh --controller=172.17.0.3:9990  -c

e spedire i log ad rsyslog usando un syslog-handler.

# Creiamo un nuovo syslog-handler
[standalone@172.17.0.3:9990 /] /subsystem=logging/syslog-handler=rfc5424:add
{"outcome" => "success"}

# Indichiamo il server syslog di riferimento
[standalone@172.17.0.3:9990 /] /subsystem=logging/syslog-handler=rfc5424:write-attribute(name=server-address, value=172.17.0.4)
{"outcome" => "success"}

# verifichiamo il contenuto della risorsa. Il formato RFC5424 è quello già impostato
# da Wildfly
/subsystem=logging/syslog-handler=rfc5424:read-resource
{
    "outcome" => "success",
    "result" => {
        "app-name" => undefined,
        "enabled" => true,
        "facility" => "user-level",
        "hostname" => undefined,
        "level" => "ALL",
        "port" => 514,
        "server-address" => "172.17.0.4",
        "syslog-format" => "RFC5424"
    }
}

# A questo punto aggiungiamo l'handler al root-logger
[standalone@172.17.0.3:9990 /] /subsystem=logging/root-logger=ROOT:add-handler(name="rfc5424")
{"outcome" => "success"}

# E verifichiamo la configurazione risultante
[standalone@172.17.0.3:9990 /] /subsystem=logging/root-logger=ROOT:read-resource
{
    "outcome" => "success",
    "result" => {
        "filter" => undefined,
        "filter-spec" => undefined,
        "handlers" => [
            "CONSOLE",
            "FILE",
            "rfc5424"
        ],
        "level" => "INFO"
    }
}
1 Mi Piace