1. Syslog-NG (nem csak) fejlesztőknek
Molnár István (Kayapo)
Pásztor János (janoszen)
1/40
2. A Docler Akadémia
● A Docler Holding belső előadás-sorozataként jött létre.
● Ez a második nyilvános előadás.
● Minden kedden 18:30-tól várunk egy-egy érdekes
témával.
● További infók a
http://www.facebook.com/doclerakademia oldalon.
2/40
3. Miért erről és miért nektek?
● A logolás fontos, de sokszor elhanyagolt téma.
● A logolás nem csak a rendszergazda feladata!
● Ti tervezitek meg az alkalmazásokat, amik logolni
fognak.
3/40
6. A rossz logüzenet
● Túlzott rövidség / érthetetlenség
● „App start”
● „Error 42”
● „Exception thrown without a stack frame in Unknown
on line 0”
● „Parse error: syntax error, unexpected
T_PAAMAYIM_NEKUDOTAYIM in ...”
6/40
7. A rossz logüzenet
● Túlzott bőbeszédűség (zaj)
● java.lang.NullPointerException
at com.mysql.jdbc.Statement.setMaxRows(Statement.java:2178)
at coldfusion.server.j2ee.sql.JRunStatement.setMaxRows(JRunStatement.jav
a:214)
at coldfusion.sql.Executive.executeQuery(Executive.java:1229)
at coldfusion.sql.Executive.executeQuery(Executive.java:1008)
at coldfusion.sql.Executive.executeQuery(Executive.java:939)
at coldfusion.sql.SqlImpl.execute(SqlImpl.java:325)
at coldfusion.tagext.sql.QueryTag.executeQuery(QueryTag.java:831)
at coldfusion.tagext.sql.QueryTag.doEndTag(QueryTag.java:521)
at
cfhetkoor2ecfm251397670.runPage(E:westlandkoorconcordia.nlwwwrooth
etkoor.cfm:1)
at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:192)
at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:366)
at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65)
........... És így tovább hosszasan ......
7/40
8. A jó logüzenet
● Tömör, de érthető.
● Nem tartalmaz trace-jellegű adatot, hanem egy linket,
ahonnan a trace letölthető.
● Tartalmaz minden lényeges információt, amiből
kideríthető, mi történt.
● De ennél semmivel sem többet.
● Például:
● User login gipszjakab from 127.0.0.1
● Access denied to http://example.com/test user
gipszjakab from 127.0.0.1 by access rule 62
8/40
10. Az alkalmazás fájlba ír
● Jó, mert:
● Van logolás
● Mivel az alkalmazás saját mappáiban van, (általában) gyorsan
elérhető.
● Hibás, mert:
● Az alkalmazás törölni is tudja a logokat.
● A log file-ok nem rotálódnak, egyre nő a méretük.
● Egy idő múlva senki nem emlékszik, miért ilyenek a logfájlok.
● Nincs bufferelés, az üzenetek szinkron írása terheli a
fájlrendszert.
● Konkurencia problémák léphetnek fel.
● Alkalmazás összeomláskor nem keletkezik log.
10/40
11. Az alkalmazás STDERR-re ír
● Jó, mert:
● Van logolás.
● Szabványos interfaceket használ.
● Hibás, mert:
● Nehezen kezelhető.
● Első sorban csak konzolos szoftvereknél működik.
● Csábító a 2>/dev/null használata.
11/40
12. Az alkalmazás mailt, stb. küld
● Jó, mert:
● A fejlesztő azonnal értesül a problémáról.
● Hibás, mert:
● Egy szerencsétlenül elkövetett végtelen ciklus
beborítja a mailszervert.
● Az alkalmazás elhalálozása (PHP fatal error) nem jut
el a fejlesztőig.
● Üzemeltetésileg a lehető legrosszabb megoldás.
12/40
14. Követelmények
● Legyen aszinkron!
● Tudjon bufferelni!
● Legyen skálázható több szerveren keresztül!
● Ne a logolás legyen a szűk keresztmetszet!
● Legyen egyszerű használni!
14/40
15. A Syslog protokoll
● Az 1980-as évek óta létezik.
● Eredetileg a Sendmailhez találták ki.
● Szabályozza a logüzenetek formátumát.
● Szinte az összes rendszer eszközön keresztül működik.
(Hálózat, Unix socket, stb)
● De facto szabvány a Unix világban.
● Kiforrott és jól működő nyílt forrású eszközök vannak rá.
15/40
17. Syslog szabályok fejlesztőknek
● SOHA ne használd a LOG_CONS opciót, kivéve ha a
rendszergazda kifejezetten kérte. (Ez ugyanis a szerver
konzolra ír.)
● Mindig a megbeszélt log facilityt és program nevet
használd!
● Készítsd föl a programodat, hogy development, testing /
stage illetve éles környezetben más log opciókkal,
program névvel és facilityvel működhessen.
● Tegyél különbséget a log levelek között!
17/40
18. A Syslog-NG
● Magyar termék. (A Balabit IT Security fejleszti.)
● Robusztus és nagy teljesítményű.
● Rendkívül jól dokumentált.
● Nagyon flexibilis.
18/40
20. Log source
● A teljesség igénye nélkül:
● Internal
● TCP/UDP
● Socket
● File
● Named pipe (FIFO)
● Itt adjuk meg a logüzenetek forrását.
20/40
21. Filterek
● A teljesség igénye nélkül:
● Logot küldő szerver
● Logot fogadó szerver
● Log level
● Log priority
● Log facility
● Log tag
● Üzenet tartalom
● Ezzel szűrhetjük meg az üzeneteket.
21/40
22. Log destination
● Megint csak a teljesség igénye nélkül:
● Program
● SQLdb
● Network (TCP/UDP)
● File
● Named pipe (FIFO)
● Itt adjuk meg a lehetséges log célpontokat.
22/40
23. Log path
● Tartalmaz:
● Egy vagy több log source-t.
● Egy vagy több destinationt.
● Tartalmazhat filtereket.
● Tartalmazhat parsereket és rewriteokat. (Ezekről
mindjárt lesz szó.)
● Ez vezérli a logüzenetek útját.
23/40
25. Buffering
● Megvéd az átmeneti szolgáltatás-kimaradás okozta
logveszteségtől. (Pl. újraindítjuk a logszervert.)
● A bufferben tartott logsorok számát adhatjuk meg.
● Például:
destination d_tcp {
tcp("1.2.3.4"); log_fifo_size(2000);
};
● A Premium változatban van disk buffering is. Ezt a
log_disk_fifo_size() opcióval állíthatjuk.
25/40
26. Regexp matching
● Megadhatunk egy reguláris kifejezést, majd a match
groupok eredményét felhasználhatjuk.
● Filterezés:
filter f_log {
message("^([^t]+)t([^t]+)t([^t]+)t([^t]+)$" flags("store-
matches"));
};
26/40
27. Regexp match group felhasználás
● Az előbb kapott részeket felhasználjuk, itt egy SQL
táblába tesszük be:
destination d_mysql {
sql(
type(mysql)
host("localhost") username("syslog”) password("valamirandom")
database("mylog”)
table("logs")
columns("logfield1 VARCHAR(24)", "logfield2 VARCHAR(24)",
"logfield3 VARCHAR(24)", "logfield4 VARCHAR(24)")
indexes("logfield1","logfield2","logfield3","logfield4")
values("$1", "$2", "$3", "$4")
);
}
27/40
28. Logrotálás
● Templatek alapjáni logfájlok, logtáblák.
● Igen, a Syslog NG meg tudja csinálni magának az SQL
táblákat.
● Például:
destination d_mysql {
…
table("log_${R_YEAR}_${R_MONTH}_$
{R_DAY}");
…
};
28/40
32. PHP loglevel változtatás
● A PHP hibák súlyosságtól függetlenül notice szintű üzenetként
érkeznek. Ez kevéssé praktikus, ezért célszerű ezt
megváltoztatni.
● A PHP üzenetet feldolgozzuk és újra beküldjük a Syslog-NG-
nek:
filter f_php_error { match("PHP Fatal error" value("MESSAGE")); };
destination d_php_error { program("/usr/bin/logger -p user.err -t php
-u /var/run/php-log" template("$MSGONLYn")); };
log { source(src); filter(f_php_error); destination(d_php_error); };
source s_php {unix-stream("/var/run/php-log");};
log { source(s_php); destination(d_syslogserver); };
32/40
33. Syslog-NG failover
● A megoldás viszonylag egyszerű: az üzeneteket két hostra
küldjük, majd szükség esetén összefésüljük:
destination d_syslog1 { tcp("syslog1.int.example.com"); }
destination d_syslog2 { tcp("syslog2.int.example.com"); }
log {
source(s_all);
destination(d_syslog1);
destination(d_syslog2);
};
● Az összefésüléshez célszerű a forrásnál az üzeneteket
egyedi azonosítóval ellátni.
33/40
34. Log gyűjtés és aggregálás
● A feladat egyszerű: gyűjtsünk számszerű adatokat
tartalmazó logokat és aggregáljuk őket.
● A megoldáshoz használjuk a már említett tab szeparált
formátumot (az adatainkat tabulátorokkal szeparáljuk), majd
töltsük be SQL-be.
● A táblaformátumot adjuk meg úgy, hogy óránként más
legyen a tábla neve.
● Futtassunk le óránként egy SQL lekérdezést, ami egy másik
táblába aggregálja a logokat. Például BASH-ben:
LASTHOUR_PARAM=$(date -d'1 hour ago' '+%Y-%m-%d %H:00:00')
LASTHOUR_TABLE=$(date -d'1 hour ago' '+%Y_%m_%d_%H')
mysql stat -e "INSERT INTO stat_hourly
SELECT '${LASTHOUR_PARAM}' AS hour, COUNT(*) AS entries,
SUM(field1) AS field1 FROM log_${LASTHOUR_TABLE}"
34/40
36. Syslog-NG használat
● Ha saját szerveren vagy virtuális gépen lakik a
szolgáltatásotok, semmi akadálya a Syslog-NG
használatának! Üljetek le a rendszergazdával,
beszéljétek meg, mire van szükségetek!
● Ha osztott tárhelyen vagytok, viszonylag kicsi az esélye,
hogy működik az ilyen jellegű logolás, de:
● A DotRoll 2011-es fejlesztési tervében van egy
fejlesztési projekt, aminek a célja, hogy a
felhasználónként különálló /dev/log keletkezzen, az
ebben gyűlő adatok pedig egy webes felületen
elérhetőek legyenek.
36/40
37. Mit kapunk a pénzünkért?
● Ha a fizetős változatok valamelyike mellett döntünk,
kapunk az ingyenes változaton felül:
● Windows log agentet.
● Titkosított, külső időpecséttel ellátott logstoret.
● Lemezre való bufferelési lehetőséget.
● Beépített HA támogatást.
● Webes felületet.
● És még sok más jó dolgot.
37/40
38. További olvasmányok
● Balabit weboldal:
http://www.balabit.com/
● Syslog-NG 3.1 Administrator Guide
http://www.balabit.com/support/documentation/syslog-
ng-ose-v3.1-guide-admin-en_0.pdf
● RFC-k:
● RFC 3164 - The BSD syslog protocol
● RFC 5424 - The Syslog Protocol
● RFC 5425 - Transport Layer Security (TLS) Transport
Mapping for Syslog
● RFC 5426 - Transmission of Syslog Messages over UDP
38/40