Je pense qu'il existe un moyen plus élégant de résoudre le problème: envoyez le stdout / stderr à syslog avec un identifiant et demandez à votre gestionnaire de syslog de diviser sa sortie par nom de programme.
Utilisez les propriétés suivantes dans votre fichier d'unité de service systemd:
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=<your program identifier> # without any quote
Ensuite, en supposant que votre distribution utilise rsyslog pour gérer les syslogs, créez un fichier /etc/rsyslog.d/<new_file>.conf
avec le contenu suivant:
if $programname == '<your program identifier>' then /path/to/log/file.log
& stop
Maintenant, rendez le fichier journal accessible en écriture par syslog:
# ls -alth /var/log/syslog
-rw-r----- 1 syslog adm 439K Mar 5 19:35 /var/log/syslog
# chown syslog:adm /path/to/log/file.log
Redémarrez rsyslog ( sudo systemctl restart rsyslog
) et profitez-en! Votre programme stdout / stderr sera toujours disponible via journalctl ( sudo journalctl -u <your program identifier>
) mais il sera également disponible dans le fichier de votre choix.
Source via archive.org
Valerio Versace
la source
journalctl -u
fonctionne toujours mais rien n'est envoyé au fichier spécifié.~
est obsolète etstop
devrait être utilisé à la place. Notez également que la deuxième ligne peut être raccourcie& stop
si les deux se succèdent./etc/rsyslog.d/<newfile>.conf
contenu en::programname, isequal, "<your program identifier>" /var/log/somelog.log
Voici la documentation sur les filtres rsyslog: rsyslog.com/doc/v8-stable/configuration/filters.html Et voici des documents sur les propriétés commeprogramname
: rsyslog.com/doc/master/configuration/properties .htmlrsyslog
a son propre utilisateursyslog
et qu'elle doit avoir un accès en écriture à l'emplacement des journaux. Alors utilisez enchown
conséquence. J'espère que cela aide quelqu'un.Si vous avez une distribution plus récente avec une version plus récente
systemd
(systemd
version 236 ou plus récente ), vous pouvez définir les valeurs deStandardOutput
ouStandardError
surfile:YOUR_ABSPATH_FILENAME
.Longue histoire:
Dans les versions plus récentes de,
systemd
il existe une option relativement nouvelle ( la requête github date de 2016 et l'amélioration est fusionnée / fermée en 2017 ) où vous pouvez définir les valeurs deStandardOutput
ouStandardError
surfile:YOUR_ABSPATH_FILENAME
. L'file:path
option est documentée dans la page de manuel la plus récentesystemd.exec
.Cette nouvelle fonctionnalité est relativement nouvelle et n'est donc pas disponible pour les anciennes distributions comme les centos-7 (ou les centos avant cela).
la source
copytruncate
inlogrotate
.Vous obtenez probablement cette erreur:
Depuis la
systemd.exec(5)
page de manuel:La
systemd.exec(5)
page de manuel explique d'autres options liées à la journalisation. Voir aussi les pages de manuelsystemd.service(5)
etsystemd.unit(5)
.Ou peut-être que vous pouvez essayer des choses comme celle-ci (le tout sur une seule ligne):
la source
journalctl -u your-unit-name
.The fd option connects the output stream to a single file descriptor provided by a socket unit. A custom named file descriptor can be specified as part of this option, after a ":" (e.g. "fd:foobar").
2>&1 > /var/log.log
à ceci:2>&1 >> /var/log.log
. MerciJe suggérerais d'ajouter
stdout
et destderr
classer dans leservice
fichier systemd lui-même.Référence: https://www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=
Comme vous l'avez configuré, il ne devrait pas aimer:
Ça devrait être:
Cela fonctionne lorsque vous ne souhaitez pas redémarrer le service encore et encore .
Cela créera un nouveau fichier et ne s'ajoutera pas au fichier existant.
Utilisez plutôt:
REMARQUE: assurez-vous que vous créez déjà le répertoire. Je suppose qu'il ne prend pas en charge la création d'un répertoire.
la source
file:
itinéraire fonctionne au premier chargement du service, mais lors des redémarrages suivants, il n'écrit plus dans le fichier. J'ai essayéappend:
de la documentation et cela n'a pas fonctionné du tout.file:
indique clairement que écrit au début du fichier à chaque fois, et ne tronque pas ... plus loin,append:
semble être un nouvel ajout (c'est-à-dire non présent dans laman systemd.exec
page sur Ubuntu 18.04).Si pour une raison quelconque, vous ne pouvez pas utiliser rsyslog, cela fera:
ExecStart=/bin/bash -ce "exec /usr/local/bin/binary1 agent -config-dir /etc/sample.d/server >> /var/log/agent.log 2>&1"
la source
Supposons que les journaux sont déjà placés dans stdout / stderr et que l'unité systemd se connecte
/var/log/syslog
Config rsyslog (service de journalisation système)
Redémarrez rsyslog
la source
Nous utilisons Centos7, application de démarrage à ressort avec systemd. J'utilisais java comme ci-dessous. et la définition de StandardOutput sur fichier ne fonctionnait pas pour moi.
Ci-dessous la solution de contournement fonctionnant sans définir StandardOutput. exécutant java via sh comme ci-dessous.
la source
Réponse courte:
Si vous ne voulez pas que les fichiers soient effacés à chaque fois que le service est exécuté, utilisez plutôt append:
la source