访问日志¶
模块: mod_accesslog
描述¶
记录服务器处理的 HTTP 请求
选项¶
accesslog.format
日志记录格式 用于每个 HTTP 请求默认值:
"%h %V %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
accesslog.escaping(自 1.4.66 起)
选择控制字符和高位字符的转义约定
控制字符和高位字符在日志记录中以反斜杠转义
accesslog.escaping = "default"使用默认转义约定 ("\xFF")
accesslog.escaping = "json"使用 JSON 转义约定 ("\uFFFF")默认值: "default"
accesslog.use-syslog
将访问日志发送到 syslog
(如果两者都设置,则覆盖accesslog.filename)
(syslog 到server.syslog-facility(自 1.4.75 起,或自 1.4.46 使用server.errorlog-use-syslog起)默认值: 禁用
accesslog.syslog-level(自 1.4.33 起)
syslog 日志记录的严重级别(参见 https://en.wikipedia.org/wiki/Syslog#Severity_level 获取数值)默认值: 6 (信息)
accesslog.filename
如果未使用 syslog,则访问日志应写入的文件名。
如果名称以 '|' 开头,名称的其余部分将被视为将生成并接收输出的进程的名称
如果您有多个工作进程并希望轮换日志,请使用管道记录器,例如 accesslog.filename = "|/usr/sbin/cronolog ... "
注意: 如果您记录到管道并且 lighty 处于 chroot 环境中,则运行 lighty 的用户将需要访问“/bin/sh”。默认值: 禁用
accesslog.filename = "/var/log/lighttpd.log" $HTTP["host"] == "www.example.org" { accesslog.filename = "|/usr/bin/cronolog ... " }
日志记录格式¶
日志记录的格式模板
默认accesslog.format = "%h %V %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
这类似于组合日志格式(NCSA 扩展日志格式)(由 Apache HTTPD 访问日志 使用)accesslog.format = "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
但 lighttpd 使用 %V 代替了现在已过时的 %l
(选项类似于 Apache HTTPD mod_log_config 格式)
| 选项 | 描述 | |
|---|---|---|
| %% | 百分号 | |
| %h | 远程主机的 IP 地址 | |
| %{mask}h | 远程主机的 IP 地址 (遮蔽低位) | (在 1.4.70 中支持) |
| %l | 标识名称(不支持) | |
| %u | 已认证用户 | |
| %t | 请求结束时间戳 | |
| %{...}t | 请求结束时间戳 | (在 1.4.40 中支持) |
| %r | 请求行 | |
| %s | 状态码 | |
| %b | 为正文发送的字节数 | |
| %{label}i | HTTP 请求头 | |
| %a | 远程地址 | (在 1.4.40 中支持) |
| %{mask}a | 远程地址 (遮蔽低位) | (在 1.4.70 中支持) |
| %A | 本地地址 | (在 1.4.40 中支持) |
| %B | 与 %b 相同 | |
| %C | Cookie 字段 | (在 1.4.40 中支持) |
| %D | 使用的微秒时间 | (在 1.4.40 中支持) |
| %{label}e | 环境变量 | |
| %f | 物理文件名 | |
| %H | 请求协议 (HTTP/1.0, ...) | |
| %k | 保持连接数 | (在 1.4.40 中支持) |
| %m | 请求方法 (GET, POST, ...) | |
| %{label}n | 备注(内部模块备注) | (在 1.4.43 中支持) |
| %{label}o | HTTP 响应头 | |
| %p | 服务器端口 | |
| %{...}p | 地址端口(标准,本地,远程) | (在 1.4.49 中支持) |
| %P | (不支持) | |
| %q | 查询字符串 | |
| %T | 使用的秒数时间 | |
| %{UNIT}T | 使用的 UNIT 时间 (秒, 毫秒, 微秒, 或纳秒) | (在 1.4.40 中支持) |
| %U | 请求 URL | |
| %v | 服务器名称 | |
| %V | HTTP 请求主机名 | |
| %X | 连接状态 | |
| %I | 传入字节数 | |
| %O | 传出字节数 |
- 如果 %s 写为 %>s 或 %<s,则 < 和 > 将被忽略。它们是为了与 Apache 兼容而支持的。
- %h 始终返回主机的 IP 地址,而不是名称。这使其等同于 %a。
- %a, %A, %{name}C, %D, %k, %{...}t, %{...}T 在 lighttpd 1.4.40 及更高版本中实现。
- %i 和 %o 预期字段名称应写在大括号中。
- 与 Apache 不同,%q 不会以 '?' 为前缀
- %{strftime format string}t 自 1.4.24 起支持。
- %{UNIT}t 选项:
%{sec}t,%{msec}t,%{usec}t,%{nsec}t,%{msec_frac}t,%{usec_frac}t,%{nsec_frac}t,%{...strftime-format...}t - %{UNIT}T 选项:
%{s}T,%{sec}T,%{ms}T,%{msec}T,%{us}T,%{usec}T,%{ns}T,%{nsec}T - %t 的工作方式与 Apache 不同(Apache 记录请求开始时间)。它显示的是请求实际交付的时间。对于大多数用户来说,这并不重要,因为请求通常不会花费很长时间来处理。使用 %{begin:...}t 获取请求开始时间。
- %{ratio}n 显示文件压缩比,适用于 mod_deflate (自 1.4.43 起)
禁用日志记录¶
如果启用了日志记录,可以在 lighttpd 条件中选择性地禁用日志记录。例如,要禁用对 /robots.txt 的请求的日志记录
如果使用 accesslog.filename$HTTP["url"] == "/robots.txt { accesslog.filename = "" }
如果使用 accesslog.use-syslog$HTTP["url"] == "/robots.txt { accesslog.use-syslog = "disable" }
要禁用来自 localhost 的请求的日志记录,如果使用 accesslog.filename$HTTP["remote-ip"] == "127.0.0.1" { accesslog.filename = "" }$HTTP["remote-ip"] == "[::1]" { accesslog.filename = "" }
响应头¶
访问日志模块提供了一种特殊方式,用于将应用程序内容记录到访问日志文件中。
它可用于将会话 ID 记录到日志文件中,例如 X-LIGHTTPD-SID。如果您想将 X-LIGHTTPD-SID 记录到访问日志中,只需在 accesslog.format 的 %{...}o 中指定字段名即可。前缀 X-LIGHTTPD- 很特殊,因为所有以此前缀开头的响应头都被认为是 lighttpd 特有的,并且不会发送给客户端。
accesslog.format = "%h %V %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-LIGHTTPD-SID}o\""
<?php
session_start();
header("X-LIGHTTPD-SID: ".session_id());
?>
TEST
JSON 格式¶
accesslog.escaping = "json" 自 lighttpd 1.4.66 起可用
# example mod_accesslog format for json output using high-precision timestamps
# note: lighttpd.conf strings are double-quoted
# (must backslash-escape double-quotes within the log format string)
accesslog.escaping = "json"
accesslog.format = "{ "
#accesslog.format += "\"@timestamp\": \"%{begin:%FT%T}t.%{begin:usec_frac}tZ\", " # request start timestamp
accesslog.format += "\"@timestamp\": " +"\"%{%FT%T}t.%{usec_frac}tZ\", " # request end timestamp
accesslog.format += "\"@fields\": "
accesslog.format += "{ "
accesslog.format += "\"http_host\": " +"\"%V\", " # Host (:authority)
accesslog.format += "\"remote_addr\": " +"\"%h\", "
accesslog.format += "\"remote_user\": " +"\"%u\", "
accesslog.format += "\"request_method\": " +"\"%m\", "
accesslog.format += "\"request\": " +"\"%r\", "
accesslog.format += "\"status\": " + "%s, "
accesslog.format += "\"body_bytes_sent\": "+"\"%b\", "
accesslog.format += "\"duration_usec\": " + "%D, " # usec (microseconds)
accesslog.format += "\"http_referrer\": " +"\"%{Referer}i\", "
accesslog.format += "\"http_user_agent\": "+"\"%{User-Agent}i\" "
accesslog.format += "} "
accesslog.format += "}"