Fluentd konfig

 ( ekzsolt | 2018. május 20., vasárnap - 23:14 )

Egy Postfix szerver logjait szeretném Elastisearch DB-be küldeni, hogy Kibana webes felületen kényelmesen tudjak keresni benne. Az Elasticsearch DB felé küldeni a Fluentd megoldása tűnt szimpatikusnak. Az alábbi Fluentd konfig remekül működik is, az ident tag-et átírja a postfix megfelelő alkotórészére.

<source>
  @type syslog
  port 42185
  tag syslog
</source>

<match syslog.mail.info>
  @type rewrite_tag_filter
  <rule>
    key ident
    pattern ^postfix/(.+)$
    tag postfix.$1
  </rule>
</match>

<match postfix.**>
  @type elasticsearch
  logstash_format true
  host elastic.lan
  port 9200
  flush_interval 10s
</match>

Csakhogy úgy lenne értelmes, ha a lobejegyzésekből a Kibana felületen használható index mezőket képeznénk, mert egyelőre minden a "message" nevű mezőbe kerül. Átolvastam a Fluentd dokumentációt (ami többnyire csak referencia, és a példáik nagyrésze ráadásul elavult), és megakadtam, ezért inkább kérdezek, hátha tudna valaki segíteni aki már látott ilyesmit. Hogyan kell a logbejegyzéseket mezőkre bontani?

Ilyesmivel próbálkoztam, ami például kiszedi a client_ip mezőbe az IP címet. De sajnos nem lehet egyszerre több parse tag vagy expression regexp.

<filter postfix.postscreen>
  @type parser
  key_name message
  reserve_data true
  <parse>
    @type regexp
    expression /(DIS)?CONNECT (from )?\[(?[[:xdigit:].:]{3,39})\]:.*/
  </parse>
</filter>

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

ha mar van elasticsearch, meg kibana, akkor logstash nincs? Csak mert ha fluentd-vel nem megy, en megprobalnam a logstash-t is. Tedd fel az elasticsearch melle, es a postfix logjait kuldd at a logstash-nek...

--
"dolgozni mar reg nem akarok" - HZ 'iddqd' zoli berserk mode-ba kapcsol

Nem említettem, de Fluentd azért is tűnt szimpatikusunak, mert egy halom Docker konténer is fut a szerveren, sőt a Postfix-ek is konténerben futnak, és a Dockernek van natív fluentd log-driver-e. Később más alkalmazások logjait is szeretném feldolgozni vele, csak épp egy Postfix loggal kezdtem az ismerkedést. Meg aztán a Logstash Java alapú, és nekem a javas megoldásokról valahogy nem a pehelysúly jut először eszembe, míg a Fluend többek közt ezt állítja magáról.

És csodálkoznék, ha Fluentd képtelen lenne megoldani a fenti kérdést. Csak a fellelhető quick start tutorialok sajnos kimerülnek annyiban, hogy beküldted a logokat ES-be, és OK ennyi.

Az első javaslatot ha próbálom, azt írja "Unknown output plugin 'parser'". Ha a "match raw.postfix.result" tag-et kicserélem filter tag-re, akkor meg: "Unknown filter plugin 'copy'" Talán ez a konfig csak egy régebbi verzióval működhetett.

A másik pedig egy extra plugin. Ki sem szeretném próbálni. A postfix-et csak példának írtam, de volna egy csomó másfajta log is, amit mezőkre kellene bontani, úgysem találnék mindenre plugint, főleg olyat ami a saját környezetemhez illeszkedik.

Egyelőre nagyon úgy tűnik, hogy egy "match"-hez csak egyetlen regexp parser lehet. Csakhogy ennek így semmi értelme. Azért köszönöm a tippet. Bár egy "filename:td-agent.conf" github keresést már csináltam korábban, sajnos nem sok eredménnyel.

https://docs.fluentd.org/v0.12/articles/parser-plugin-overview

Ha nincs gyári plugin, írj egyet. By design ezt adja mint lehetőség. Azzal mondjuk egyet kell értenem, hogy nem túl ops barát kialakítás, de a fejlesztők szeretik

Hát igen, hamarabb keresek inkább más megoldást, mint magam írogassak plugineket :)

Egyébként a postfix filtert egyelőre megoldottam egyetlen szuperhosszú regexp expression-nel |-ekkel elválasztva, ha már nem lehet több expression. Totál átláthatatlan, viszont működik amíg nem kell hozzányúlni.

Azonban lesz itt más probléma is. Kibana felületen megjelennek ugyan a saját mezők, de mindegyik a "_source" alatt. Szűrni éppen lehet rájuk, de a táblázatban való megjelenésüket nem tudom szabályozni, mert ott csak a _source mező van. Igen tudom, újonc vagyok az ELK stack világban, de úgy sejtem, erre is létezik valami megoldás. Lehet Fluentd azért nem ismer több expression-t, mert onnan úgyis elég egyben beküldeni, és Fluentd és Elastic közé kell még valami alkatrész, ami megfelelően szétbontja mezőkre?

Ezt a mostani állapotot pontosan hogyan sikerült elérned?

Beküldenéd erről is a konfigot?

Én még ott akadtam meg, hogy a message-ből parse-oljak ki részt másik fieldbe.

Köszi!

Inkább linkelem, Drupalban beszerkeszteni kész rémálom. https://ghostbin.com/paste/74ekm

Így állok most. A postfix és nginx Docker konténerek syslog-on keresztül küldik a logjaikat. A syslog.mail.info tag-et átírom postfix.-re, amit aztán lehet külön filterezni. Egyelőre smtpd és postscreen, csak hogy lássam jól feldolgozza őket külön. Egy filterhez csak egy parse regexp expression tartozhat. A postscreen-es filternél látszik hogyan csináltam a különböző tartalmú logok mezőkre bontását. De nem vagyok elégedett ezzel, biztosan lennie kell jobb megoldásnak.

Plusz egy nginx access.log feldolgozás is van, ami nálam syslog.local7.info-n jön az nginx konténerből.

A végén ami kész, megy tovább Elasticsearch-be, a maradék pedig stdout-ra (td-agent.log-ba). Ebből gondolom könnyen ki lehet válogatni, amire még szükségem lesz.

Csak továbbra is az a problémám, hogy Elastic-ban minden a _source field alá kerül.

Az elmúlt pár hónap alatt sokat bővült a td-agent.conf. Eddig jól teljesíti az elvárásokat. Egyetlen negatívum, hogy az Elasticsearch egyre több memóriát követel.

Itt az aktuális konfig: https://ghostbin.com/paste/eryw7