Apache 日志详解: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
|||
| (30 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
Apache 日志分三个层次,分别是访问日志、状态日志、自造日志。 | Apache 日志分三个层次,分别是访问日志、状态日志、自造日志。 | ||
== 大致分类 == | |||
Access Log: | |||
# 谁访问了 | |||
# 访问了什么 | |||
# 返回什么状态码 | |||
Error Log: | |||
# 模块警告 | |||
# 配置错误 | |||
# 程序异常 | |||
# 权限错误 | |||
# SSL问题 | |||
== 四维能力 == | |||
Apache 本身有以下四个不同维度的设计。 | |||
<pre> | |||
1 请求信息 | |||
├─ header | |||
├─ URI | |||
├─ method | |||
└─ env variables | |||
2 条件系统 | |||
SetEnvIf | |||
RewriteRule | |||
mod_security | |||
3 日志系统 | |||
LogFormat | |||
CustomLog | |||
4 日志过滤 | |||
env=xxx | |||
</pre> | |||
== 生效条件 == | == 生效条件 == | ||
| Line 5: | Line 40: | ||
* 文件夹存在 | * 文件夹存在 | ||
* apache 有文件夹的读写权限 | * apache 有文件夹的读写权限 | ||
* 先有 LogFormat | * 先有 LogFormat 定义日志格式:<code>LogFormat "%h %l %u %t \"%r\" %>s %b" miaomiaomiao</code> | ||
* 后有 CustomLog | * 后有 CustomLog 生成日志:<code>CustomLog /var/log/apache2/sth_debug.log miaomiaomiao</code> | ||
* 需<code>sudo systemctl reload apache2</code>重启一下 | * 需 <code>sudo systemctl reload apache2</code> 重启一下 | ||
<code>tail -f /var/log/apache2/sth_debug.log</code> 可以查看新产生的日志。 | <code>tail -f /var/log/apache2/sth_debug.log</code> 可以查看新产生的日志。 | ||
== 自造日志 == | |||
<syntaxhighlight lang="bash"> | |||
SetEnvIfNoCase User-Agent "^$" ua_empty | |||
LogFormat "%h %l %u %t \"%r\" %>s %b ua=\"%{User-Agent}i\" empty=%{ua_empty}e" miaomiaomiao | |||
CustomLog /var/log/apache2/anki_debug.log miaomiaomiao env=ua_empty | |||
</syntaxhighlight> | |||
# <b>设置环境变量</b>。SetEnvIfNoCase 设置环境变量。格式为 <code>SetEnvIfNoCase 检查对象 正则匹配 设置变量</code>。上述命令是把空请求头设置为 ua_empty | |||
# <b>读取属性</b>。%{User-Agent}i 进站请求头,i 是 incoming header。%{ua_empty}e ua 这个环境变量 | |||
# <b>按环境变量过滤</b>。env= 满足环境变量才记录 | |||
%h %l %u %t \"%r\" %>s %b 是日志格式字符串,不用记,用时随手搜或照抄即可。那些 \ 是给引号转义用的。 | |||
{| class="wikitable" | |||
|+ 指定格式 | |||
!占位符 | |||
!含义 | |||
|+ | |||
|%h | |||
|客户端 IP 地址(remote host) | |||
|- | |||
|%l | |||
|<nowiki>RFC 1413</nowiki> 用户身份(通常返回 -,几乎没用) | |||
|- | |||
|%u | |||
|已认证的用户(如果用了 HTTP auth),没用就 - | |||
|- | |||
|%t | |||
|请求时间,格式 [08/Apr/2026:15:38:50 +0800] | |||
|- | |||
|"%r" | |||
|原始请求行,例如 "POST /hi/sync/meta HTTP/1.1" | |||
|- | |||
|%>s | |||
|响应状态码,例如 200 或 403 | |||
|- | |||
|%b | |||
|响应体字节数(不包含头),如果是 0 则显示 - | |||
|- | |||
|ua=\"%{User-Agent}i\" | |||
|把请求头 User-Agent 的值打印出来,i 表示 incoming header | |||
|- | |||
|empty=%{ua_empty}e | |||
|打印环境变量 ua_empty 的值,e 表示 environment variable | |||
|} | |||
== LogLevel == | |||
日志等级越往下越详细。越详细越占用内存和网络,所以一般只开 warn,意思是比 warn 还严重的级别才显示。 | |||
日志等级可以分模块开放。如 <code>LogLevel warn rewrite:trace2 proxy:debug proxy_http:trace3 ssl:warn</code>。怀疑哪个模块有问题,就把那个模块的日志等级调详细一些。 | |||
{| class="wikitable" | |||
|+ 日志级别 | |||
!等级 | |||
!含义 | |||
|- | |||
|emerg | |||
|系统完全崩溃 | |||
|- | |||
|alert | |||
|必须立刻处理 | |||
|- | |||
|crit | |||
|严重错误 | |||
|- | |||
|error | |||
|普通错误 | |||
|- | |||
|warn | |||
|警告 | |||
|- | |||
|notice | |||
|重要但正常 | |||
|- | |||
|info | |||
|信息 | |||
|- | |||
|debug | |||
|调试 | |||
|- | |||
|trace1–trace8 | |||
|超级详细调试 | |||
|} | |||
Latest revision as of 17:19, 9 April 2026
Apache 日志分三个层次,分别是访问日志、状态日志、自造日志。
大致分类
Access Log:
- 谁访问了
- 访问了什么
- 返回什么状态码
Error Log:
- 模块警告
- 配置错误
- 程序异常
- 权限错误
- SSL问题
四维能力
Apache 本身有以下四个不同维度的设计。
1 请求信息 ├─ header ├─ URI ├─ method └─ env variables 2 条件系统 SetEnvIf RewriteRule mod_security 3 日志系统 LogFormat CustomLog 4 日志过滤 env=xxx
生效条件
日志在以下情况才会产生:
- 文件夹存在
- apache 有文件夹的读写权限
- 先有 LogFormat 定义日志格式:
LogFormat "%h %l %u %t \"%r\" %>s %b" miaomiaomiao - 后有 CustomLog 生成日志:
CustomLog /var/log/apache2/sth_debug.log miaomiaomiao - 需
sudo systemctl reload apache2重启一下
tail -f /var/log/apache2/sth_debug.log 可以查看新产生的日志。
自造日志
SetEnvIfNoCase User-Agent "^$" ua_empty
LogFormat "%h %l %u %t \"%r\" %>s %b ua=\"%{User-Agent}i\" empty=%{ua_empty}e" miaomiaomiao
CustomLog /var/log/apache2/anki_debug.log miaomiaomiao env=ua_empty
- 设置环境变量。SetEnvIfNoCase 设置环境变量。格式为
SetEnvIfNoCase 检查对象 正则匹配 设置变量。上述命令是把空请求头设置为 ua_empty - 读取属性。%{User-Agent}i 进站请求头,i 是 incoming header。%{ua_empty}e ua 这个环境变量
- 按环境变量过滤。env= 满足环境变量才记录
%h %l %u %t \"%r\" %>s %b 是日志格式字符串,不用记,用时随手搜或照抄即可。那些 \ 是给引号转义用的。
| 占位符 | 含义 |
|---|---|
| %h | 客户端 IP 地址(remote host) |
| %l | RFC 1413 用户身份(通常返回 -,几乎没用) |
| %u | 已认证的用户(如果用了 HTTP auth),没用就 - |
| %t | 请求时间,格式 [08/Apr/2026:15:38:50 +0800] |
| "%r" | 原始请求行,例如 "POST /hi/sync/meta HTTP/1.1" |
| %>s | 响应状态码,例如 200 或 403 |
| %b | 响应体字节数(不包含头),如果是 0 则显示 - |
| ua=\"%{User-Agent}i\" | 把请求头 User-Agent 的值打印出来,i 表示 incoming header |
| empty=%{ua_empty}e | 打印环境变量 ua_empty 的值,e 表示 environment variable |
LogLevel
日志等级越往下越详细。越详细越占用内存和网络,所以一般只开 warn,意思是比 warn 还严重的级别才显示。
日志等级可以分模块开放。如 LogLevel warn rewrite:trace2 proxy:debug proxy_http:trace3 ssl:warn。怀疑哪个模块有问题,就把那个模块的日志等级调详细一些。
| 等级 | 含义 |
|---|---|
| emerg | 系统完全崩溃 |
| alert | 必须立刻处理 |
| crit | 严重错误 |
| error | 普通错误 |
| warn | 警告 |
| notice | 重要但正常 |
| info | 信息 |
| debug | 调试 |
| trace1–trace8 | 超级详细调试 |