Na Ubuntu 12.04 najdu zprávy protokolu Upstart v /var/log/syslog
.
Příkazy:
# initctl log-priority info
# initctl emit hello
Protokol:
Apr 1 01:56:56 precise64 kernel: [ 8365.820425] init: Connection from private client
Apr 1 01:56:56 precise64 kernel: [ 8365.821130] init: Handling hello event
Na Ubuntu 13.10 se zprávy nezobrazují v syslog
nebo kdekoli jinde pod /var/log
adresář, i když příkazy jako logger hello
pracovat podle očekávání. Mám je hledat někde jinde? Potřebuji někde změnit nastavení konfigurace?
Existuje otázka o chybě serveru od někoho, kdo se zdá, že má stejný problém na Ubuntu 13.04 a další zde a zde, které mohou také popisovat stejný problém. Tyto otázky bohužel nenabízejí žádné vodítko k vyřešení problému.
Nejlepší odpověď
Upravit 2016-06-02
Pokud se snažíte najít „Zprávy protokolu Upstart“ obecně, zkontrolujte /var/log/upstart/
. To je místo, kde Upstart ukládá stdout
a stderr
ze služeb Upstart. Díky leopdově odpovědi za upozornění.
Pokud hledáte zprávy protokolu od samotného Upstartu, které jsou nakonfigurovány pomocí initctl log-priority
a vysílá je initctl emit
, čtěte dál!
Krátká verze
Záznamy protokolu by se měly ve skutečnosti zobrazit v dmesg. Navzdory tomu nedělají ve výchozím nastavení se zobrazí v /var/log
.
Pokud je chcete v /var/log
také přidejte $KLogPermitNonKernelFacility on
do konfigurace rsyslogd. Navrhuji vytvořit vlastní soubor jako /etc/rsyslog.d/60-custom.conf
abyste se vyhnuli úpravám /etc/rsyslog.conf
, protože to spravuje dpkg. Nyní by se zprávy Upstart měly objevit v /var/log/syslog
, jakmile Upstartu nastavíte log-priority
na info
nebo tak.
Dlouhá verze
Vysledování mi trvalo několik dní, ale Upstart (1.5) zjevně ne log to syslog, to znamená, že nevolá funkci glibc syslog()
. Místo toho se Upstart přihlásí do kruhové vyrovnávací paměti jádra, což je to, co dmesg čte. Nemyslel jsem si, že je to možné aby procesy v uživatelském prostoru zapisovaly do této vyrovnávací paměti, ale zřejmě mohou zápisem do /dev/kmsg
a přesně to Upstart dělá. Takže to je první část skládačky.
Druhá část je, že existuje široce rozšířený názor, že zprávy zapsané do kruhové vyrovnávací paměti jádra jsou jádrem automaticky zkopírovány do syslogu (alespoň jsem si to vždy myslel). Ukázalo se, že to ve skutečnosti provádí démon uživatelského prostoru, tradičně klogd, který funguje v tandemu se syslogd. Je zřejmé, že rsyslogd nahrazuje syslogd, ale zjevně nahrazuje také klogd (tak nějak:viz poznámky na konci).
Třetí částí je, že zprávy zapsané do kruhové vyrovnávací paměti jádra z uživatelského prostoru ve skutečnosti vypadají jinak než zprávy zapsané z prostoru jádra:mají jiné možnosti. dmesg má několik možností, které s tím spolupracují:-x
zobrazí zařízení (a prioritu), zatímco -u
a -k
řekněte dmesg, aby zobrazoval pouze zprávy o zařízení uživatele a zprávy o zařízení jádra.
Nyní je klíčová věc:ve výchozím nastavení rsyslogd ignoruje zprávy s nekernelovým zařízením, když čte zprávy z kruhové vyrovnávací paměti jádra. Relevantní možnost konfigurace je $KLogPermitNonKernelFacility
, která je ve výchozím nastavení vypnutá a je třeba ji zapnout, pokud chcete, aby rsyslogd tyto zprávy zpracovával. Všimněte si, že zbytek konfigurace rsyslogd bude považovat všechny zprávy z kruhové vyrovnávací paměti jádra za zprávy obsahující kern
zařízení, bez ohledu na to, jaké zařízení měli ve vyrovnávací paměti jádra.
Další informace
syslog
Kód může zapisovat do syslog voláním funkce glibc syslog()
, popsané v man 3 syslog
. Tyto funkce zřejmě zapisují do /dev/log
. Kód lze číst ze syslog čtením /dev/log
, a to je to, co syslogd
a jeho náhrady ano. rsyslogd
čte /dev/log
pomocí jeho imuxsock
vstupní modul.
Kruhová vyrovnávací paměť jádra
Prostor jádra zapisuje do této vyrovnávací paměti voláním funkce jádra printk()
, takže se tomu někdy říká printk buffer. Uživatelský prostor do něj může zapisovat zápisem do /dev/kmsg
. Uživatelský prostor může číst z této vyrovnávací paměti několika způsoby:může číst z /proc/kmsg
(co dmesg dělá ve výchozím nastavení), nebo může číst z /dev/kmsg
, nebo může zavolat systémové volání syslog()
, který je popsán v man 2 syslog
a je úplně jiný z funkce glibc syslog()
popsané v man 3 syslog
. glibc ve skutečnosti poskytuje obal pro systémové volání syslog()
s názvem klogctl()
, abychom pomohli zmírnit tento zmatek.
Tradičně klogd
čte z jednoho z těchto rozhraní a pak volá funkci glibc syslog()
zkopírujte je do syslogu. rsyslogd čte jedno z těchto rozhraní prostřednictvím svého imklog
vstupní modul, ale AFAIK se neobtěžuje voláním glibc syslog()
, což je důvod, proč to není přesně jako klogd; pouze zpracovává výstup imklog
stejně jako zpracovává výstup z jakéhokoli jiného vstupního modulu. Je zde přidáno upozornění, že všechny imklog
výstup má kern
zařízení bez ohledu na zprávy zařízení v kruhové vyrovnávací paměti jádra.
Odkazy
- http://upstart.ubuntu.com/cookbook/#initctl-log-priority (nesprávně uvádí, že Upstart se zapisuje do syslog)
- https://www.kernel.org/doc/Documentation/ABI/testing/dev-kmsg
- http://www.gnu.org/software/libc/manual/html_node/Overview-of-Syslog.html
- http://www.rsyslog.com/doc/v5-stable/configuration/modules/imklog.html (Všimněte si, že toto je pro verzi 5 používanou v Ubuntu 12.04. Tyto možnosti jsou v posledních verzích rsyslog považovány za zastaralé)