利用日志进行 Ubuntu Tomcat 负载均衡
一 架构与日志来源
二 日志配置与采集
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log"
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b %D" />
关键字段含义:%h(客户端IP)、%t(时间)、%r(请求行)、%s(状态码)、%b(字节数)、%D(处理时间,毫秒)。$ModLoad imfile
$InputFilePollInterval 10
$WorkDirectory /var/spool/rsyslog
$PrivDropToGroup adm
$InputFileName /opt/tomcat/logs/catalina.out
$InputFileTag tomcat-catalina
$InputFileStateFile stat-catalina-out
$InputFileSeverity info
$InputFilePersistStateInterval 25000
$InputRunFileMonitor
$InputFileName /opt/tomcat/logs/localhost_access_log.*
$InputFileTag tomcat-access
$InputFileStateFile stat-access
$InputFileSeverity info
$InputFilePersistStateInterval 25000
$InputRunFileMonitor
local7.* /var/log/tomcat/tomcat.log
之后可由 Logstash 消费并送入 Elasticsearch,在 Kibana 中构建按实例、按接口的负载与错误面板。三 基于日志的负载评估方法
# 按实例统计(假设已通过 tag 或字段区分实例)
grep 'localhost_access_log' /var/log/tomcat/tomcat.log | \
awk '{ip=$1; gsub(/\./,"_",ip); print ip}' | sort | uniq -c | sort -nr
# 按 URI 统计 TopN
awk '{print $7}' /opt/tomcat/logs/localhost_access_log.* | sort | uniq -c | sort -nr | head
<Proxy balancer://mycluster>
BalancerMember http://tomcat1:8080 route=tomcat1
BalancerMember http://tomcat2:8080 route=tomcat2
ProxySet lbmethod=byrequests stickysession=JSESSIONID|jsessionid
</Proxy>
ProxyPass / balancer://mycluster
ProxyPassReverse / balancer://mycluster
awk '$9 >= 500 {print $1,$7,$9}' /opt/tomcat/logs/localhost_access_log.* | sort | uniq -c | sort -nr
awk '$NF > 1000 {print $7,$NF}' /opt/tomcat/logs/localhost_access_log.* | sort -k2 -nr | head
四 快速命令清单
tail -f /opt/tomcat1/logs/localhost_access_log.* | awk '$9 ~ /^[45]/ {print $0}'
tail -n 10000 /opt/tomcat*/logs/localhost_access_log.* | awk '{a[$9]++} END {for(k in a) print k,a[k]}'
awk '{print $7,$NF}' /opt/tomcat*/logs/localhost_access_log.* | sort -k2 -nr | head
grep 'localhost_access_log' /var/log/tomcat/tomcat.log | \
awk '$9 >= 500 {print $7}' | sort | uniq -c | sort -nr | head