我正在用 PHP 构建一个日志解析器,但遇到了 apache 错误日志格式的问题。使用访问日志,很容易看到LogFormat
apache 配置文件中的默认设置,然后检查我的虚拟主机是否有任何自定义设置。
但是通过错误日志,我在 apache 配置中找不到任何内容,并且ErrorLogFormat
在任何地方都没有自定义指令。
我之所以要检查它,是因为文档让我很困惑。以下是一些ErrorLogFormat
来自的指令示例Apache 文档:
#Simple example
ErrorLogFormat "[%t] [%l] [pid %P] %F: %E: [client %a] %M"
#Example (similar to the 2.2.x format)
ErrorLogFormat "[%t] [%l] %7F: %E: [client\ %a] %M% ,\ referer\ %{Referer}i"
#Example (default format for threaded MPMs)
ErrorLogFormat "[%{u}t] [%-m:%l] [pid %P:tid %T] %7F: %E: [client\ %a] %M% ,\ referer\ %{Referer}i"
下面是我在自己的服务器(apache 2.4)上看到的两个日志行示例:
[Sun Sep 27 07:45:01.899495 2020] [ssl:error] [pid 23080] AH01941: stapling_renew_response: responder error
[Wed Sep 30 20:56:31.065219 2020] [reqtimeout:info] [pid 7079] [client x.x.x.x:59452] AH01382: Request header read timeout
这部分%F: %E: [client %a]
(即:fileName、errorCode、clientIP),(或者至少%E: [client %a]
,我找不到任何带有文件名的示例)似乎是倒.如果我认为我自己的解析器是,那么它就能够捕获上面两行日志中的错误代码(AH01941
和)。AH01382
ErrorLogFormat
[%{u}t] [%-m:%l] [pid %P] [client %a] %F: %E: %M
但是如果我按照文档并设置:[%{u}t] [%-m:%l] [pid %P] %F: %E: [client %a] %M
,那么第二行(带有客户端IP)将没有,并且有一条包含错误代码的errorCode
消息( ) :。%M
AH01382: Request header read timeout
那么我如何/在哪里可以获取当前信息ErrorLogFormat
?
答案1
实际上没有默认的 ErrorLogFormat,但有一个函数可以完成这项工作:do_errorlog_defaulthttps://github.com/apache/httpd/blob/trunk/server/log.c#L881
文档举个例子:
#Example (default format for threaded MPMs)
ErrorLogFormat "[%{u}t] [%-m:%l] [pid %P:tid %T] %7F: %E: [client\ %a] %M% ,\ referer\ %{Referer}i"
默认的 ErrorLog 日期/时间格式如下:
[Mon Aug 28 18:38:46.123456 2023]
可以用这个 ErrorLogFormat 字符串重现
ErrorLogFormat "[%{u}t]"
以及其他带有此 LogFormat 字符串的内容:
LogFormat "[%{%a %b %d %T}t.%{usec_frac}t %{%Y}t]"
再举一个例子,紧凑的 ErrorLog 数据/时间字符串如下
[2023-08-28 18:38:46.123456]
可以用这个 ErrorLogFormat 字符串重现
ErrorLogFormat "[%{cu}t]"
以及其他带有此 LogFormat 字符串的内容:
LogFormat "[%{%F %T}t.%{usec_frac}t]"