Назад | Перейти на главную страницу

Apache в Docker: как мне «access.log»?

Я только начинаю работать с Docker и Richt, сейчас я пытаюсь понять, как настроить свою первую dockerized среду Apache 2 / PHP. До сих пор я использовал полные виртуальные машины Linux, где я использовал файлы журналов, записываемые в / var / log / apache2, а затем использую «logrotate» для перехода к новому файлу каждый день.

Файлы журнала в основном использовались для немедленного обнаружения ошибок (т. Е. Входа на сервер и использования меньшего количества для открытия текущих файлов access.log и error.log) и для fail2ban.

Если я прав, это нецелесообразно в среде Docker - в основном потому, что вы обычно не можете войти в контейнеры, чтобы просмотреть журналы. Также журналы будут потеряны, если контейнер будет удален.

Итак: Каков наиболее распространенный метод работы с / эмуляцией / заменой access.log / error.log в этой ситуации? Каковы общие решения как для производственной среды, так и для среды разработки?

Мои идеи до сих пор включают использование общего ресурса NFS (медленный и может вызвать конфликты имен файлов, если не осторожно) и logstash (не уверен, стоит ли это усилий и возможно ли это для небольших сайтов или даже для среды разработки?), но я уверен, что умные люди придумали лучшие решения?

Не уверен, что это имеет значение, но в настоящее время я основываю свой образ Docker на php: 5.6-apache.

Вы все еще можете использовать docker exec -it <your container name> /bin/bash команда, чтобы попасть в ваш контейнер и выполнять свою обычную работу. Или, может быть, вы можете изменить /bin/bash в вашу команду или скрипт .sh вашей команды, чтобы выполнить его.

Чтобы получить файл из контейнера, используйте docker cp <container name:/path/to/file> </your local machine/path/>

А для повседневной работы вы можете использовать cron для выполнения этих команд. Я настоятельно рекомендую вам иметь псевдоним для часто используемых команд докеров. Так что я могу с удовольствием использовать докер с несколькими ключами.

В docker logs <container name/id> Команда предназначена для просмотра журнала выполнения образа докера. Он показывает перенаправление вывода на стандартный вывод.

Как насчет записи журнала доступа и ошибок в stderr и stdout?

https://mail-archives.apache.org/mod_mbox/httpd-users/201508.mbox/%3CCABx2=D-wdd8FYLkHMqiNOKmOaNYb-tAOB-AsSEf2p=ctd6sMdg@mail.gmail.com%3E

https://gist.github.com/afolarin/a2ac14231d9079920864

RUN ln -sf / dev / stdout /var/log/nginx/access.log

RUN ln -sf / dev / stderr /var/log/nginx/error.log

Централизованное ведение журнала с ELK тем не менее, позволит более активный мониторинг. Но вы уже думали об этом сами.

В файле конфигурации apache вы можете добавить:
CustomLog / dev / stdout
Журнал ошибок / dev / stderr

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

root@my_docker:~ # ls -l /var/log/apache2/
total 0
lrwxrwxrwx 1 root root 11 Jul 17 04:55 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Jul 17 04:55 error.log -> /dev/stderr
lrwxrwxrwx 1 root root 11 Jul 17 04:55 other_vhosts_access.log -> /dev/stdout
root@my_docker:~ #

выбранный мной образ докера просто связал все файлы * .log с / dev / stdout и / dev / stderr, поэтому я не мог их прочитать.

после удаления файлов и перезапуска apache я могу получить журналы из / var / log / в докере.

docker-compose exec apache bash -c "tail -f /var/log/apache2/*.log"

Возможно, эта функция не существовала, когда был задан вопрос, но с аргументом run -v вы можете смонтировать каталог на хосте в каталог в контейнере.

docker run -v [host_dir]:[container_dir]

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

В качестве альтернативы вы можете каким-то образом отправить измененные файлы журнала в центральное место. Стек Kibana использует для этого filebeat, но должна быть возможность запускать filebeat независимо, если вам не нужна остальная часть стека.

Пока я нашел "журналы докеров"упоминается несколько раз.

Я абсолютный новичок в Docker, так что это может помочь решить мою проблему, но пока я не полностью понял концепцию этой команды.

Docker, похоже, сохраняет весь вывод stdout в Файлы JSON в / var / lib / docker / container / и дает мне возможность получить к ним доступ через команду logs.

Пока я не уверен, как на самом деле использовать вывод.