Puisque la question mentionne Arch Linux (contrôlé par systemd depuis le premier jour) et la journalisation, je vais tenter de deviner que c'est lié à la journalisation à partir d'un service systemd. Voici une autre technique d'exploitation forestière para Shell Shell invoqués depuis les unités de service systemd. . systemd peut être (et est par défaut) configuré pour écouter les processus stderr et/ou stdout du service, et transmettre les messages au journal. Lorsqu'un message commence par un préfixe de 3 caractères '<' N '>'
donde N est un chiffre de 0 à 7, systemd l'interprète comme étant le niveau de journalisation, l'omet et enregistre le reste de la chaîne au niveau spécifié.
C'est pratique, car tout message stderr provenant de n'importe quelle commande sera automatiquement enregistré au niveau d'erreur. Un autre fd est réservé à la journalisation à un niveau de sévérité arbitraire différent.
Ceci est bien sûr disponible pour tous les programmes, pas seulement Shell Shell.
Exemple
A Shell Shell (Bash dans ce cas, en s'appuyant sur la substitution de processus et le trap ... EXIT
), tirés d'un service réel. ExecStartPre
script :
#!/bin/bash
# Redirect stderr such that any message is reported as an error to journald by
# prepending '<3>' to it. Use fd 4 (the saved stderr) to directly report other
# severity levels.
exec 4>&2 2> >(while read -r REPLY; do printf >&4 '<3>%s\n' "$REPLY"; done)
# Systemd can kill the logging subshell swiftly when we exit, and lose messages.
# Close the subshell before exiting the main program explicitly. This will block
# until the read builtin reads the EOF.
trap 'exec >&2-' EXIT
### From this point on, all stderr messages will be logged to syslog as errors
### via the subshell running the while loop. Fd 4 is the old stderr, and may
### be used to specify non-error level:
echo >&2 "This message is logged as an error, red and bold."
echo >&4 "<5>This is logged as a notice-level message, dim and boring."
echo >&4 "This is logged at the default severity level, 'info' unless changed."
Les paramètres de l dossier unitaire n'ont généralement pas besoin d'être définis de manière particulière. La journalisation de stderr fonctionne d'emblée, sauf si elle est globalement surchargée dans le fichier systemd-system.conf (5) ou journald.conf (5). Les valeurs par défaut sont :
[Service]
; These defaults may be overridden in systemd-system.conf(5).
;StandardError=journal
;StandardOutput=journal
; These defaults may be overridden in journald.conf(5).
;LogLevelMax=debug
;LogRateLimitIntervalSec=10000
;LogRateLimitBurst=30s
; Extra fields may be added to every message.
;LogExtraFields=
;; Other settings:
; Defaults to process name. NOT the unit name, but rather basename(3) of the $0.
;SyslogIdentifier=
; For messages written without the <N> prefix.
;SyslogLevel=info
;SyslogFacility=daemon
; For completeness only: The level-parsing machinery can be disabled, but that
; was the whole point...
;SyslogLevelPrefix=true
Notez que systemd redirige tous Les commandes invoquées avec l'option Exec*
les paramètres, non seulement le processus de service principal ExecStart
mais aussi ExecStartPre
, ExecStartPost
etc.
Pour exécuter l'exemple enregistrez le script ci-dessus en tant que logging-test.sh
exécuté avec systemd-run en tant qu'unité temporaire, puis interrogez les propriétés complètes de chaque enregistrement du journal. Si vous ne voyez pas le message de niveau d'information, vérifiez si journald.conf limite le niveau de journalisation stocké dans le journal à une valeur supérieure.
$ systemd-run --user --wait ./logging-test.sh
$ journalctl -t logging-test.sh
$ journalctl -t logging-test.sh -o json-pretty
En niveaux de journalisation sont définis dans sd-daemon (3) :
#define SD_EMERG "<0>" /* system is unusable */
#define SD_ALERT "<1>" /* action must be taken immediately */
#define SD_CRIT "<2>" /* critical conditions */
#define SD_ERR "<3>" /* error conditions */
#define SD_WARNING "<4>" /* warning conditions */
#define SD_NOTICE "<5>" /* normal but significant condition */
#define SD_INFO "<6>" /* informational */
#define SD_DEBUG "<7>" /* debug-level messages */
Références
0 votes
Nous pouvons également configurer rsyslog pour qu'il prenne les journaux de journalctl en entrée et les sorte sous forme de fichiers également via rsyslog.
0 votes
logger
journaux au journal.0 votes
Le logger @Cliff fait partie de syslog, utilise les facilités et les priorités de syslog, etc.
0 votes
@mikemaccana Je sais, mais il n'y a pas de moyen en ligne de commande que je peux trouver pour s'interfacer complètement avec
journald
. Et bien sûr,logger
peut utiliser les fonctionnalités et les priorités de syslog, mais ce n'est pas obligatoire. Mais lelogger
la section "See Also" de la page de manuel mentionnesystemd
plus que le syslog. man7.org/linux/man-pages/man1/logger.1.html Plus,systemd-cat
ne me permet pas de définir des champs personnalisés, alors quel est l'intérêt de l'utiliser au lieu delogger
?0 votes
Sur RHEL 7 par exemple, rsyslog est en place après eg NetworkDispatcher, donc si vous essayez d'enregistrer les actions d'un script dispatcher, logger est inutile. Du moins, il ne fait rien lorsqu'il est utilisé