将 Apache2 日志写入 stdout/stderr?

将 Apache2 日志写入 stdout/stderr?

我在 docker 容器中运行 Apache2,并且不想将任何内容写入磁盘,而是将日志写入 stdout 和 stderr。我见过几种不同的方法来实现这一点(Supervisord 和 stdout/stderrApache 访问日志到标准输出) 但这些看起来像是黑客行为。默认情况下没有办法这样做吗?

需要明确的是,我不想跟踪日志,因为这会导致内容被写入容器中的磁盘。

答案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 类型的服务器

相关内容