Apache 请求日志记录了服务器接收到的 HTTP 请求的详细信息,用于监控、分析和调试。日志中包括诸如请求的来源 IP 地址、请求方法、响应状态码、处理时间等信息。
日志的作用:
- 监控与调试:日志可以帮助系统管理员监控服务器的运行状态,快速定位并解决请求失败或错误的问题。
- 性能优化:通过分析请求的处理时间和响应大小,可以识别出性能瓶颈,进而优化服务器配置和资源分配。
- 安全分析:日志可以用于检测异常访问模式和潜在的攻击活动,例如频繁的404错误、异常的请求方法或大量的请求来自同一IP地址。
- 用户行为分析:通过跟踪用户的访问模式和行为,可以对网站内容和用户体验进行优化,提高用户满意度。
- 访问统计:日志数据可以用来生成访问统计报告,了解网站的访问量、访问者的地理分布、最受欢迎的页面等信息。
- 合规性和审计:在需要符合特定法规或标准的情况下,日志可以作为审计的证据,证明系统的使用和访问符合规定。
- 个性化推荐:分析用户的访问习惯和偏好,可以为用户提供个性化的内容推荐。
触发条件:
- 所有 HTTP 请求 :每次客户端向服务器发出请求,都会在日志中生成一条记录。
- 特定事件或条件 :可以通过自定义配置记录特定的请求或事件,如错误状态码或特定的请求方法。
1.配置请求日志
1.1 日志来源
- 默认日志路径:Apache 的默认访问日志通常位于 /var/log/apache2/access.log(Debian/Ubuntu 系统)或 /etc/httpd/logs/access_log(CentOS/RHEL 系统)。
- 默认配置文件路径:Apache 的主配置文件通常位于 /etc/apache2/apache2.conf(Debian/Ubuntu 系统)或 /etc/httpd/conf/httpd.conf(CentOS/RHEL 系统)。
1.2修改日志路径和格式
在 Apache 中,可以通过修改配置文件来设置自定义日志格式和日志文件路径。
示例配置:
- 主配置文件 /etc/apache2/apache2.conf 或 /etc/httpd/conf/httpd.conf:
apache
设置自定义日志格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{X-Forwarded-For}i" combined_with_all_vars
应用自定义日志格式到默认日志文件
CustomLog "/var/log/apache2/access.log" combined_with_all_vars
- 虚拟主机配置 在 /etc/apache2/sites-available/example.com.conf 或其他虚拟主机文件中:
apache
<VirtualHost *:80>
ServerName example.com
DocumentRoot "/var/www/example.com"
为虚拟主机设置自定义日志文件和格式
CustomLog "/var/log/apache2/example_access.log" combined_with_all_vars
</VirtualHost>
1.3 配置测试和重载
测试配置:
使用以下命令测试 Apache 配置文件是否有语法错误:
sudo apachectl configtest
# 或者
sudo httpd -t
1.4 重载重启配置
若无错误,使用以下命令重载 Apache 以应用配置更改:
sudo systemctl reload apache2
如果需要,使用以下命令重启 Apache:
sudo systemctl restart apache2
1.5 字段参考
|----|---------------|---------------------------|---------------------------------------------------------------------------------------|------------------------------|-------------------------------------------------------------------------------------------------------------|---|
| | Apache 字段 | 命名 | 示例值 | 中文解释 | 正则表达式 | |
| 1 | %a | remote_addr | 192.168.0.1 | 请求的客户端 IP 地址 | \b(?:[0-9]{1,3}.){3}[0-9]{1,3}\b | |
| 2 | %{c}a | real_ip | 10.0.0.1 | 连接的底层对等 IP 地址(代理下的最初发起请求的IP) | \b(?:[0-9]{1,3}.){3}[0-9]{1,3}\b | |
| 3 | %A | server_addr | 127.0.0.1 | 本地 IP 地址 | \b(?:[0-9]{1,3}.){3}[0-9]{1,3}\b | |
| 4 | %B/%b | body_bytes_sent | 2048 | 响应大小,不包括 HTTP 标头 | \d+ | |
| 5 | %{VARNAME}C | cookie_VARNAME | cookie1=value1; cookie2=value2 | 请求中 Cookie 的内容 | [A-Za-z0-9_]+(?:=[^\s;]+)?(?:\\s*;\\s*[A-Za-z0-9_]+(?:=[^\s;]+)?)* | |
| 6 | %D | request_time_microseconds | 123456 | 处理请求所花费的时间(微秒) | \d+ | |
| 7 | %{VARNAME}e | env_VARNAME | VARNAME=value | 环境变量的内容 | [A-Za-z0-9_]+(?:=[^\s]+)? | |
| 8 | %f | filename | /path/to/file | 文件名 | .+ | |
| 9 | %h | remote_host | Example Domain | 远程主机名 | [a-zA-Z0-9.-]+.[a-zA-Z]{2,} | |
| 10 | %{c}h | real_host | www.realexample.com | 底层 TCP 连接的主机名 | [a-zA-Z0-9.-]+.[a-zA-Z]{2,} | |
| 11 | %H | request_protocol | HTTP/1.1 | 请求协议 | HTTP/\d.\d | |
| 12 | %{VARNAME}i | http_VARNAME | User-Agent: Mozilla/5.0 | 请求头内容 | [A-Za-z0-9_-]+:\s[^\s]+ | |
| 13 | %k | keepalive_requests | 0 | Keepalive 请求数 | 0 | |
| 15 | %L | request_id | [0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12} | 错误日志中的请求日志 ID | | |
| 16 | %m | request_method | GET | 请求方法 | [A-Z]+ | |
| 18 | %{VARNAME}o | response_header_VARNAME | Content-Type: text/html | 响应头内容 | [A-Za-z0-9_-]+:\s[^\s]+ | |
| 19 | %p | server_port | 80 | 服务器端口 | \d+ | |
| 20 | %P | process_id | 1234 | 子进程 ID | \d+ | |
| 21 | %q | query_string | arg1=val1&arg2=val2 | 查询字符串 | .+? | |
| 22 | %r | request_line | GET /index.html HTTP/1.1 | 第一行请求 | [A-Z]+\s/.+\sHTTP/\d.\d | |
| 23 | %R | handler | directory | 生成响应的处理程序 | [a-zA-Z0-9_]+ | |
| 24 | %s | status | 200 | 状态码 | \d{3} | |
| 25 | %t | time_local | [09/Apr/2023:12:00:00 +0000] | 收到请求的时间 | (?:\d1,2/[A−Za−z]3/\d4:\d2:\d2:\d2\+\d4)(?:\d1,2/[A −Za −z ]3/\d4:\d2:\d2:\d2\+\d4) | |
| 26 | %{format}t | time_format | 2023-04-09 12:00:00 | 时间(自定义格式) | \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} | |
| 27 | %T | request_time | 0.123 | 处理请求所花费的时间(秒) | \d+.\d{3} | |
| 28 | %{UNIT}T | request_time_UNIT | 123ms | 以不同单位表示的处理请求时间 | \d+[a-z]+ | |
| 29 | %u | remote_user | username | 远程用户 | [a-zA-Z0-9_-]+ | |
| 30 | %U | request_uri | /index.html | 请求的 URL 路径 | .+ | |
| 31 | %v | server_name | server.example.com | 服务器规范名称 | [a-zA-Z0-9.-]+.[a-zA-Z]{2,} | |
| 32 | %V | host | Example Domain | 根据设置的服务器名称 | [a-zA-Z0-9.-]+.[a-zA-Z]{2,} | |
| 33 | %X | connection_status | + | 连接状态 | [+-] | |
| 34 | %I | received_bytes | 1500 | 接收的字节数 | \d+ | |
| 35 | %O | sent_bytes | 1024 | 发送的字节数 | \d+ | |
| 36 | %S | bytes_transferred | 3000 | 传输的字节数 | \d+ | |
默认配置日志通常包括 CLF(通用日志格式)和扩展格式。带虚拟主机的通用日志格式和 NCSA 扩展/组合日志格式也常见于不同的配置。
- 日志采集概述
2.1 access日志格式样例
172.16.100.2 - - [19/Aug/2024:10:31:34 +0800] "GET /zabbix/zabbix.php?action=dashboard.list HTTP/1.1" 200 10258 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"`
`
这条Apache日志记录了在2024年8月19日上午10点31分34秒,一个来自IP地址172.16.100.2的客户端使用Chrome浏览器(版本127.0.0.0)成功访问了服务器上的 /zabbix/zabbix.php 页面,请求了仪表板列表,并接收到了10258字节的响应数据。
日志字段解释: 客户端IP地址: 172.16.100.2 ,发起请求的客户端的IP地址。2. 身份验证和授权: - - ,表示请求没有特定的用户身份验证或授权信息。3. 时间戳: [19/Aug/2024:10:31:34 +0800] ,请求发生的具体时间,包括日期、时间以及时区。4. 请求行: "GET /zabbix/zabbix.php?action=dashboard.list HTTP/1.1" ,包括:请求方法: GET ,表示请求类型为获取。请求资源: /zabbix/zabbix.php?action=dashboard.list ,请求的URL,包括查询参数 action=dashboard.list 。HTTP协议版本: HTTP/1.1 。5. 状态码: 200 ,表示请求成功,服务器正常响应。6. 内容大小: 10258 ,响应内容的字节数。7. 引用页: "-" ,表示没有引用页或该信息未提供。8. 用户代理: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0" ,客户端浏览器的详细信息,包括浏览器类型、操作系统、浏览器版本等。
2.1 access日志采集方式
Vector配置
`
`
2.3 access日志格式样例解析结果
{`
`"remote_host":` `"172.16.100.2",`
`"authentication_info":` `"-",`
`"timestamp":` `"19/Aug/2024:10:31:34 +0800",`
`"request_line":` `{`
`"method":` `"GET",`
`"resource":` `"/zabbix/zabbix.php",`
`"query_string":` `"action=dashboard.list",`
`"http_version":` `"HTTP/1.1"`
`},`
`"status_code":` `200,`
`"content_length":` `10258,`
`"referrer":` `"-",`
`"user_agent":` `"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"`
`}`
`
日志字段分析用途
- %a 和 %{c}a:客户端IP地址和底层对等IP地址,可以用来分析访问来源和识别代理后的原始IP。
- %A:本地IP地址,有助于了解请求被哪个服务器处理。
- %b 和 %B:响应大小,分析带宽使用和页面加载性能。
- %D:请求处理时间,可以用来识别慢速请求和性能问题。
- %h 和 %{c}h:远程主机名和底层TCP连接的主机名,有助于了解访问者的身份和地理位置。
- %m:请求方法,分析GET、POST等请求的分布。
- %q:查询字符串,了解用户的具体请求内容。
- %r:请求行,包含请求方法、资源和HTTP版本,用于分析请求的类型和协议兼容性。
- %s:状态码,分析成功请求和错误类型(如404、500等)。
- %t:时间戳,了解请求发生的时间,有助于识别流量高峰时段。
- %u:远程用户,如果进行了身份验证,可以用来分析特定用户的访问行为。
- %U:请求的URL路径,分析页面访问的热门程度。
- %{Referer}i 和 %{User-agent}i:引用页和用户代理,分别用来分析流量来源和访问者使用的浏览器/操作系统。
通过对这些字段的分
5. 参考
- Apache 官方文档: 用于理解 Ng 配置和日志处理。
mod_log_config - Apache HTTP Server Version 2.4
- 完成时间