Рейтинг:0

Aggregate multiple log files in a directory

флаг 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)

флаг us
Rob
Запуск сервера системного журнала чрезвычайно тривиален. Обычно cron уже регистрируется в системном журнале, и этот системный журнал можно легко перенастроить для перенаправления/копирования этих сообщений на этот центральный сервер системного журнала. Это полностью позволяет избежать слияния файлов журнала
Klamber avatar
флаг ru
@Rob Вы случайно не знаете, как связать журналы заданий k3s cron, отправляя их в системный журнал?
Рейтинг:1
флаг ru

Я предлагаю одно решение, которое я сейчас выбрал для себя. Это не тот ответ, который я искал, но тот, который, кажется, плывет по течению. Мне все еще любопытно, может ли это быть обработано какой-либо общей командой Unix.

Во всяком случае, вот что я сделал:

Обычный способ, кажется, использует инструмент под названием свободно, что позволяет собирать логи из различных источников и транспортируйте их в любое место, которое вы считаете нужным - своего рода ETL для журналов.

Я решил отправить журналы на сервер системного журнала, так как он у меня уже был запущен, но вы можете выбрать любой из выходных плагинов здесь: Плагины вывода. Также имеется большой набор дополнительных плагинов: Все плагины

Шаг 1

Получите установку Fluentd с установленным подключаемым модулем remote_syslog. Этого нет в официальном образе докера, но вы можете настроить его самостоятельно.

ОТ свободно/свободно:v1.14.0-1.0
ПОЛЬЗОВАТЕЛЬ root

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

ПОЛЬЗОВАТЕЛЬ свободно говорит

Создайте образ и отправьте его в реестр.

Шаг 2

Затем настройте манифест развертывания Fluentd с утверждениями тома только для чтения для доступа к журналам модулей. Фактические файлы находятся в /var/log/pods/*, а /var/log/containers фактически содержит символические ссылки. Нам нужны настоящие файлы. Эти журналы принадлежат пользователю root на хост-компьютере, и обычный пользователь не будет иметь доступа для их чтения. Нам нужно установить некоторые контексты безопасности. Чтобы все заработало, я использовал корневую группу для fsGroup. Не стесняйтесь копать глубже и найти / прокомментировать наиболее оптимальное решение для этой безопасности.

apiVersion: приложения/v1
вид: развертывание
...
спецификация:
  ...
    спецификация:
      безопасностьКонтекст:
        фсГрупп: 0
      тома:
        - имя: varlogpods-pv
          персистентволумеклайм:
            ClaimName: pvc-var-log-pods
            ...
      контейнеры:
        - имя: свободно
          изображение: ваше/свободное изображение

См. мой полный манифест в этой сути: свободное развертывание

Шаг 3

Перед развертыванием вам также необходимо настроить свободно.conf и описать там некоторые правила.

Мой настроен на соответствие строке журнала следующим образом:

2022-04-26T20:05:00.847016854+03:00 stderr F time="2022-04-26 17:05:00" level=info msg="обработка 3 записей..."

Подробнее о плагине tail: хвост

    <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>

Один важный атрибут конфигурации здесь read_from_head истина который читает файлы журнала сверху. Это необходимо для этого сценария, поскольку журналы модулей меняются, и мы хотим, чтобы Fluentd считывал полный журнал модулей, а не только несколько строк обновления в конце. Для короткого задания cron файл журнала просто появляется, и tail не сообщает о каких-либо начальных строках в нем.

Шаг 4

Поиграйся с конфигом и попробуй, попробуй еще раз. Не забудьте перезапустить развертывание после обновления конфигурации в configMap.

Несколько фрагментов из поисковой выдачи:

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.