Fluentd konfig

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 )?\[(?<client_ip>[[:xdigit:].:]{3,39})\]:.*/
  </parse>
</filter>

Hozzászólások

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.

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?

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

Sziasztok,

A fentiekkel kapcsolatban érdekelne, hogy 4 év után történt-e valami változás ezen a téren.
Főleg az a része, hogy ha elkezdem használni a Fluentd-t, akkor tényleg kell egy ElasticSearch meg Kibana vagy Grafana konténer is, hogy tudjam webes felületen nézni / keresni a logokat?
Ágyúval verébre érzésem van, mivel nem lesz valami nagy terhelés a gépen.
Néztem már a fluentd-ui-t is, de írják, hogy a fluent v1-es verzióval már nem működik együtt.

Szóval ott tartok, hogy írok valami hasonlót mint ez https://www.npmjs.com/package/frontail, mert 2 éve már ezt sem frissítik.

Van esetleg valakinek tudomása, más egyszerű megoldásról erre vonatkozóan?
Meg az is kérdéses számomra, hogy ilyen esetben hogyan használhatom a fail2ban-t?
Vezessem ki külön log-ba a fluentd-ből és arra engedjem rá? Viszont akkor valahogy ugyanolyan formában kellene lennie mint ahogy a postfix létrehozza, hogy a regex-ek működjenek.

Köszi!

ha elkezdem használni a Fluentd-t, akkor tényleg kell egy ElasticSearch meg Kibana vagy Grafana konténer is, hogy tudjam webes felületen nézni / keresni a logokat?

Nem. Lehet mást is használni erre a célra... ;-)

A fluentd egy log gyűjtő/manipuláló/továbbító cucc, nem feladata a webes felületen nézegetés/keresés.

más egyszerű megoldásról erre vonatkozóan?

Loki + Grafana. Az Elasticnál kevesebb erőforrást zabál, de nem nullát.

Tudom, hogy a fluentd mit csinál, és jó is, mert olyan kell amit be tudok állítani a Docker-ben, hogy oda menjenek a logok.
Köszi, bár a Loki + Grafana is valószínűleg sok, mert csak egy levelezést kiszolgáló szerverről van szó és nem terveztem memóriát bővíteni.
Persze küldhetném a logokat másik szerverre is, de ezt meg más nem szeretné :)
Most felraktam a mongo_out plugint és szépen átmennek oda a logok és mivel a mongo-t meg a nodejs-t már jól ismerem, tervezem, hogy írok rá valami UI-t.
Ugyanúgy a fluentd konténerben futna, tehát elvileg 1 konténerrel megoldom (vagyis 2, mert a mongo külön van :)

és nem terveztem memóriát bővíteni.

Most felraktam a mongo_out plugint és szépen átmennek oda a logok és mivel a mongo-t meg a nodejs-t már jól ismerem, tervezem, hogy írok rá valami UI-t.

Nos, ha fogadnom kellene, akkor arra tenném a tétjeimet, hogy ez így minden lesz, de leginkább lassú :D

De hajrá, kívánom, hogy sikerüljön.

Olyan sok adatot nem kellene kezelnie, viszont a Mongo alapból szeret sok memóriát enni, így keresgéltem tovább
és eljutottam a ClickHouse-ig (https://clickhouse.com/) onnan meg a Loghouse-ig (https://github.com/flant/loghouse)
Ez kb. az amit én is akarok, csak 2 éve már nem fejlesztik, mert hogy Loki-znak.
Keresgélek még, de azért megnézek egy Loki-s videót is. :)
Köszi a válaszokat!