Hlavní navigace

Syslog-ng: pořádek v log souborech

22. 8. 2008
Doba čtení: 6 minut

Sdílet

Systém za dobu svého provozu oznamuje uživateli velké množství informací a tyto informace uchová v tzv. log souborech. Nastavení většiny distribucí je sice ideální pro normálního uživatele, ale pokud se rozhodnete používat více serverových aplikací, mohl by se zažitý koncept logování stát překážkou.

Úvod

Logovacích nástrojů existuje velké množství a každý má své výhody či nevýhody. Jeden může ukládat data do souborů, druhý do databáze, další s nimi ještě může nějakým způsobem dále pracovat. Ve všech případech se jedná o klient-server aplikaci, kdy syslog daemon dělá přijímací část a program, který něco sděluje vysílací část. Komunikace probíhá za pomocí odesílání čistého textu se zprávou, případně dalšími méně důležitými informacemi. Syslog server takové informace příjme, přidá k nim čas a někam je uloží (nejčastěji nějaký soubor). Výhodou tohoto způsobu je, že jeden stroj může shromažďovat informace z programů na několika dalších strojích v celé síti. Pokud pak nastane závada na některém z nich, není zas tak velký problém zjistit hned, co se stalo.

Pro přehlednost a hlavně pro jednoduchou správu je důležité, aby se všechny aplikace v systému chovaly stejně pokud jde o logování zpráv. Největší váhu to má hlavně u serverů, kde se takovýchto hlášení objevuje velké množství. Pokud by si například databáze, web server a e-mail server obhospodařovaly logy ve vlastní režii, každý by to dělal trochu jinak a ve výsledku by se jedna změna (například změna logovacího adresáře) musela provést několikrát.

Trochu historie

Původní syslog vznikl v roce 1980 jako součást projektu Sendmail. Syslog si vedl tak dobře, že se stal takovým nepsaným standardem v unixovém světě. Nakonec ho standardizovala skupina IETF. Je tu s námi tedy již dlouhou dobu a většina aplikací, která nějakým způsobem něco loguje ho podporuje. Také se kolem jeho protokolu vytvořila řada implementací, z nich jedna se jmenuje syslog-ng.

Autorem syslog-ng je Balázs Scheidler, který v roce 1998 portoval nsyslogd na Linux. Na nsyslogd byla založena první vydání z roku 2007, ale později Balázs přepsal jádro celého programu a vznikl tak syslog-ng, jak ho známe a používáme dnes. Za takto krátkou dobu se stal velmi populární a například Debian, Archlinux nebo SuSE ho mají jako výchozí syslogger.

Konfigurace

Syslog-ng má dokumentaci dlouhou 159 stránek a je v ní popsáno všechno možné, co se týká instalace, provozu nebo konfigurace. My si tu ukážeme jen zlomek z celkových možností syslog-ng, který ale bude dostatečný pro většinu uživatelů nebo administrátorů.

Když jsem před pár měsíci řešil problém s logy na serveru, ve kterých jsem se nemohl vyznat a už vůbec jsem je nemohl pohodlně ukládat tak, abych je později našel, zjistil jsem, že můj Debian používá právě syslog-ng. Začal jsem zkoumat možnosti konfigurace a nakonec našel řešení, které by mi vyhovovalo nejvíce. Syslog-ng umožňuje při zadávání cest k log souborům používat proměnné. Ty mohou reprezentovat třeba název programu, den, měsíc, rok, hodinu a další. Co mi nevyhovovalo vůbec, byl nástroj logrotate. Ten sice umožňuje určitým způsobem udržovat logy tak, aby se nerozlézaly po disku, ale také je z mého pohledu značně nepřehledný. Jeho další nevýhodou bylo, že soubory s logy mazal a vytvářel nové. To se samozřejmě nelíbilo službám (buď syslog nebo služby, co si spravují logy samy), když jim log soubory mizely za běhu, a proto musely být resetovány, i když automaticky. Proto jsem se rozhodl upravit nastavení syslog-ng, aby se s logy pracovalo přesně tak, jak chci já.

Než se podíváme na příklad konfigurace, popíšeme si, jak syslog-ng zpracovává zprávy. Tento obrázek z dokumentace to vysvětluje nejlépe:

syslog-ng

