Логирование веб-приложений: syslog и stdout/stderr?

При разработке веб-проектов я обычно использую логирование двумя способами:

1. Для простых проектов - логи пишутся файл
2. Для крупных проектов - бизнесовые логи пишу в очередь (rabbitmq), а системные логи также в файл. Дальше эти логи забирает logstash и закидывает в elasticsearch.

Также все чаще встречаю два других способа (из всяких докладов и кейсов), которые мне интересны:

1. Логи писать в syslog (rsyslog, nxlog и прочие реализации).
Одно из известных мне преимуществ - производительность.

2. Логи писать в stdout/stder согласно 12 факторной архитектуре.
Как я понял, из преимуществ то, что если у нас много сервисов, то все они пишут лог по одному принципу, и из-за этого можно легко управлять логами всех сервисов.
Т.е. само приложение передает ответственность за управление логами выше.

Если что-то неправильно понял - прошу поправить.

У меня возникло несколько вопросов:

1. В каких случаях обычно пишут логи в syslog ? был ли у вас опыт ?
Какие есть минусы и плюсы ?

2. Честно говоря, мне не совсем понятен принцип отправки логов в stdout.
Во-первых, что значит в stdout ? если это веб-приложение (сайт), то лог сразу будет показан пользователю ?..
Во-вторых, как собирать потом эти логи, если проект не использует например контейнеризацию ?
Какие есть минусы и плюсы у этого подхода ? Какой у вас был опыт ?
  • Вопрос задан
  • 2121 просмотр
Пригласить эксперта
Ответы на вопрос 2
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
1. стандартная служба syslog умеет парсить логи по facility, следовательно можно настроить логирование разных компонентов в разные файлы на уровне syslog, управлять их ротацией.
Также syslog умеет работать с другими syslog, таким образом можно аггрегировать логи с разных машин и управлять ими централизованно.

2. логи отправленные в stdout обычно куда-то перенаправляют, в тот же файл, или сразу грабят в какой-то аггрегатор.
В современное время про stdout чаще всего говорят, когда вы запускаете что-то в контейнере, а контейнер крутится в оркестраторе типа kubernetes/openshift.
В этом случае настраивается внешний сборщик - тот же filebeat, fluentd, logstash или syslog, который собирает логи со всего кластера кубернетес/опенщифт, парсит их и кидает в аггрегатор.
Просто задеплоили новый компонент и по его имени можно фильтровать логи в той же Кибане, при этом нигде не нужно в системе логирования настраивать что-то под новый компонент, все тегируется автоматом.
Ответ написан
Комментировать
@ProFfeSsoRr
Сис.админ по Linux
stdout - это стандартный вывод, обычно это консоль. Вот запустили вы в консоли приложение - и увидели, что оно вам написало, потому что оно выводит сообщения в stdout. И не зря тут std в названии - "стандартный". С ним умеет работать много чего. Вот возьмем допустим systemd: он запускает сервис, его stdout ловится и попадает в journald. Можно куда-нить еще завернуть. Системы управления контейнерами тоже так умеют.

Как собирать? Ну вот вы ж всё умеете, вы там про очереди, logstash пишите - вот, это оно. Вы берете filebeat, ну или там какие еще *beat'ы у него есть, ловите ими вывод ваших приложений и пихаете его в эластик. Ну или допустим fluentbit берёте и им шлете логи в очередь какую-нить, а оттуда уже в хранилку.

1. В каких случаях обычно пишут логи в syslog ?

ну syslog очень много лет, он был еще до всех этих контейнеров и 12-факторных приложений ;) Так что когда-то им пользовались практически все.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы