Puncte:0

Aggregate multiple log files in a directory

drapel ru

I have k3s single node cluster running on a machine. I do not have any logging infrastructure set up yet and I'd leave this as a future learning experience for now.

On that k3s I run some cron jobs which create logs for each of the jobs into a separate file. I can observe them in /var/log/containers/cron-job-* on the host machine. These logs disappear after a certain amount of time(successfulJobsHistoryLimit: 3). New job instances create new log files.

I'm unable to find a simple tool that could watch that logs directory, preferably with a file name pattern, and stream/join those small job logs into a single log file, including new files that are being created. I don't mind if file name is lost, I just want the log lines to end up in one file serving as an archive of all the job runs.

What I have considered?

I could just add a script to cat those files and append into a target file with an interval, but I'd have to keep track which files have already been inserted in case of the jobs get out of sync or the cron interval changes. Also I might like to extend this functionality for pods that are "long-running" and in this case I'd have to start tracking updated lines in logs.

All examples I have found deal with real-time tailing on screen, which Is not what I need. I kind of need multi-tailing into a target log file.

Any ideas? (I'd also accept some kind of simple Kubernetes logging hook example)

drapel us
Rob
Rularea unui server syslog este extrem de banală. În mod normal, cron se înregistrează deja în syslog și acel syslog poate fi ușor reconfigurat pentru a redirecționa/copia acele mesaje către acel server central de syslog. Acest lucru evită complet îmbinarea fișierelor jurnal
Klamber avatar
drapel ru
@Rob S-ar întâmpla să știți cum să conectați jurnalele de job cron k3s care trimit către syslog?
Puncte:1
drapel ru

Ofer o soluție pe care acum am ales-o pentru mine. Nu este răspunsul pe care îl căutam, ci unul care pare să navigheze odată cu curgerea. Sunt încă curios dacă acest lucru ar putea fi gestionat de o comandă Unix comună.

Oricum, iată ce am făcut:

Calea comună pare să folosească un instrument numit Fluentd, care vă permite să colectați jurnalele din diverse surse și transportați-le oriunde considerați potrivit - un fel de ETL pentru bușteni.

Am ales să trimit jurnalele la serverul syslog, deoarece aveam deja unul care rulează, dar puteți alege oricare dintre pluginurile de ieșire de aici: Pluginuri de ieșire. Există, de asemenea, un set mare de pluginuri suplimentare: Toate pluginurile

Pasul 1

Obțineți o configurare Fluentd care are instalat pluginul remote_syslog. Aceasta nu vine cu imaginea docker oficială, dar o puteți configura singur.

DE LA fluent/fluentd:v1.14.0-1.0
rădăcină UTILIZATOR

# https://github.com/fluent-plugins-nursery/fluent-plugin-remote_syslog
RUN fluent-gem install fluent-plugin-remote_syslog

UTILIZATOR fluent

Creați imaginea și trimiteți-l în registry.

Pasul 2

Apoi configurați un manifest de implementare Fluentd cu revendicări de volum numai pentru citire pentru a accesa jurnalele pod. Fișierele reale se află în /var/log/pods/* și /var/log/containers conține de fapt legături simbolice. Avem nevoie de fișiere reale. Aceste jurnale sunt deținute de root pe mașina gazdă și utilizatorul fluent nu va avea acces să le citească. Trebuie să setăm niște contexte de securitate. De dragul ca lucrurile să funcționeze, am folosit grupul rădăcină pentru fsGroup. Simțiți-vă liber să cercetați mai profund și să găsiți/comentați cea mai optimă soluție pentru această securitate.

apiVersion: apps/v1
fel: Desfăşurare
...
specificație:
  ...
    specificație:
      securityContext:
        fsGroup: 0
      volume:
        - nume: varlogpods-pv
          persistentVolumeClaim:
            claimName: pvc-var-log-pods
            ...
      containere:
        - nume: fluentd
          imagine: imaginea ta/fluentd

Vedeți manifestul meu complet în acest articol: fluentd-desfăşurare

Pasul 3

Înainte de implementare, trebuie, de asemenea, să configurați fluent.conf și descrieți câteva reguli acolo.

Al meu este setat să se potrivească cu o linie de jurnal ca aceasta:

2022-04-26T20:05:00.847016854+03:00 stderr F time="2022-04-26 17:05:00" level=info msg="procesează 3 înregistrări..."

Pentru mai multe detalii despre pluginul tail: coadă

    <source>
      @type tail
      @id in_tail_container_logs
      path "/var/log/pods/default_cron-*/*/*.log"
      pos_file "/tmp/cron_.log.pos"
      read_from_head true
      tag cron
      <parse>
        @type regexp
        expression /^(?<logtime>[^ ]*) .* level=(?<level>[^ ]*) msg="(?<message>[^"]*)"$/ 
        time_key logtime
        time_format %FT%T.%N%:z
      </parse>
    </source>
    
    <match cron>
     @type remote_syslog
     host 172.16.3.10
     port 514
     protocol udp
     severity info
     program "fluentd"
     hostname "k3sserver"
     
     <buffer>
     </buffer>
     
     <format>
      @type single_value
      message_key message
     </format>
    </match>

Un atribut de configurare important aici este read_from_head adevărat care citește fișierele jurnal de sus. Este necesar pentru acest scenariu, deoarece jurnalele pod se rotesc, dorim ca Fluentd să citească întregul jurnal pod, nu doar câteva linii de actualizare în final. Pentru job cron scurt, fișierul jurnal apare și tail nu va raporta nicio linie inițială în el.

Pasul 4

Luați în considerare configurația și încercați, încercați din nou. Nu uitați să reporniți implementarea după ce ați actualizat configurația în configMap.

Câțiva biți din traseul de căutare:

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.