Dacă trebuie să utilizați stdout
/stderr
, puteți folosi sd-daemon
prefix de înregistrare.
Pregătiți-vă stderr
cu <3>
a trimite un EROARE
prioritate journald
Buturuga.
Folosind dvs log-test.sh
și log-test.serviciu
:
#!/bin/bash
>&2 echo „<3>Aceasta este EROARE”
echo „Aceasta este INFO”
iesirea 0
Și jurnalctl
ieșire:
$ journalctl -u log-test -p 3
02 mai 01:22:58 host.example.com log-test.sh[29909]: Aceasta este EROARE
Dacă ale tale fantezie-aplicație
are orice API la care să scrie syslog
, puteți folosi asta pentru a scrie în datagrama UNIX /dev/log
(de obicei, se poate scrie în mod implicit și se conectează la journald
) în loc de stdout
/stderr
. Utilizați eticheta syslog pentru a vă identifica fantezie-aplicație
, prioritate syslog la eroare
sau info
în funcție de nevoile dvs. și de orice facilitate syslog.
De exemplu, în Bash putem folosi logger
:
# emite mesaj INFO către journalctl
$ logger -t fancy-app -u /dev/log -p user.info „Aceasta este INFO”
# emite un mesaj de EROARE către journalctl
$ logger -t fancy-app -u /dev/log -p user.error „Aceasta este EROARE”
# afișează mesaje jurnal pentru fancy-app
$ journalctl -t fancy-app
02 mai 01:23:38 host.example.com fancy-app[27302]: Aceasta este INFO
02 mai 01:23:39 host.example.com fancy-app[27303]: Aceasta este EROARE
# afișează mesajele de EROARE din jurnal pentru fancy-app
$ journalctl -t fancy-app -p 3
02 mai 01:23:39 host.example.com fancy-app[27303]: Aceasta este EROARE
Rețineți că în majoritatea distribuțiilor journald
intrările sunt transmise de obicei către demonul syslog local (syslog-ng
, rsyslog
, ...), așa că probabil verificați filtrele Syslog, sau poate utilizați local0
...local7
facilităţi.
Avem multe aplicații de producție (prime și terțe) care lasă înregistrarea în container și doar se conectează la stdout pentru INFO și stderr pentru jurnalele de EROARE (adică doar 2 priorități de jurnal: INFO|EROARE).
Majoritatea motorului containerului ar trebui să se poată conecta la syslog. Fără să vă cunosc motorul containerului, voi folosi Docker ca exemplu.
Docker are driver de înregistrare syslog care poate fi folosit pentru a trimite mesaje de jurnal folosind formatul syslog către orice țintă syslog. Ar trebui să vă puteți conecta la journald
cu ceva de genul:
docker run \
--log-driver syslog \
--log-opt syslog-address=unix:///dev/log \
--log-opt syslog-facility=utilizator \
--log-opt tag=fancy-app \
fancy-app: cele mai recente
Docker are și el driver de logare journald disponibil. De exemplu:
docker run \
--log-driver journald \
--log-opt tag=fancy-app \
fancy-app: cele mai recente
Ambii drivere de logare (syslog și journald) suportă separarea între stdout
și stderr
; adică stdout
mesajele vor fi înregistrate cu INFO
prioritate, și stderr
mesajele vor fi înregistrate cu EROARE
prioritate.
Lăsând deoparte filosofiile și războaiele cu flăcări, de ce să nu te conectezi la Syslog real? Este mai ușor, stocat în format text și, în general, este acceptat de software-urile de gestionare a jurnalelor (vezi Graylog, Logstash, Urma de hartie).