Apache 访问日志格式不正确

Posted

技术标签:

【中文标题】Apache 访问日志格式不正确【英文标题】:Apache access log is formatted incorrectly 【发布时间】:2019-04-14 06:17:50 【问题描述】:

我正在尝试添加一个监控系统来解析我的 Apache 日志。我在 AWS Elastic Beanstalk AMI(Amazon Linux,ami-655e8e0a)上运行。

查看我的 apache conf 文件 (/etc/httpd/conf/httpd.conf) 有以下 sn-p:

<IfModule log_config_module>
    #
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    #
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%Refereri\" \"%User-Agenti\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%Refereri\" \"%User-Agenti\" %I %O" combinedio
    </IfModule>

    #
    # The location and format of the access logfile (Common Logfile Format).
    # If you do not define any access logfiles within a <VirtualHost>
    # container, they will be logged here.  Contrariwise, if you *do*
    # define per-<VirtualHost> access logfiles, transactions will be
    # logged therein and *not* in this file.
    #
    #CustomLog "logs/access_log" common

    #
    # If you prefer a logfile with access, agent, and referer information
    # (Combined Logfile Format) you can use the following directive.
    #
    CustomLog "logs/access_log" combined
</IfModule>

示例实际日志行如下所示:

1.2.3.4 (-) - - [11/Nov/2018:06:41:59 +0000] "GET /myproj/ HTTP/1.1" 200 1500 "-" "ELB-HealthChecker/2.0"

查看conf文件中'combined'格式的定义,看起来IP地址(%h)和时间戳(%t)之间应该只有两个字段,但我数了三个(“ (-)”和两个“-”)。这会导致监控系统的默认 Apache 日志解析器失败。

首先,括号中的这个连字符很奇怪——为什么它在括号中?其次,为什么有三个字段而不是两个?第三,当我在 conf 文件中编辑 'combined' LogFormat 行时,它不会更改实际日志。

我发现的唯一解决方法是创建一个具有不同名称的新 LogFormat,并将 CustomLog 更改为使用它而不是使用“组合”LogFormat。它看起来 就像 'combined' LogFormat 行,除了它有一个不同的名称,但日志出来很好 - 没有额外的 '(-)' 部分,即:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%Refereri\" \"%User-Agenti\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%Refereri\" \"%User-Agenti\"" mytestformat
CustomLog "logs/access_log" mytestformat

为什么实际的默认“组合”定义会添加这个奇怪的“(-)”?它来自哪里?为什么不能改?

谢谢。

【问题讨论】:

更新 - 我刚刚意识到“(-)”是客户端的公共 IP 地址所在的位置(在我的示例日志中,它是一个内部请求,因此没有公共 IP),而行首的 IP 地址是负载均衡器的 IP 地址。问题仍然存在 - 配置在哪里,如何更改它以适合我的监控系统的解析器。 【参考方案1】:

知道了!事实证明,EBS AMI 具有覆盖这些设置的 /etc/httpd/conf.d/wsgi.conf 文件。该文件的最后一行是:

LogFormat "%h (%X-Forwarded-Fori) %l %u %t \"%r\" %>s %b \"%Refereri\" \"%User-Agenti\"" combined

我改成:

LogFormat "%X-Forwarded-Fori %l %u %t \"%r\" %>s %b \"%Refereri\" \"%User-Agenti\"" combined

(删除了%hX-Forwarded-For 周围的括号)现在一切正常!

【讨论】:

以上是关于Apache 访问日志格式不正确的主要内容,如果未能解决你的问题,请参考以下文章

APACHE访问日志格式 和 LogFormat语法

apache访问日志管理

Apache日志解读

Apache访问日志访问日志不记录静态文件访问日志切割

nginx日志不记录静态文件访问和缓存

Apache 配置访问日志