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!
- 6901 megtekintés
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.
- A hozzászóláshoz be kell jelentkezni
Hű, ennyire még nem vagyok otthon a témában. Egyelőre egy működő változatnak is örülnék... :) Megnézem ezt is doksiban, köszi.
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
db-parser()-t hasznal, nem csv-parser()-t. Mivel a patterndb.xml-t nem latjuk, ezert nem tudni, hogy az biztosan jo-e.
(Mas kerdes, hogy lehet, hogy a csv-parser() jobb lehetne, de az mar reszletkerdes)
--
|8]
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Jah igazad van beneztem.
--
1 leszel vagy 0 élő vagy hulla!
- A hozzászóláshoz be kell jelentkezni
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:@
- A hozzászóláshoz be kell jelentkezni
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/
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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)? :)
- A hozzászóláshoz be kell jelentkezni
Ha a regexpek megfelelnek, akkor sztem ezen a vonalon el tudsz indulni: https://www.mediabirodalom.com/strukturalt-adat-logolasa-syslog-ng-vel/
- A hozzászóláshoz be kell jelentkezni
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"));
);
};
- A hozzászóláshoz be kell jelentkezni
Az indexes opcioi kozott szerepel a "pid", ami nem letezo oszlop (a columns es a values kozott nem szerepel). Bar lehet, hogy nem ez a gond.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
A problema valszeg az, ami nalam az Eximben is. Egy levelhez tetszoleges sor tartozhat, leven lehet tobb cimzettje, stb.
- A hozzászóláshoz be kell jelentkezni
Jogos, marad az, hogy ID alapján keresgélek.
Szeretnék készíteni egy webes frontend-et hozzá.
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni