Apache HTTP 服务器版本 2.4
描述 | 记录对服务器发出的请求 |
---|---|
状态 | 基础 |
模块标识符 | log_config_module |
源文件 | mod_log_config.c |
此模块提供对客户端请求的灵活记录。日志以可自定义的格式写入,并且可以直接写入文件或写入外部程序。提供条件记录,以便可以根据请求的特征将单个请求包含在日志中或从日志中排除。
此模块提供三个指令:TransferLog
用于创建日志文件,LogFormat
用于设置自定义格式,以及 CustomLog
用于在一个步骤中定义日志文件和格式。TransferLog
和 CustomLog
指令可以在每个服务器中使用多次,以使每个请求都记录到多个文件中。
LogFormat
和 CustomLog
指令的 format 参数是一个字符串。此字符串用于将每个请求记录到日志文件中。它可以包含复制到日志文件中的文字字符,以及 C 样式控制字符 "\n" 和 "\t",分别表示换行符和制表符。文字引号和反斜杠应使用反斜杠转义。
请求本身的特征通过在格式字符串中放置 "%
" 指令来记录,这些指令在日志文件中被以下值替换
格式字符串 | 描述 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
%% |
百分号。 | ||||||||||
%a |
请求的客户端 IP 地址(参见 mod_remoteip 模块)。 | ||||||||||
%{c}a |
连接的底层对等 IP 地址(参见 mod_remoteip 模块)。 | ||||||||||
%A |
本地 IP 地址。 | ||||||||||
%B |
响应大小(以字节为单位),不包括 HTTP 标头。 | ||||||||||
%b |
响应大小(以字节为单位),不包括 HTTP 标头。在 CLF 格式中,即当没有发送字节时为 '- ' 而不是 0。 | ||||||||||
%{VARNAME}C |
发送到服务器的请求中 cookie VARNAME 的内容。仅完全支持版本 0 cookie。 | ||||||||||
%D |
为请求提供服务所花费的时间(以微秒为单位)。 | ||||||||||
%{VARNAME}e |
环境变量 VARNAME 的内容。 | ||||||||||
%f |
文件名。 | ||||||||||
%h |
远程主机名。如果 HostnameLookups 设置为 Off (默认值),则会记录 IP 地址。如果它只为少数主机记录主机名,则可能存在按名称提及它们的访问控制指令。参见 Require host 文档。 | ||||||||||
%{c}h |
与 %h 相似,但始终报告底层 TCP 连接的主机名,而不是像 mod_remoteip 这样的模块对远程主机名的任何修改。 | ||||||||||
%H |
请求协议。 | ||||||||||
%{VARNAME}i |
发送到服务器的请求中 VARNAME: 标头行(s) 的内容。其他模块(例如 mod_headers )所做的更改会影响此内容。如果您对大多数模块修改它之前请求标头是什么感兴趣,请使用 mod_setenvif 将标头复制到内部环境变量中,并使用上面描述的 %{VARNAME}e 记录该值。 | ||||||||||
%k |
在此连接上处理的保持活动请求数。如果正在使用 KeepAlive ,则很有趣,例如,'1' 表示初始请求后的第一个保持活动请求,'2' 表示第二个请求,等等;否则,这始终为 0(表示初始请求)。 | ||||||||||
%l |
远程登录名(来自 identd,如果提供)。除非 mod_ident 存在且 IdentityCheck 设置为 On ,否则这将返回一个短横线。 | ||||||||||
%L |
错误日志中的请求日志 ID(如果此请求没有记录到错误日志中,则为 '-')。查找匹配的错误日志行以查看哪个请求导致了哪个错误。 | ||||||||||
%m |
请求方法。 | ||||||||||
%{VARNAME}n |
来自另一个模块的注释 VARNAME 的内容。 | ||||||||||
%{VARNAME}o |
回复中 VARNAME: 标头行(s) 的内容。 | ||||||||||
%p |
为请求提供服务的服务器的规范端口。 | ||||||||||
%{format}p |
为请求提供服务的服务器的规范端口,或服务器的实际端口,或客户端的实际端口。有效的格式为 canonical 、local 或 remote 。 | ||||||||||
%P |
为请求提供服务的子进程的进程 ID。 | ||||||||||
%{format}P |
为请求提供服务的子进程的进程 ID 或线程 ID。有效的格式为 pid 、tid 和 hextid 。 | ||||||||||
%q |
查询字符串(如果存在查询字符串,则在前面加上一个 '? ',否则为空字符串)。 | ||||||||||
%r |
请求的第一行。 | ||||||||||
%R |
生成响应的处理程序(如果有)。 | ||||||||||
%s |
状态。对于已在内部重定向的请求,这是原始请求的状态。使用 %>s 获取最终状态。 | ||||||||||
%t |
接收请求的时间,格式为 [18/Sep/2011:19:18:28 -0400] 。最后一个数字表示与 GMT 的时区偏移量 | ||||||||||
%{format}t |
时间,以 format 给出的形式,该形式应为扩展的 strftime(3) 格式(可能已本地化)。如果格式以 begin: (默认值)开头,则时间是在请求处理开始时获取的。如果它以 end: 开头,则是在写入日志条目时的时间,接近请求处理结束时。除了 strftime(3) 支持的格式之外,还支持以下格式标记
strftime(3) 格式化组合使用。您可以使用多个 %{format}t 标记。 | ||||||||||
%T |
为请求提供服务所花费的时间(以秒为单位)。 | ||||||||||
%{UNIT}T |
为请求提供服务所花费的时间,以 UNIT 给出的时间单位表示。有效的单位为 ms (毫秒)、us (微秒)和 s (秒)。使用 s 与不带任何格式的 %T 给出相同的结果;使用 us 与 %D 给出相同的结果。在 2.4.13 及更高版本中,可以将 %T 与单位组合使用。 | ||||||||||
%u |
如果请求已通过身份验证,则为远程用户。如果返回状态(%s )为 401(未授权),则可能是伪造的。 | ||||||||||
%U |
请求的 URL 路径,不包括任何查询字符串。 | ||||||||||
%v |
为请求提供服务的服务器的规范 ServerName 。 | ||||||||||
%V |
根据 UseCanonicalName 设置的服务器名称。 | ||||||||||
%X |
响应完成时的连接状态
| ||||||||||
%I |
接收的字节数,包括请求和标头。不能为零。您需要启用 mod_logio 才能使用此功能。 | ||||||||||
%O |
发送的字节数,包括标头。在某些罕见情况下可能为零,例如当请求在发送响应之前中止时。您需要启用 mod_logio 才能使用此功能。 | ||||||||||
%S |
传输的字节数(接收和发送),包括请求和标头,不能为零。这是 %I 和 %O 的组合。您需要启用 mod_logio 才能使用此功能。 | ||||||||||
%{VARNAME}^ti |
发送到服务器的请求中 VARNAME: 尾部行(s) 的内容。 | ||||||||||
%{VARNAME}^to |
从服务器发送的响应中 VARNAME: 尾部行(s) 的内容。 |
可以通过在 "%" 后面立即放置一个用逗号分隔的状态代码列表,将特定项目限制为仅对具有特定 HTTP 状态代码的响应进行打印。状态代码列表前面可以加上一个 "!
",表示否定。
格式字符串 | 含义 |
---|---|
%400,501{User-agent}i |
仅在 400 错误和 501 错误上记录 User-agent 。对于其他状态代码,将记录文字字符串 "-" 。 |
%!200,304,302{Referer}i |
在所有不返回三个指定代码之一的请求上记录 Referer ,否则为 "- "。 |
修饰符 "<" 和 ">" 可用于已在内部重定向的请求,以选择应咨询原始请求还是最终请求(分别)。默认情况下,%
指令 %s, %U, %T, %D,
和 %r
查看原始请求,而所有其他指令查看最终请求。因此,例如,%>s
可用于记录请求的最终状态,而 %<u
可用于记录在内部重定向到未经身份验证的资源的请求上的原始经过身份验证的用户。
出于安全原因,从版本 2.0.46 开始,%r
、%i
和 %o
中的不可打印字符和其他特殊字符使用 \xhh
序列进行转义,其中 hh 代表原始字节的十六进制表示形式。此规则的例外情况是 "
和 \
,它们通过在前面加上一个反斜杠来转义,以及所有空白字符,它们以其 C 样式表示法(\n
、\t
等)写入。在 2.0.46 之前的版本中,没有对这些字符串执行转义,因此在处理原始日志文件时必须非常小心。
自 httpd 2.0 以来,与 1.3 不同,%b
和 %B
格式字符串不代表发送到客户端的字节数,而只是 HTTP 响应的大小(以字节为单位)(例如,如果连接中止或使用 SSL,则将有所不同)。mod_logio
提供的 %O
格式将记录通过网络实际发送的字节数。
注意:mod_cache
作为快速处理程序实现,而不是作为标准处理程序实现。因此,当涉及内容缓存时,%R
格式字符串不会返回任何处理程序信息。
一些常用的日志格式字符串是
"%h %l %u %t \"%r\" %>s %b"
"%v %h %l %u %t \"%r\" %>s %b"
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
"%{Referer}i -> %U"
"%{User-agent}i"
您可以多次使用 %{format}t
指令,使用扩展格式标记(如 msec_frac
)来构建时间格式
"%{%d/%b/%Y %T}t.%{msec_frac}t %{%z}t"
描述 | 在写入磁盘之前将日志条目缓冲到内存中 |
---|---|
语法 | BufferedLogs On|Off |
默认值 | BufferedLogs Off |
上下文 | 服务器配置 |
状态 | 基础 |
模块 | mod_log_config |
BufferedLogs
指令会导致 mod_log_config
将多个日志条目存储在内存中,并将它们一起写入磁盘,而不是在每次请求后写入它们。在某些系统上,这可能会导致更有效的磁盘访问,从而提高性能。它只能为整个服务器设置一次;它不能针对每个虚拟主机进行配置。
描述 | 设置日志文件的名称和格式 |
---|---|
语法 | CustomLog file|pipe format|nickname [env=[!]environment-variable| expr=expression] |
上下文 | 服务器配置、虚拟主机 |
状态 | 基础 |
模块 | mod_log_config |
CustomLog
指令用于将请求记录到服务器。指定日志格式,并且可以使用环境变量根据请求特征有条件地进行日志记录。
第一个参数指定将日志写入的位置,可以采用以下两种类型的值之一
ServerRoot
的文件名。|
”,后跟接收其标准输入上的日志信息的程序的路径。有关更多信息,请参阅有关 管道日志 的说明。如果使用程序,则它将以启动 httpd
的用户的身份运行。如果服务器由 root 启动,这将是 root;确保程序是安全的。
在非 Unix 平台上输入文件路径时,应注意确保只使用正斜杠,即使平台可能允许使用反斜杠。通常,最好始终在配置文件中使用正斜杠。
第二个参数指定将写入日志文件的内容。它可以指定由之前的 LogFormat
指令定义的 昵称,也可以是 日志格式 部分中所述的显式 格式 字符串。
例如,以下两组指令具有完全相同的效果
# CustomLog with format nickname LogFormat "%h %l %u %t \"%r\" %>s %b" common CustomLog "logs/access_log" common # CustomLog with explicit format string CustomLog "logs/access_log" "%h %l %u %t \"%r\" %>s %b"
第三个参数是可选的,用于控制是否记录特定请求。条件可以是服务器 环境 中是否存在特定变量(在“env=!name
”子句的情况下)。或者,条件可以表示为任意布尔 表达式。如果条件不满足,则不会记录请求。表达式中对 HTTP 标头的引用不会导致将标头名称添加到 Vary 标头中。
可以使用 mod_setenvif
和/或 mod_rewrite
模块在每个请求的基础上设置环境变量。例如,如果您想在单独的日志文件中记录服务器上所有 GIF 图像的请求,但不在主日志文件中记录,则可以使用
SetEnvIf Request_URI \.gif$ gif-image CustomLog "gif-requests.log" common env=gif-image CustomLog "nongif-requests.log" common env=!gif-image
或者,要重现旧的 RefererIgnore 指令的行为,可以使用以下内容
SetEnvIf Referer example\.com localreferer CustomLog "referer.log" referer env=!localreferer
描述 | 设置日志文件的名称和格式 |
---|---|
语法 | GlobalLogfile|pipe format|nickname [env=[!]environment-variable| expr=expression] |
上下文 | 服务器配置 |
状态 | 基础 |
模块 | mod_log_config |
兼容性 | 在 Apache HTTP Server 2.4.19 及更高版本中可用 |
GlobalLog
指令定义一个由主服务器配置和所有定义的虚拟主机共享的日志。
GlobalLog
指令与 CustomLog
指令相同,除了以下区别
GlobalLog
在虚拟主机上下文中无效。GlobalLog
由定义了自己的 CustomLog
的虚拟主机使用,这与全局指定的 CustomLog
不同。描述 | 描述日志文件中使用的格式 |
---|---|
语法 | LogFormat format|nickname [nickname] |
默认值 | LogFormat "%h %l %u %t \"%r\" %>s %b" |
上下文 | 服务器配置、虚拟主机 |
状态 | 基础 |
模块 | mod_log_config |
此指令指定访问日志文件的格式。
LogFormat
指令可以采用两种形式之一。在只指定一个参数的第一种形式中,此指令设置日志格式,该格式将由后续 TransferLog
指令中指定的日志使用。单个参数可以指定如上所述的显式 格式。或者,它可以使用 昵称 来引用之前 LogFormat
指令中定义的日志格式,如下所述。
LogFormat
指令的第二种形式将显式 格式 与 昵称 相关联。然后,可以在后续 LogFormat
或 CustomLog
指令中使用此 昵称,而不是重复整个格式字符串。定义昵称的 LogFormat
指令 **不会执行其他任何操作** -- 也就是说,它只定义昵称,它不会实际应用格式并使其成为默认值。因此,它不会影响后续的 TransferLog
指令。此外,LogFormat
不能使用一个昵称来定义另一个昵称。请注意,昵称不应包含百分号 (%
)。
LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common
描述 | 指定日志文件的位置 |
---|---|
语法 | TransferLog file|pipe |
上下文 | 服务器配置、虚拟主机 |
状态 | 基础 |
模块 | mod_log_config |
此指令与 CustomLog
指令具有完全相同的参数和效果,区别在于它不允许显式指定日志格式或有条件地记录请求。相反,日志格式由最近指定的 LogFormat
指令确定,该指令没有定义昵称。如果未指定其他格式,则使用通用日志格式。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" TransferLog logs/access_log