Wpis z mikrobloga

#nodejs #elasticsearch #programowanie Czy stawiał z was kiedyś ELK stack na #docker i mógłbym się coś zapytać ? Mianowicie chciałem wysyłać logi z node js przez filebeat -> logstash -> elastic -> kibana. Wszystkie z nich na osobnych kontenerach. Niestety udało mi się jedynie wysyłać logi bezpośrednio z całych -> nie te które storuje w plikach. Generalnie mam problem z pomapowaniem katalogów tak aby zapisane logi na kontenerze A były widoczne na kontenerze B z filebeat. Jakieś pomysły ?
ps. Kontenery widzą się w we własnej sieci plus named_volume nie rozwiązał sprawy.
  • 11
@lukaszwasyl: te kontenery są na jednej maszynie? Jeżeli tak to właśnie named volume powinno działać ok, ja mam taki config:

filebeat:
image: docker.elastic.co/beats/filebeat:6.8.5
command: ["--strict.perms=false"]
restart: on-failure
volumes:
- log_volume:/var/logs
- ./dev/filebeat.yml:/usr/share/filebeat/filebeat.yml

i ładnie logi wchodzą do filebeata.

Jak masz na różnych maszynach to rozważyłbym podpięcie jakiegoś log drivera (np. syslog po tcp do logstasha)
@lukaszwasyl: @alkb: Przede wszystkim Twoja aplikacja w kontenerze A nie powinna zapisywać logów do lokalnego katalogu tylko wyrzucać prawilnie wszystko na stdout. Wtedy w kontenerze z filebeat montujesz /var/lib/docker czy gdzie tam docker u Ciebie zapisuje i zrzucasz tak naprawdę logi z stdout do elasticsearch.
@yggdrasil: Z tego co mówisz to prawdopodobnie coś takiego zrobiłem ale efekt był nie taki jak chciałem. Filebeat był ustawiony na inputy z dockera ( z dokładnych kontenerów ) ale jak generuje logi o formacie json to agregowało też logi w stylu " app is running " a tego nie chce. Generuje określone logi i właśnie je chciałbym transferować gdzieś. Ale popraw mnie jeżeli się mylę ofc.
@alkb: @yggdrasil: Generalnie może wrzuce mój config, będzie łatwiej. link co ewentualnie zmienić. No i w tym przypadku logi zapisuje na kontenerze A. ale też stdoutuje.

const logger = bunyan.createLogger({
name: 'something',
streams: [{
level: 'info',
stream: process.stdout,
},
{
type: 'file',
level: 'info',
path: './logs/something/something.log',

}, ],
});
@lukaszwasyl: Nie mam pojęcia o nodejs, nie potrafię przeczytać tego loga. Ja zbierałem wszystkie logi z kontenera i wrzucałem w takiej formie do elasticsearch. W aplikacji doklejalem sobie trochę więcej info i tyle. Nie zapisywałem logow na dysku bo po co? Według mnie strata czasu.
@yggdrasil: Wiesz, generalnie nie mam jednego kontenera a dodatkowo 4. I jak ściągałem logi bezpośrednio z kontenerów (wszystkich) , to w moment miałem kilkanaście k rekordów. Kiedy ściągałem z dokładnie dwóch kontenerów to miałem plus minus pare setek rekordów ale logowało właśnie to czego niechciałem ( np uruchamianie skryptów ). Dlatego też podpytuję i dziękuje za odpowiedź.
@alkb: Tak też zrobiłem ! Doszedłem do momentu w którym miałem logi jakie chciałem, zrobiłem regexa i miałem tylko te logi ( + meta dane z dockera ale w widoku z logami w kibanie tylko to było ). Rozwiązanie to niestety nie podobało się mojemu przełożonemu bo uznał że to mało skalowalne ( ͡° ʖ̯ ͡°) ( i najlepiej bez meta dockerowych )
@lukaszwasyl: jeżeli przełożony mówił o komunikacji po file systemie to miał rację. Ja doświadczyłem kilku podejść (zakładając że kontenery są rozłozone na kilku maszynach):

- log driver gelf (działało spoko)
- zbieranie stdoutów (trzeba zbierać z każdej maszyny, chyba że o czymś nie wiem)
- log driver cloudwatch (bo czasami powyższa metoda przestawała nam zbierać logi ( ͡° ʖ̯ ͡°)) - polecam jak macie forsę
@alkb: Panie, ja to pierwszy raz robie :D nie dość, że jeszcze uczę się dockera to pierwszy raz dotykam ELK a o gelf czytałem jedynie. Jeżeli chodzi o same kontenery to w założeniu było by to rozłożenie m1: aplikacja m2: elk w produkcji, w devie jak na razie mam jednego compose. Tak czy inaczej, pomyślę jutro jeszcze. Dzięki za pomysły ( )