1. 定位Tomcat访问日志文件
在Debian系统中,Tomcat的访问日志(记录请求来源的核心日志)默认位于$CATALINA_HOME/logs目录下($CATALINA_HOME为Tomcat安装目录,如/opt/tomcat或/usr/local/tomcat)。日志文件命名通常为localhost_access_log.YYYY-MM-DD.txt(按日期分割)或prefix_timestamp.log(若通过server.xml自定义了prefix和suffix)。
若不确定日志位置,可直接查看Tomcat配置文件$CATALINA_HOME/conf/server.xml,找到<Valve className="org.apache.catalina.valves.AccessLogValve">标签,其中directory属性指定日志目录,prefix和suffix属性定义文件名前缀与后缀。
2. 确认日志格式(关键:包含请求来源字段)
Tomcat通过AccessLogValve的pattern属性定义日志格式,请求来源的核心字段是%h(远程客户端IP地址)。默认情况下,日志格式为common(仅包含%h、%l、%u、%t、%r、%s、%b)或combined(增加了Referer和User-Agent,更全面)。
若需自定义格式,可修改server.xml中的pattern属性,例如添加%{X-Forwarded-For}i(获取客户端真实IP,适用于反向代理场景):
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log."
suffix=".txt"
pattern="%{X-Forwarded-For}i %l %u %t "%r" %s %b"
resolveHosts="false"/>
其中,%{X-Forwarded-For}i用于获取客户端真实IP(若存在代理服务器),%r记录请求的第一行(包含HTTP方法、URL和协议),%s记录响应状态码,%b记录响应字节数。
3. 使用命令行工具查看请求来源
通过Linux命令行工具可快速过滤和分析日志中的请求来源(IP地址):
实时查看最新请求:使用tail -f命令实时输出日志文件的新增内容,例如:
tail -f /opt/tomcat/logs/localhost_access_log.2025-10-03.txt
输出示例:192.168.1.100 - - [03/Oct/2025:14:30:00 +0000] "GET /index.html HTTP/1.1" 200 1024(其中192.168.1.100为客户端IP)。
统计IP访问频率:使用awk提取IP地址(第1列),并通过sort | uniq -c | sort -nr统计每个IP的请求次数(从高到低排序):
awk '{print $1}' /opt/tomcat/logs/localhost_access_log.2025-10-03.txt | sort | uniq -c | sort -nr
输出示例:120 192.168.1.100(表示该IP访问了120次)。
过滤特定IP的请求:使用grep过滤指定IP的日志条目,例如查看192.168.1.100的所有请求:
grep "192.168.1.100" /opt/tomcat/logs/localhost_access_log.2025-10-03.txt
查看完整请求信息:若需查看请求的完整URL、方法、状态码等,可使用awk提取特定字段(如第4列时间、第5列请求行、第6列状态码):
awk '{print $4, $5, $6}' /opt/tomcat/logs/localhost_access_log.2025-10-03.txt
输出示例:[03/Oct/2025:14:30:00 +0000] "GET /index.html HTTP/1.1" 200。
4. 高级工具:ELK Stack可视化分析(可选)
若需要更深入的分析(如趋势图、地理IP定位、用户行为分析),可使用ELK Stack(Elasticsearch+Logstash+Kibana):
logstash.conf文件,解析Tomcat日志并导入Elasticsearch,例如:input {
file {
path => "/opt/tomcat/logs/localhost_access_log.*.txt"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "tomcat-access-%{+YYYY.MM.dd}"
}
}
注意事项
X-Forwarded-For头传递,需在pattern中添加%{X-Forwarded-For}i以获取真实IP。logrotate工具定期分割日志(如按天分割),避免单个文件过大影响查看效率。