![将 Apache2 日志写入 stdout/stderr?](https://linux22.com/image/664102/%E5%B0%86%20Apache2%20%E6%97%A5%E5%BF%97%E5%86%99%E5%85%A5%20stdout%2Fstderr%EF%BC%9F.png)
我在 docker 容器中运行 Apache2,并且不想将任何内容写入磁盘,而是将日志写入 stdout 和 stderr。我见过几种不同的方法来实现这一点(Supervisord 和 stdout/stderr, Apache 访问日志到标准输出) 但这些看起来像是黑客行为。默认情况下没有办法这样做吗?
需要明确的是,我不想跟踪日志,因为这会导致内容被写入容器中的磁盘。
答案1
ErrorLog /dev/stderr
TransferLog /dev/stdout
对我来说,ubuntu 和 centos 都可以用
答案2
安装 apache2 包后,将其放入 Dockerfile 中怎么样?
RUN ln -sf /proc/self/fd/1 /var/log/apache2/access.log && \
ln -sf /proc/self/fd/1 /var/log/apache2/error.log
假设这是日志的路径。它适用于 Ubuntu 14.04,也适用于 Ubuntu 16.04。
注意:如果您确定符号链接/dev/stdout
或/proc/stderr
存在,那么您也可以使用它们。我更喜欢真实文件的路径,因为这可以保证存在。
答案3
不是特别要求的答案,但根据您的情况,也许更好的方法是根本不记录到 stdout/stderr。只需将日志以 JSON 格式传输到 cat。这样就无需区分流,因为 json 中可能包含区分它们所需的数据。例如,类似于以下内容。然后可以更轻松地将其提取到 graylog 之类的东西中
GlobalLog "| cat - " gelf
ErrorLog "| cat - "
LogFormat "{ \"apache_log\": \"ACCESS\", \"app_name\": \"apache\", \"Connection\": \"%{X-Forwarded-Proto}i:%{X-Forwarded-Port}i \", \"X-Forwarded-For\": \"%{X-Forwarded-For}i\", \"version\": \"1.1\", \"vhost\": \"%V\", \"short_message\": \"%r\", \"timestamp\": %{%s}t, \"level\": 6, \"user_agent\": \"%{User-Agent}i\", \"source_ip\": \"%a\", \"duration_usec\": %D, \"duration_sec\": %T, \"request_size_byte\": %O, \"http_status\": %s, \"http_request_path\": \"%U\", \"http_request\": \"%U%q\", \"http_method\": \"%m\", \"http_referer\": \"%{Referer}i\", \"X-Powered-By\": \"%{X-Powered-By}i\" }" gelf
ErrorLogFormat "{ \"app_name\": \"apache\", \"apache_log\": \"ERROR\", \"time\":\"%{%Y-%m-%d}tT%{%T}t.%{msec_frac}tZ\", \"function\" : \"[%-m:%l]\" , \"process\" : \" [pid %P:tid %T] \" , \"message\" : \"%M\" ,\ \"referer\"\ : \" %{Referer}i \" }"
还有一个 gelf 日志模块,因此如果您愿意,也可以将数据直接从 apache 传输到 graylog 类型的服务器