Syslog-NG log feldolgozás

Fórumok

Sziasztok,

Nemrég kezdtem el foglalkozni a Syslog-NG naplózó rendszerrel, de az alapok elsajátítása után rögtön el is akadtam... :(
Amit eddig elértem az az, hogy tetszőleges fájlt fel tudok olvastatni, és a log sorokat egy az egyben mysql adatbázisba írom. Itt jön a csavar, hiszen egy text típusú mező kiírt üzenet nem mond túl sokat, ezért gondoltam akkor feldarabolom (http://vimeo.com/27430117). Készítettem egy parser adatbázist, elneveztem az oszlopokat, hivatkoztam a destination-ban, és vártam, hogy az adatok struktúráltan landoljanak a táblában. Ehelyett üres sorokat kapok, és nem tudok rájönni miért is van ez...

Egy-két részlet a konfigból:

Parser adatbázis:

parser pattern_db {
db_parser( file("/var/lib/syslog-ng/patterndb.xml") );
};

Forrás:

source proba_src {
file("/tmp/proba.log" follow_freq(1));
};

Cél:

destination proba_mysql {
sql(type(mysql)
host("localhost") username("asdf") password("asdf")
database("proba") table("log")
columns("datetime varchar(16)", "program varchar(20)")
indexes()
values("$R_DATE", "$DATUM"));
};

Útvonal:

log { source(proba_src); parser(pattern_db); destination(proba_mysql); };

A patterndb egy szabály tartalmaz (@ANYSTRING:DATUM:@), ami mindenre illeszkedik gyakorlatilag. Amikor hozzáadok egy sort a forráshoz, akkor megjelenik egy új sor a táblában, csak az értéket nem hozza át...
Ötlet?

Előre is köszönöm!

Hozzászólások

Nekem jobban bejött az a megoldás, hogy a match() függvényt használom store-matches flaggel és a capture groupokat rakom bele. Ha PREG módban használod, még nevesített változókat is kapsz, hogy igazán jó legyen.

Persze ,hogy nem add hisz ezt irtad "values("$R_DATE", "$DATUM"));" de a parserbe nincs ott.

PL:

parser p_squid {
csv-parser(columns( "SQDATE", "SQRESPONSETIME", "SQUSERIP", "SQUSERHOST",
"SQREQUESTMETHOD", "SQREQUESTURL", "SQFILESIZE", "SQDOWNLOADED",
"SQSQUIDSTATUS", "SQREFERER", "SQUSERAGENT")
flags(escape-none)
delimiters(",")
quote-pairs('""[]')
); };

destination d_mysql {
sql(type(mysql)
host("db.example.org")
username("db_username")
password("db_password")
database("syslog")
table("squid")
columns("date", "responsetime", "userip", "userhost", "requestmethod",
"requesturl", "filesize", "downloaded", "squidstatus", "referer", "useragent")
values("$YEAR-$MONTH-$DAY $SQDATE", "$SQRESPONSETIME", "$SQUSERIP", "$SQUSERHOST",
"$SQREQUESTMETHOD", "$SQREQUESTURL", "$SQFILESIZE", "$SQDOWNLOAD") };

--
1 leszel vagy 0 élő vagy hulla!

Mindjárt előtúrom a xml-t is... Nekem a dokumentációból és a megnézett előadásokból úgy tűnik, hogy a fejlesztők inkább a parserdb-t erőltetik (tartják jobb megoldásnak). Szerintem mindkettőnek vannak előnyei, inkább azért válaszottam az az utóbbit, mert van hozzá egy nagy rakás sablon.

Ilyen sorokat szeretnék majd feldolgozni...


2010-7-27 0:1:11 GMT 10.4.128.82 hostname.local - NAME 10.4.128.20 EMAIL1@domain.hu 1036 201007270002.o6R02bJ11482958@cubedb1 0 0 821 7 2010-7-27 0:1:10 GMT 0 Version: 6.0.3790.3959 - MESSAGE

...de egyelőre még csak azt szeretném, hogy valami bekerüljön az adatbázisba.

@ANYSTRING:DATUM:@

Hi!

Abból a mintából kiindulva amit postoltál ahhoz én inkább a csv-parsert választanám. Alant egy működő megvalósítás csv-parser -el:

parser p_apache {
csv-parser(
columns (
"APACHE.SERVERNAME", "APACHE.REMOTEHOST", "APACHE.REMOTELOGNAME", "APACHE.REMOTEUSER", "APACHE.REQUESTTIME", "APACHE.REQUEST", "APACHE.STATUSCODE",
"APACHE.RESPONSEBYTE", "APACHE.REFERER", "APACHE.USERAGENT"
)
flags(escape-double-char,strip-whitespace)
delimiters(" ")
quote-pairs('""[]')
);
};

destination d_apache_access {
file("/home/${PROGRAM}/log/apache2/${APACHE.SERVERNAME}/access-${YEAR}-${MONTH}-${DAY}-${HOUR}.log"
template("${MESSAGE}\n")
template_escape(no)
# jo lenne itt is a ${PROGRAM} valtozot hasznalni
owner("root")
group("developer")
dir_perm(0770)
perm(0660));
};

log {
source(s_all);
filter(f_apache_access);
parser(p_apache);
destination(d_apache_access);
flags(final);
};

#------ Apache conf -------#

LogFormat "%v %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

CustomLog "|/usr/bin/logger -p local2.info -t kayapo" combined

Illetve ahogy más is írta az xml nélkül nehéz megmondani mi lehet a gond

----
올드보이
http://molnaristvan.eu/

Nos, a csv-parserrel sikerült megoldani nagyjából (valamiért az első oszlopot nem olvassa).

Ennek ellenére a patterndb-vel nem megy. Itt van a teljes XML: http://pastebin.com/1d9TYp9E

Vajon mi lehet a probléma?

A patterndb-dben van egy program pattern definiálva (mailsend), a syslog-ng biztos, hogy ezt a programnevet látja a bejövő üzenetben? Például ki tudja parsolni belőle? Ha üresen hagyod, akkor elkezd matchelni?

Ha elindítod a syslog-ng-t kézzel debug opciókkal és beleküldöd a logot, akkor mit látsz?

syslog-ng -evtdF

up

Postfix log-okat szeretném SQL-be tolni.
Két út áll előttem: rsyslog vagy syslog-ng
Előbbinél egy strukturálatlan halmazt sikerült betolni, ahol minden syslog sor egy rekord az adatbázisban, ezzel ebben a formában baljós dolgozni. De most pofátlan leszek: utóbbival nincs valami out-of-the-box megoldásotok (amivel két napos guglizást spórolhatnék meg)? :)

Köszi, egy próbát mindenképpen megér.

A példában ennél szintaktikai hibát kapok:

destination d_mysql {
sql(
type(mysql) host("localhost") username("syslog") password("") database("syslog")
table("messages_${YEAR}_${MONTH}_${DAY}")
columns("datetime DATETIME", "host VARCHAR(32)", "program VARCHAR(32)", "var1 VARCHAR(255)", "var2 VARCHAR(255)", "var3 VARCHAR(255)")
values("${YEAR}-${MONTH}-${DAY} ${HOUR}-${MINUTE}-${SECOND}", "${HOST}", "${PROGRAM}", "${var1}", "${var2}", "${var3}")
indexes("datetime", "host", "program", "pid", "var1", "var2", "var3"));
);
};

Sajnos, nem.
Valami más lesz.

update:

Ez már így alakul:

options {
stats_freq(3600);
keep_hostname(yes);
flush_lines(16);
log_fifo_size(16384);
};

source s_src {
unix-stream("/dev/log");
file("/proc/kmsg");
internal();
};

destination d_mysql {
sql(type(mysql)
host("localhost") username("xxx") password("xxx")
database("syslog")
table("logs")
columns("host", "facility", "priority", "level", "tag", "datetime", "program", "msg")
values("$HOST_FROM", "$FACILITY", "$PRIORITY", "$LEVEL", "$TAG", "$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC", "$PROGRAM", "$MSG")
indexes("host", "facility", "priority", "datetime", "program"));
};

log { source(s_src); destination(d_mysql); };

Egy dolog hiányzik még a boldogsághoz: el kellene érnem, hogy az egy levélhez tartozó bejegyzések sortörés nélkül, egy sorba kerüljenek.
Gondolom ehhez a Posfix-et kellene hackelgetni.