Vlevo vidíme znázornění tzv. „zdroje“ (source #1, source #2), všechny zprávy ze všech zdrojů se spojí do jedné fronty a jdou k části, která je zpracuje. Tady lze nakonfigurovat filtry, díky kterým se zprávy podle daných podmínek rozdělí. Pokud syslog-ng udělal se zprávami, co měl nakonfigurováno, odcházejí do svých „cílů“.

Zdrojem je v tomto případe /dev/log. Ten slouží pro sbírání lokálních zpráv. Není to jediné řešení. Takovým zdrojem může být třeba TCP nebo UDP socket, ale i další, méně používané varianty.

Pojďme se podívat na ukázkový konfigurační soubor:

options {
    chain_hostnames(0); #jak se má uhlídat hostname, viz. FAQ
    time_reopen(10); #time out pro znovu otevření spojení
    time_reap(360); #za jak dlouho se má zavřít cíl, pokud není používán
    sync(0); #kolik řádek se má ukládat do bufferu, než se uloží na disk
    log_fifo_size(2048); #počet řádek ve výstupní frontě

    create_dirs(yes); #povolit/zakázat vytváření adresářů

    #práva pro soubory
    owner(root);
    group(adm);
    perm(0640);

    #a adresáře
    dir_owner(root);
    dir_group(adm);
    dir_perm(0755);

    use_dns(no); #povolit/zakázat používání DNS
    log_msg_size(2048); #maximální délka zprávy
    stats_freq(0); #povolit/zakázat statistiku zpráv

    #občas se stane, že je jméno programu vyhodnoceno jako hostname
    #proto řekneme syslog-ng, že cokoli, co sedí na tento regulární výraz
    #neni hostname
    bad_hostname("^gconfd$");
};

source s_all {
        #interní zprávy syslog-ng
        internal();
        #standardní zdroj pro zprávy
        unix-stream("/dev/log");
        #zprávy z kernelu
        file("/proc/kmsg" log_prefix("kernel: "));
};

#cíle
destination df_syslog { file("/var/log/$YEAR/$MONTH/syslog"); };
destination df_cron { file("/var/log/$YEAR/$MONTH/cron.log"); };
destination df_mail { file("/var/log/$YEAR/$MONTH/mail.log"); };
destination df_sshd { file("/var/log/$YEAR/$MONTH/sshd.log"); };
destination df_messages { file("/var/log/$YEAR/$MONTH/messages"); };

#filtry
filter f_cron { facility(cron); };
filter f_sshd { match("^sshd"); };
filter f_mail { facility(mail); };
filter f_syslog { match("^syslog"); };

filter f_messages {
        level(info,notice,warn) and
    not filter(f_cron) and
    not filter(f_lpr) and
    not filter(f_mail) and
    not filter(f_sshd);
};

filter f_xconsole {
    facility(daemon,mail)
    or level(debug,info,notice,warn)
    or (facility(news)
    and level(crit,err,notice));
};

#a nakonec to všechno spojíme
log {
    source(s_all);
    filter(f_sshd);
    destination(df_sshd);
};

log {
    source(s_all);
    filter(f_mail);
    destination(df_mail);
};

log {
    source(s_all);
    filter(f_cron);
    destination(df_cron);
};

log {
    source(s_all);
    filter(f_syslog);
    destination(df_syslog);
};

log {
    source(s_all);
    filter(f_messages);
    destination(df_messages);
}; 

Konfigurační soubor vypadá dlouhý a možná i trochu složitý, ale po pár minutách se dá velmi lehce pochopit. Pro větší přehled jsem vybral pro příklad pouze 4 služby. Na začátku nastavíme některé parametry, které jsem pro jednoduchost okomentoval. Hned za parametry už následuje konfigurace zdrojů, odkud se mají získávat zprávy. Ve zdroji s_all získáváme ze zprávy ze třech vstupů, které jsou také okomentovány. V další části nastavíme cíle. Jsou to cesty k normálním souborům a obsahují proměnné, díky kterým se uloží rozděleně do adresářů podle data. Další částí jsou filtry. V těch se podmínky vykonávají od shora dolů; může to být třeba nějaký regulární výraz, kterým řekneme, které programy se mají zachytit, nebo můžeme použít tzv. facility, což určuje skupinu, ke které se program hlásí (daemon, mail, cron, …). Kombinovat můžeme všechny možnost syslog-ng. Nakonec pomocí log {} určíme, jaký zdroj se má kam uložit a jakými má projít filtry. Filtry jsou vyhodnocovány opět od shora dolů.

Parametrů, které můžeme využít ve filtrech, je celá řada. Jsou odvozeny od závažnosti zprávy, skupiny, názvu programu, obsahu zprávy atd. Více ukáže tato tabulka:

Filtr Popis
facility(skupina) Filtruje podle skupiny
filter(jiny filtr) Filtruje podle jiného filtru
host(hostname) Filtruje podle hostname
level nebo priority(pri1[,pri­2[,…]]) Filtruje podle úrovně
match(regular­ni_vyraz) Filtruje podle regulárního výrazu
netmask(ip/maska) Filtruje podle ip/maska
program(název) Filtruje podle názvu programu

Proměnných, kterých lze využít v cestách k souborům, je velké množství, proto v následující tabulce vybírám jen některé.

Proměnná Popis
$PROGRAM Název programu
$YEAR Rok
$MONTH Měsíc
$DAY Den
$HOUR Hodina
$MIN Minuta
$SEC Sekunda
$WEEK Číslo týdne
$DATE Systémová reprezentace data
$SOURCEIP Zdrojová IP adresa
$UNIXTIME Unixový timestamp
$PID PID procesu
$HOST Hostname

Závěr

Syslog-ng je pro mě perfektní pomocník a umožňuje mi uchovávat logy přesně tak, jak si přeji. Je jen škoda, že distribuce jeho možností nevyužívají naplno. Na druhou stranu není problém si konfiguraci ohnout podle vlastních požadavků. Syslog-ng je také k dispozici v komerční verzi, která má navíc pár vlastností, jako třeba ukládání zpráv do databáze.

Odkazy

Byl pro vás článek přínosný?

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.