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