4 votes

Rsyslog template format de date/heure avec secondes

La configuration actuelle de mon modèle rsyslog ressemble à ceci :

/etc/rsyslog.d/00-samba-audit.conf

template(name="sambalog" type="string"
 string="%$year%-%$month%-%$day% %$hour%:%$minute% %HOSTNAME% %app-name% %msg%\n")

if $programname == 'smbd_audit' then /var/log/samba/log.audit;sambalog

Malheureusement, pour aucune raison, il n'y a pas de variable pour les secondes.

Question : Comment puis-je formater la date/heure comme suit :

2018-08-09 20:12:58

4voto

PerlDuck Points 12079

Les variables $year, $day, ... $minute font référence à l'heure actuelle. Vous voulez plutôt le timestamp lorsque l'événement a été généré ou signalé (voir ici pour la différence). Les propriétés timegenerated et timereported (== timestamp) permettent un traitement ultérieur (c'est-à-dire que vous pouvez choisir certains champs à partir de ces propriétés). Vous ne pouvez pas récupérer les secondes de l'heure actuelle mais seulement des deux timestamps mentionnés ci-dessus. Ainsi :

template(name="sambalog" type="string"
    string="%timereported:::date-year%-%timereported:::date-month%-%timereported:::date-day% %timereported:::date-hour%:%timereported:::date-minute%:%timereported:::date-second% %HOSTNAME% %app-name% %msg%\n")

Whoa, c'est une ligne très longue et au lieu de définir le modèle comme une chaîne, vous pouvez également le définir comme une liste. Le comportement est le même, seulement la définition est différente et permet des sauts de ligne et des commentaires entre les lignes. Peut-être que cela améliore la lisibilité :

template(name="sambalog_list" type="list") {
    property(name="timereported" dateFormat="year")
    constant(value="-")
    property(name="timereported" dateFormat="month")
    constant(value="-")
    property(name="timereported" dateFormat="day")
    constant(value=" ")
    property(name="timereported" dateFormat="hour")
    constant(value=":")
    property(name="timereported" dateFormat="minute")
    constant(value=":")
    property(name="timereported" dateFormat="second")
    constant(value=" ")
    property(name="hostname")
    constant(value=" ")
    property(name="app-name")
    property(name="msg" spifno1stsp="on" ) # ajouter un espace si $msg ne commence pas par un
    property(name="msg" droplastlf="on" )  # supprimer le retour à la ligne final de $msg s'il y en a un
    constant(value="\n")
}

if $programname == 'smbd_audit' then /var/log/so-test.log;sambalog_list

Lorsque je mets ce qui précède dans /etc/rsyslog.d/so.conf puis systemctl restart syslog.service et finalement exécute

logger -t smbd_audit "Bonjour, $RANDOM"

alors le fichier /var/log/so-test.log contient :

2018-10-12 22:14:12 monhote smbd_audit Bonjour, 15793

1voto

According to la documentation de rsyslog:

Le texte entre les signes de pourcentage ('%') est interprété par le remplaçant de propriété de rsyslog.

et la documentation du remplaçant de propriété dit:

date-second

juste la partie seconde (à 2 chiffres) d'un horodatage

Donc vous devriez pouvoir insérer %second% ou %date-second% dans votre modèle pour lister les secondes.

0voto

Noumenon Points 101

J'ai fait cela avec

%timegenerated:::date-pgsql%

Le résultat ressemble à 2019-09-05 12:22:46.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X