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).