<-
Apache > HTTP 服务器 > 文档 > 版本 2.4 > 模块

Apache 模块 mod_log_config

可用语言:  en  |  fr  |  ja  |  ko  |  tr 

描述记录对服务器发出的请求
状态基础
模块标识符log_config_module
源文件mod_log_config.c

摘要

此模块提供对客户端请求的灵活记录。日志以可自定义的格式写入,并且可以直接写入文件或写入外部程序。提供条件记录,以便可以根据请求的特征将单个请求包含在日志中或从日志中排除。

此模块提供三个指令:TransferLog 用于创建日志文件,LogFormat 用于设置自定义格式,以及 CustomLog 用于在一个步骤中定义日志文件和格式。TransferLogCustomLog 指令可以在每个服务器中使用多次,以使每个请求都记录到多个文件中。

Support Apache!

主题

指令

错误修复清单

另请参阅

top

自定义日志格式

LogFormatCustomLog 指令的 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 为请求提供服务的服务器的规范端口,或服务器的实际端口,或客户端的实际端口。有效的格式为 canonicallocalremote
%P 为请求提供服务的子进程的进程 ID。
%{format}P 为请求提供服务的子进程的进程 ID 或线程 ID。有效的格式为 pidtidhextid
%q 查询字符串(如果存在查询字符串,则在前面加上一个 '?',否则为空字符串)。
%r 请求的第一行。
%R 生成响应的处理程序(如果有)。
%s 状态。对于已在内部重定向的请求,这是原始请求的状态。使用 %>s 获取最终状态。
%t 接收请求的时间,格式为 [18/Sep/2011:19:18:28 -0400]。最后一个数字表示与 GMT 的时区偏移量
%{format}t 时间,以 format 给出的形式,该形式应为扩展的 strftime(3) 格式(可能已本地化)。如果格式以 begin:(默认值)开头,则时间是在请求处理开始时获取的。如果它以 end: 开头,则是在写入日志条目时的时间,接近请求处理结束时。除了 strftime(3) 支持的格式之外,还支持以下格式标记
sec自纪元以来的秒数
msec自纪元以来的毫秒数
usec自纪元以来的微秒数
msec_frac毫秒分数
usec_frac微秒分数
这些标记不能与同一个格式字符串中的其他标记或 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 响应完成时的连接状态
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 格式字符串不会返回任何处理程序信息。

示例

一些常用的日志格式字符串是

通用日志格式 (CLF)
"%h %l %u %t \"%r\" %>s %b"
带虚拟主机的通用日志格式
"%v %h %l %u %t \"%r\" %>s %b"
NCSA 扩展/组合日志格式
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
Referer 日志格式
"%{Referer}i -> %U"
Agent(浏览器)日志格式
"%{User-agent}i"

您可以多次使用 %{format}t 指令,使用扩展格式标记(如 msec_frac)来构建时间格式

包含毫秒的时间戳
"%{%d/%b/%Y %T}t.%{msec_frac}t %{%z}t"
top

安全注意事项

有关如果存储日志文件的目录可被除启动服务器的用户以外的任何人写入,为什么您的安全性可能会受到损害的详细信息,请参阅 安全提示 文档。

top

BufferedLogs 指令

描述在写入磁盘之前将日志条目缓冲到内存中
语法BufferedLogs On|Off
默认值BufferedLogs Off
上下文服务器配置
状态基础
模块mod_log_config

BufferedLogs 指令会导致 mod_log_config 将多个日志条目存储在内存中,并将它们一起写入磁盘,而不是在每次请求后写入它们。在某些系统上,这可能会导致更有效的磁盘访问,从而提高性能。它只能为整个服务器设置一次;它不能针对每个虚拟主机进行配置。

应谨慎使用此指令,因为崩溃可能会导致日志数据丢失。
top

CustomLog 指令

描述设置日志文件的名称和格式
语法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
top

GlobalLog 指令

描述设置日志文件的名称和格式
语法GlobalLogfile|pipe format|nickname [env=[!]environment-variable| expr=expression]
上下文服务器配置
状态基础
模块mod_log_config
兼容性在 Apache HTTP Server 2.4.19 及更高版本中可用

GlobalLog 指令定义一个由主服务器配置和所有定义的虚拟主机共享的日志。

GlobalLog 指令与 CustomLog 指令相同,除了以下区别

top

LogFormat 指令

描述描述日志文件中使用的格式
语法LogFormat format|nickname [nickname]
默认值LogFormat "%h %l %u %t \"%r\" %>s %b"
上下文服务器配置、虚拟主机
状态基础
模块mod_log_config

此指令指定访问日志文件的格式。

LogFormat 指令可以采用两种形式之一。在只指定一个参数的第一种形式中,此指令设置日志格式,该格式将由后续 TransferLog 指令中指定的日志使用。单个参数可以指定如上所述的显式 格式。或者,它可以使用 昵称 来引用之前 LogFormat 指令中定义的日志格式,如下所述。

LogFormat 指令的第二种形式将显式 格式昵称 相关联。然后,可以在后续 LogFormatCustomLog 指令中使用此 昵称,而不是重复整个格式字符串。定义昵称的 LogFormat 指令 **不会执行其他任何操作** -- 也就是说,它只定义昵称,它不会实际应用格式并使其成为默认值。因此,它不会影响后续的 TransferLog 指令。此外,LogFormat 不能使用一个昵称来定义另一个昵称。请注意,昵称不应包含百分号 (%)。

示例

LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common
top

TransferLog 指令

描述指定日志文件的位置
语法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

可用语言:  en  |  fr  |  ja  |  ko  |  tr 

top

评论

注意
这不是问答部分。此处放置的评论应指向有关改进文档或服务器的建议,如果它们已实施或被认为无效/主题无关,可能会被我们的版主删除。有关如何管理 Apache HTTP Server 的问题应发送到我们的 IRC 频道 #httpd(在 Libera.chat 上)或发送到我们的 邮件列表