Journalctl: добавить поле _SYSTEMD_UNIT в распечатку журнала

Используя команду:

/ usr / bin / journalctl -o short -f | ncat {some-ip} {некоторый порт}

Для пересылки вывода журнала в какое-либо удаленное приложение для отслеживания журнала.

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

например, это строка nginx:

25 июня, 07:51:09 localhost bash [497]: 10.23.132.98 - - [25 / Jun / 2014: 07: 51: 09 +0000] "GET /page.html HTTP / 1.1" 200 321 "https: // {ip} "" Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome/35.0.1916.153 Safari/537.36"

В журнале есть bash [497] - PID процесса. Как я могу добавить больше данных в журнал? Например, имя контейнера Docker для этого PID или имя службы / подразделения systemd?

4 ответа

Решение

В конце концов, я реализовал это по-разному

каждый сервис / системный модуль имеет скрипт пост-выполнения, который использует:

/ usr / bin / journalctl -u {имя устройства} -o short -f | sed 's/^/{имя устройства}/' | ncat {some-ip} {некоторый порт}

Теперь у меня есть имя устройства в начале строки журнала! и у моего сборщика журналов есть имена единиц в сообщении!

пример

journalctl -u mongodb.service -o short -f | sed 's / ^ /mongodb.service /' | ncat {some-ip} {некоторый порт}

будет выводить:

mongodb 26 июня 09:11:35 localhost bash[1710]: 2014-06-26T09:11:35.714+0000 [rsHealthPoll] информация о replset mongodb-0:27017 сбой сердцебиения, повторная попытка

Python может сделать это:

from systemd import journal

j = journal.Reader()
j.this_boot()
j.add_match(_SYSTEMD_UNIT="newnginx.service")
for entry in j:
   print('{} {}'.format(entry['_SYSTEMD_UNIT'], entry['MESSAGE']))

(питон на CentOS 7)

Не использовать -o shortудаляет информацию!

пытаться -o json или же -o verbose

Вместо _SYSTEMD_UNIT поле использовать имя контейнера.

Я приземлился здесь, потому что docker stack/swarm отсутствует docker-compose logs функция регистрации всех услуг на одном узле.

С версией сервера Docker: 18.03.0-ce и версией 3.6 докера можно отправлять все журналы в journald и регистрировать их по имени службы. Чтобы идентифицировать каждый контейнер, пометьте их именем изображения. Смотрите раздел ведения журнала docker-compose.dev.yml

Докер Составьте:

version: '3.6'
networks:
    skynet:
    driver: overlay
services:
    mongo:
        image: mongo:3
        networks:
            - skynet
        volumes:
            - /data/mongodb:/data/db
        logging:
            driver: "journald"
            options:
                tag: "{{.Name}}"
                labels: "com.docker.stack.namespace"

journalctl:

sudo journalctl -b -o short --all -f COM_DOCKER_STACK_NAMESPACE=skynet 

Команда Docker:

docker stack deploy -c docker-compose.dev.yml skynet

Будет вывод: skynet_mongo.1.ins4s13luwiekrri3m5a8vwwl

Apr 24 14:23:08 c-wrk skynet_mongo.1.ins4s13luwiekrri3m5a8vwwl[19410]: 2018-04-24T12:23:08.212+0000 I NETWORK  [listener] connection accepted from 10.0.0.10:36518 #3 (3 connections now open)

Используйте полные заметки:

Для просмотра доступных ярлыков используйте: docker inspect -f {{.Config.Labels}} <docker-id>

Доступные теги: настройка вывода драйвера журнала

Конфигурировать драйвер журнала journald: драйвер ведения журнала Docker Journald

Colorize log output: используйте journalctl | ccze -A

Другие вопросы по тегам