Edytuj 2016-06-02
Jeśli ogólnie próbujesz znaleźć „Uaktualnij komunikaty dziennika”, sprawdź /var/log/upstart/
. To tam zapisuje Upstart stdout
i stderr
usługi Upstart. Dzięki odpowiedzi leopd za zwrócenie na to uwagi.
Jeśli szukasz komunikatów dziennika od samego Upstart, które są konfigurowane initctl log-priority
i wysyłane przez initctl emit
, czytaj dalej!
Krótka wersja
Wpisy do dziennika powinny faktycznie pojawić się w dmesg. Mimo to domyślnie nie pojawiają się w /var/log
.
Jeśli też chcesz je /var/log
dodać, dodaj $KLogPermitNonKernelFacility on
do konfiguracji rsyslogd. Sugeruję utworzenie niestandardowego pliku, takiego jak /etc/rsyslog.d/60-custom.conf
unikanie edycji /etc/rsyslog.conf
, ponieważ zarządza nim dpkg. Teraz dorobkiewicz komunikaty powinny pokazać się w /var/log/syslog
po ustawieniu Upstart na log-priority
celu info
albo tak.
Długa wersja
Śledzenie zajęło mi kilka dni, ale najwyraźniej Upstart (1.5) nie loguje się do syslog, czyli nie wywołuje funkcji glibc syslog()
. Zamiast tego Upstart loguje się do bufora pierścieniowego jądra, który odczytuje dmesg. Teraz, ja nie sądzę, że było to możliwe dla procesów przestrzeni użytkownika napisać do tego bufora, ale najwyraźniej potrafią pisząc /dev/kmsg
, i to jest dokładnie to, co robi Upstart. To pierwsza część układanki.
Drugą częścią jest powszechne przekonanie, że wiadomości zapisane w buforze pierścieniowym jądra są automatycznie kopiowane do syslog przez jądro (przynajmniej tak zawsze myślałem). Okazuje się, że w rzeczywistości robi to demon przestrzeni użytkownika, tradycyjnie klogd, który działa w parze z syslogd. Oczywiście rsyslogd zastępuje syslogd, ale najwyraźniej zastępuje również klogd (rodzaj: patrz uwagi na końcu).
Trzecia część polega na tym, że wiadomości zapisane do bufora pierścienia jądra z przestrzeni użytkownika wyglądają inaczej niż wiadomości napisane z przestrzeni jądra: mają inną funkcję. dmesg ma kilka opcji, które oddziałują z tym: -x
pokaże siłownia (i priorytet), podczas -u
i -k
powiedzieć dmesg, aby wyświetlić tylko wiadomości facility użytkowników i wiadomości facility jądro, odpowiednio.
Oto klinkier: domyślnie rsyslogd ignoruje wiadomości z funkcją inną niż jądro podczas odczytywania wiadomości z bufora pierścieniowego jądra. Odpowiednią opcją konfiguracji jest $KLogPermitNonKernelFacility
, która jest domyślnie wyłączona i musi być włączona, jeśli chcesz, aby rsyslogd przetwarzał te wiadomości. Zauważ, że reszta konfiguracji rsyslogd będzie traktować wszystkie wiadomości z bufora pierścieniowego jądra jako posiadające taką funkcję kern
, niezależnie od tego, jaką funkcję miały w buforze pierścieniowym jądra.
Więcej informacji
syslog
Kod może zapisywać do syslog, wywołując funkcję glibc syslog()
opisaną w man 3 syslog
. Najwyraźniej te funkcje piszą do /dev/log
. Kod może czytać z syslog, czytając /dev/log
i to właśnie robi syslogd
i jego zamienniki. rsyslogd
czyta /dev/log
używając swojego imuxsock
modułu wejściowego.
Bufor pierścieniowy jądra
Przestrzeń jądra zapisuje w tym buforze, wywołując funkcję jądra printk()
, dlatego czasami nazywana jest buforem printk. Przestrzeń użytkownika może do niej pisać, pisząc na /dev/kmsg
. Przestrzeń użytkownika może czytać z tego bufora na kilka sposobów: może czytać z /proc/kmsg
(co domyślnie robi dmesg) lub może czytać z /dev/kmsg
lub może wywoływać wywołanie systemowe syslog()
, które jest opisane w man 2 syslog
i jest całkowicie różne od syslog()
opisanej funkcji glibc w man 3 syslog
. glibc faktycznie zapewnia otoki wywołania systemowego syslog()
, wywoływanego klogctl()
, aby złagodzić to zamieszanie.
Tradycyjnie klogd
czyta z jednego z tych interfejsów, a następnie wywołuje funkcję glibc w syslog()
celu skopiowania ich do syslog. rsyslogd czyta jeden z tych interfejsów przez swój imklog
moduł wejściowy, ale AFAIK nie zawraca sobie głowy wywołaniem glibc syslog()
, dlatego nie jest dokładnie taki jak klogd; po prostu przetwarza dane wyjściowe, imklog
tak jak przetwarza dane wyjściowe z dowolnego innego modułu wejściowego. Dodano dodatkowe zastrzeżenie, że wszystkie imklog
dane wyjściowe mają funkcję kern
niezależnie od komunikatów funkcji w buforze pierścienia jądra.
Referencje
dmesg
ale nie miała żadnego sensu bez podanego tutaj kontekstu.