<-
Apache HTTP 服务器 2.4 > Apache模块mod_log_config

Apache模块mod_log_config

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

摘要

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

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

支持Apache!

主题

指令

错误修正清单

也可以看看

最佳

自定义日志格式

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地址,这是默认设置。如果它仅记录了几台主机的主机名,则您可能具有访问控制指令,并按名称提及了它们。请参阅需要主机文档
%{c}h %h,但总是报告基础TCP连接的主机名,而不报告诸如的模块对远程主机名的任何修改mod_remoteip
%H 请求协议。
%{VARNAME}i VARNAME:发送到服务器的请求中标题行的内容。其他模块(例如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:回复中标题行的内容。
%p 服务请求的服务器的规范端口。
%{format}p 服务请求的服务器的规范端口,或服务器的实际端口,或客户端的实际端口。有效的格式canonicallocalremote
%P 为请求提供服务的子进程的ID。
%{format}P 为请求提供服务的子进程的进程ID或线程ID。有效的格式是pidtidhextidhextid需要APR 1.2.0或更高版本。
%q 查询字符串(?如果存在查询字符串,则前缀为,否则为空字符串)。
%r 第一行要求。
%R 生成响应的处理程序(如果有)。
%s 状态。对于已在内部重定向的请求,这是原始请求的状态。使用%>s 的最终状态。
%t 收到请求的时间,格式为[18/Sep/2011:19:18:28 -0400]。最后一个数字表示与格林尼治标准时间的时区偏移量
%{format}t 时间,采用格式给定的形式,应采用扩展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%T2.4.13及更高版本中提供了与设备组合的功能。
%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:发送到服务器的请求中的预告片行的内容。
%{VARNAME}^to VARNAME:服务器发送的响应中的尾随行的内容。

修饰符

通过将逗号分隔的状态代码列表紧跟在“%”之后,可以将特定项限制为仅打印具有特定HTTP状态代码的响应。状态代码列表之前可以带有“ !”以表示否定。

格式字符串 含义
%400,501{User-agent}i 仅登录User-agent400错误和501错误。对于其他状态代码,"-"将记录文字字符串。
%!200,304,302{Referer}i 登录Referer所有返回三个指定代码之一的请求,否则 返回“ -”。

修饰符“ <”和“>”可用于已在内部重定向的请求,以选择应查询原始请求还是最终(分别)请求。默认情况下,%指令%s, %U, %T, %D,和会%r查看原始请求,而其他所有指令会查看最终请求。因此,例如, %>s可用于记录请求的最终状态,%<u并可用于记录对内部重定向到未经身份验证的资源的请求的原始身份验证用户。

格式注释

出于安全考虑,从2.0.46版开始,中的不可打印字符和其他特殊字符%r%i%o使用序列进行转义 ,其中hh 表示原始字节的十六进制表示形式。这条规则的例外是和 ,这是由前面加上一个反斜线,和所有空格字符,这是写在他们的C风格的符号(,等)。在2.0.46之前的版本中,没有对这些字符串进行转义,因此在处理原始日志文件时必须非常小心。\xhh"\\n\t

从httpd 2.0开始,与1.3不同,%b%B格式字符串不代表发送到客户端的字节数,而只是代表HTTP响应的字节大小(例如,如果连接中止或SSL时,字节长度将有所不同)。用来)。%O 提供的格式mod_logio将记录通过网络发送的实际字节数。

注意: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}i -> %U"
代理(浏览器)日志格式
"%{User-agent}i"

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

时间戳(包括毫秒)
"%{%d/%b/%Y %T}t.%{msec_frac}t %{%z}t"
最佳

安全注意事项

请参阅安全性提示 文档,以获取有关如果启动日志的用户以外的任何人都可写存储日志文件的目录的原因,为什么会损害安全性的详细信息。

最佳

BufferedLogs 指令

描述:写入磁盘之前在内存中缓冲日志条目
句法:BufferedLogs On|Off
默认:BufferedLogs Off
内容:服务器配置
状态:基础
模块:mod_log_config

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

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

CustomLog 指令

描述:设置日志文件的文件名和格式
句法:CustomLog file|pipe format|nickname [env=[!]environment-variable| expr=expression]
内容:服务器配置,虚拟主机
状态:基础
模块:mod_log_config

CustomLog伪指令用于将请求记录到服务器。指定了日志格式,并且可以选择使用环境变量将日志设置为基于请求特征的条件。

第一个参数指定要写入日志的位置,它可以采用以下两种类型之一:

文件
相对于的文件名ServerRoot
管道字符“ |”,后跟程序的路径,以在其标准输入上接收日志信息。有关 更多信息,请参见管道日志中的注释。

安全:

如果使用了程序,则它将以启动用户的身份运行httpd。如果服务器是由root启动的,则它将是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"

第三个参数是可选的,它控制是否记录特定请求。条件可以是服务器环境中是否存在特定变量(对于' '子句而言) 。或者,该条件可以表示为任意布尔表达式。如果不满足条件,则不会记录该请求。在表达式中引用HTTP标头不会导致将标头名称添加到Vary标头中。env=!name

可以使用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
最佳

GlobalLog 指令

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

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

GlobalLog指令是相同的CustomLog指令,除了以下区别:

最佳

LogFormat 指令

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

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

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

LogFormat 指令的第二种形式将显式格式昵称相关联。然后,可以在后续或 伪指令中使用此昵称,而不必重复整个格式字符串。一个 定义昵称指令 并没有别的 -也就是说,它只是 定义了昵称,它实际上并没有适用的格式,并使其成为默认。因此,它不会影响后续 指令。此外,不能使用一个昵称来定义另一个昵称。请注意,昵称中不得包含百分号()。LogFormatCustomLogLogFormatTransferLogLogFormat%

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

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

可用语言: zh  |  fr  |  ja  |  ko  |  TR 

最佳

注释

注意:
这不是“问答”部分。此处放置的评论应指向有关改进文档或服务器的建议,如果实施或被认为无效/偏离主题,我们的主持人可以将其删除。有关如何管理Apache HTTP Server的问题,应直接指向我们的IRC频道#httpd(位于Freenode上),或发送至我们的邮件列表
目前,此页面已禁用评论。