Apache 日志详解: Difference between revisions

From 清冽之泉
Jump to navigation Jump to search
 
(10 intermediate revisions by the same user not shown)
Line 1: Line 1:
Apache 日志分三个层次,分别是访问日志、状态日志、自造日志。
Apache 日志分三个层次,分别是访问日志、状态日志、自造日志。


Access Log 记录:
== 大致分类 ==
Access Log:
# 谁访问了
# 谁访问了
# 访问了什么
# 访问了什么
# 返回什么状态码
# 返回什么状态码


Error Log 记录:
Error Log:
# 模块警告
# 模块警告
# 配置错误
# 配置错误
Line 12: Line 13:
# 权限错误
# 权限错误
# SSL问题
# SSL问题
== 四维能力 ==
Apache 本身有以下四个不同维度的设计。
<pre>
1 请求信息
  ├─ header
  ├─ URI
  ├─ method
  └─ env variables
2 条件系统
  SetEnvIf
  RewriteRule
  mod_security
3 日志系统
  LogFormat
  CustomLog
4 日志过滤
  env=xxx
</pre>


== 生效条件 ==
== 生效条件 ==
Line 22: Line 45:
<code>tail -f /var/log/apache2/sth_debug.log</code> 可以查看新产生的日志。
<code>tail -f /var/log/apache2/sth_debug.log</code> 可以查看新产生的日志。


== 四种能力 ==
== 自造日志 ==
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
SetEnvIfNoCase User-Agent "^$" ua_empty
SetEnvIfNoCase User-Agent "^$" ua_empty
Line 31: Line 54:
</syntaxhighlight>
</syntaxhighlight>


# SetEnvIfNoCase 设置环境变量。格式为 <code>SetEnvIfNoCase 检查对象 正则匹配 设置变量</code>。上述命令是把空请求头设置为 ua_empty
# <b>设置环境变量</b>。SetEnvIfNoCase 设置环境变量。格式为 <code>SetEnvIfNoCase 检查对象 正则匹配 设置变量</code>。上述命令是把空请求头设置为 ua_empty
# %{User-Agent}i 进站请求头,i 是 incoming header
# <b>读取属性</b>。%{User-Agent}i 进站请求头,i 是 incoming header。%{ua_empty}e ua 这个环境变量
# %{ua_empty}e ua 这个环境变量
# <b>按环境变量过滤</b>。env= 满足环境变量才记录
# env= 满足环境变量才记录


%h %l %u %t \"%r\" %>s %b 是日志格式指定,不用记,用时随手搜或照抄即可。
%h %l %u %t \"%r\" %>s %b 是日志格式字符串,不用记,用时随手搜或照抄即可。那些 \ 是给引号转义用的。
{| class="wikitable"
{| class="wikitable"
|+ 指定格式
|+ 指定格式

Latest revision as of 17:19, 9 April 2026

Apache 日志分三个层次,分别是访问日志、状态日志、自造日志。

大致分类

Access Log:

  1. 谁访问了
  2. 访问了什么
  3. 返回什么状态码

Error Log:

  1. 模块警告
  2. 配置错误
  3. 程序异常
  4. 权限错误
  5. 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
  1. 设置环境变量。SetEnvIfNoCase 设置环境变量。格式为 SetEnvIfNoCase 检查对象 正则匹配 设置变量。上述命令是把空请求头设置为 ua_empty
  2. 读取属性。%{User-Agent}i 进站请求头,i 是 incoming header。%{ua_empty}e ua 这个环境变量
  3. 按环境变量过滤。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 超级详细调试