Comment rediriger la sortie de systemd service à un fichier
Je suis en train de rediriger la sortie d'une systemd
service à un fichier, mais il ne semble pas fonctionner:
[Unit]
Description=customprocess
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/binary1 agent -config-dir /etc/sample.d/server
StandardOutput=/var/log1.log
StandardError=/var/log2.log
Restart=always
[Install]
WantedBy=multi-user.target
Merci de corriger mon approche.
Vous devez vous connecter pour publier un commentaire.
Je pense qu'il y a une façon plus élégante de résoudre le problème: envoyer le stdout/stderr vers syslog avec un identifiant et d'instruire votre syslog gestionnaire de partage de sa sortie par le nom du programme.
Utiliser les propriétés suivantes dans votre systemd une unité de service du fichier:
Ensuite, en supposant que votre distribution est à l'aide de rsyslog pour gérer les syslogs, créez un fichier dans
/etc/rsyslog.d/<new_file>.conf
avec le contenu suivant:Maintenant faire le journal de fichier accessible en écriture par le syslog:
Redémarrer rsyslog (
sudo systemctl restart rsyslog
) et profitez-en! Votre programme stdout/stderr sera toujours disponible par le biais de journalctl (sudo journalctl -u <your program identifier>
), mais elles seront également disponibles dans votre fichier de choix.Source via archive.org
journalctl -u
fonctionne encore, mais rien n'est envoyé vers le 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 viennent les uns après les autres./etc/rsyslog.d/<newfile>.conf
contenu::programname, isequal, "<your program identifier>" /var/log/somelog.log
Voici de la documentation sur le rsyslog filtres: rsyslog.com/doc/v8-stable/configuration/filters.html Et voici docs sur les propriétés commeprogramname
: rsyslog.com/doc/master/configuration/properties.htmlrsyslog
a son propre utilisateursyslog
et il a accès en écriture dans les journaux de l'emplacement. Donc, utiliserchown
en conséquence. Espérons que cela aide quelqu'un.Si vous avez une nouvelle distro avec une nouvelle
systemd
(systemd
version 236 ou plus récent), vous pouvez définir les valeurs deStandardOutput
ouStandardError
àfile:YOUR_ABSPATH_FILENAME
.Longue histoire:
Dans les versions plus récentes de
systemd
il est relativement nouvelle option (le github demande est à partir de 2016 ish et la mise en valeur est fusionné/fermé 2017 ish) où vous pouvez définir les valeurs deStandardOutput
ouStandardError
àfile:YOUR_ABSPATH_FILENAME
. Lefile:path
option est documentée dans le le plus récentsystemd.exec
de la page de manuel.Cette nouvelle fonctionnalité est relativement nouveau et n'est donc pas disponible pour les anciennes distributions comme centos-7 (ou tout centos avant).
copytruncate
danslogrotate
.Vous peut-être obtenir cette erreur:
De la
systemd.exec(5)
homme page:La
systemd.exec(5)
homme page explique d'autres options liées à l'exploitation forestière. Voir aussi lasystemd.service(5)
etsystemd.unit(5)
des pages de man.Ou peut-être vous pouvez essayer des choses comme cela (sur une seule ligne):
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
. MerciSi, pour une quelconque raison ne pouvez pas utiliser rsyslog, cela va faire:
ExecStart=/bin/bash -ce "exec /usr/local/bin/binary1 agent -config-dir /etc/sample.d/server >> /var/log/agent.log 2>&1"
Je suggère d'ajouter
stdout
etstderr
fichier dans systemdservice
fichier lui-même.Comme vous l'avez configuré, il ne devrait pas, comme:
Il devrait être:
Assurez-vous de créer un répertoire déjà. Je suppose que ce n'est pas un soutien pour créer un répertoire.
file:
itinéraire travaille sur la première charge du service, mais sur les redémarrages suivants, il n'est plus écrit dans le fichier. J'ai essayéappend:
de la documentation et qui ne travaillent pas du tout.Assumer les journaux sont déjà mis à stdout/stderr, et ont systemd de l'unité de journal dans
/var/log/syslog
Config rsyslog (Système de Service de Journalisation)
Redémarrer rsyslog