Heroku описывает журналы в своем Twelve-Factor App manifest как простые потоки событий:
Журналы - это поток агрегированных, упорядоченных по времени событий, собранных из выходных потоков всех запущенных процессов и вспомогательных служб. Журналы в их исходной форме обычно представляют собой текстовый формат с одним событием на строку (хотя обратные трассировки из исключений могут охватывать несколько строк). Журналы не имеют фиксированного начала или конца, но поток непрерывно, пока приложение работает.
Кроме того, приложения должны просто записывать журналы на stdout
, оставляя задачу в "среде".
Приложение с двенадцатью фактором никогда не касается маршрутизации или хранения его выходного потока. Он не должен пытаться писать или управлять лог файлами. Вместо этого каждый запущенный процесс записывает поток событий, небуферизованный, в стандартный вывод. Во время локального развития разработчик будет рассматривать этот поток на переднем плане своего терминала, чтобы наблюдать за поведением приложений.
В процессе развертывания или производства каждый поток процесса будет захвачен средой исполнения, сопоставлен со всеми другими потоками из приложения и маршрутизирован в один или несколько конечных пунктов назначения для просмотра и долгосрочного архивирования. Эти архивные адресаты не отображаются или не настраиваются приложением, а полностью управляются средой исполнения. Для этой цели доступны маршрутизаторы журналов с открытым исходным кодом (такие как Logplex и Fluent).
Итак, что лучший способ достичь этого в докерной среде с точки зрения надежности, эффективности и простоты использования? Думаю, на ум приходят следующие вопросы:
- Можно ли полагаться на собственный журнал Docker (
docker logs
)? - Можно ли безопасно запускать докеры и рассматривать его вывод как поток ведения журнала?
- Может ли
stdout
перенаправляться непосредственно на файл (дисковое пространство)? - Если вы используете файл, он должен находиться внутри изображения докеры или связанного тома (
docker run --volume=[]
)? - Требуется ли лотрование?
- Безопасно ли перенаправить stdout прямо в logshipper (и какой logshipper)?
- Есть ли именованный канал (aka FIFO) вариант?
- (больше вопросов?)