1. 首页 > Tomcat教程 > 正文

Tomcat教程FG023-Tomcat日志配置与日志分析故障排查实战

目录大纲

Part01-基础概念与理论知识

Part02-生产环境规划与建议

Part03-生产环境项目实施方案

Part04-生产案例与实战讲解

Part05-风哥经验总结与分享

Part01-基础概念与理论知识

1.1 日志基本概念

日志是记录系统运行状态和事件的重要工具,主要功能包括:

  • 问题诊断:通过日志信息定位和诊断系统问题
  • 性能分析:分析系统性能瓶颈,优化系统性能
  • 安全审计:记录系统安全事件,进行安全审计
  • 合规要求:满足法律法规对日志记录的要求

日志的类型包括:

  • 系统日志:记录操作系统级别的信息
  • 应用日志:记录应用程序的运行信息
  • 访问日志:记录用户访问请求的信息
  • 错误日志:记录系统错误和异常信息

更多视频教程www.fgedu.net.cn

1.2 Tomcat日志架构

Tomcat的日志架构由以下组件组成:

  • LogManager:日志管理器,负责管理日志配置
  • Logger:日志记录器,负责记录日志消息
  • Handler:日志处理器,负责将日志输出到目标
  • Formatter:日志格式化器,负责格式化日志消息
  • Filter:日志过滤器,负责过滤日志消息

Tomcat支持多种日志框架:

  • JUL (Java Util Logging):Java标准日志框架
  • Log4j:Apache的日志框架
  • Logback:Log4j的改进版本
  • SLF4J:日志门面接口

1.3 日志级别与格式

日志级别用于标识日志消息的重要程度,常见的日志级别包括:

  • SEVERE:严重错误,需要立即处理
  • WARNING:警告信息,需要关注
  • INFO:一般信息,记录系统运行状态
  • CONFIG:配置信息,记录系统配置
  • FINE:详细信息,记录调试信息
  • FINER:更详细的信息
  • FINEST:最详细的信息

日志格式通常包括以下信息:

  • 时间戳:日志产生的时间
  • 日志级别:日志的级别
  • 线程名:产生日志的线程
  • 类名:产生日志的类
  • 日志消息:日志的具体内容

1.4 日志分析原理

日志分析是通过分析日志数据来发现系统问题和优化性能的过程,主要包括:

  • 日志收集:收集分散在各个服务器上的日志
  • 日志解析:解析日志格式,提取关键信息
  • 日志索引:建立日志索引,提高查询效率
  • 日志分析:分析日志数据,发现问题和趋势
  • 日志可视化:通过图表等方式展示日志数据

常用的日志分析工具包括:

  • ELK Stack:Elasticsearch、Logstash、Kibana
  • Grep:命令行日志搜索工具
  • Awk:文本处理工具
  • Sed:流编辑器

风哥提示:日志是系统运维的重要工具,合理配置和管理日志可以显著提高故障排查效率

Part02-生产环境规划与建议

2.1 日志配置建议

在生产环境中,日志配置的建议:

  • 设置合理的日志级别:生产环境建议使用INFO或WARNING级别
  • 配置日志轮转:避免日志文件过大,影响系统性能
  • 启用访问日志:记录用户访问信息,便于分析
  • 配置日志格式:使用统一的日志格式,便于分析
  • 配置日志输出:将日志输出到文件,便于长期存储

2.2 日志存储建议

日志存储的建议:

  • 使用独立的存储:将日志存储在独立的磁盘或分区
  • 定期备份:定期备份日志,防止数据丢失
  • 设置保留策略:根据需求设置日志保留时间
  • 使用压缩:对历史日志进行压缩,节省存储空间
  • 使用分布式存储:对于大规模系统,使用分布式日志存储

2.3 日志安全建议

日志安全的建议:

  • 限制日志访问:设置日志文件的访问权限
  • 敏感信息脱敏:对日志中的敏感信息进行脱敏处理
  • 日志完整性:使用日志签名或哈希,确保日志完整性
  • 日志审计:定期审计日志,发现异常访问
  • 日志加密:对敏感日志进行加密存储

学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 日志配置步骤

日志配置的步骤如下:

  1. 编辑logging.properties文件:配置日志级别、处理器和格式
  2. 配置访问日志:在server.xml中配置访问日志
  3. 配置应用日志:在应用的web.xml中配置应用日志
  4. 配置日志轮转:设置日志轮转策略
  5. 重启Tomcat:使配置生效

3.2 日志分析工具配置

日志分析工具配置的步骤:

  1. 选择日志分析工具:根据需求选择ELK、Grep等工具
  2. 配置日志收集:配置日志收集代理
  3. 配置日志解析:配置日志解析规则
  4. 配置日志索引:配置日志索引策略
  5. 配置可视化:配置日志可视化仪表板

3.3 部署验证与测试

部署完成后,需要进行以下验证和测试:

  • 日志输出测试:测试日志是否正常输出
  • 日志级别测试:测试不同级别的日志是否正确输出
  • 日志轮转测试:测试日志轮转是否正常工作
  • 日志分析测试:测试日志分析工具是否能正常分析日志
  • 故障排查测试:测试通过日志是否能定位问题

Part04-生产案例与实战讲解

4.1 访问日志配置与分析实战

以下是访问日志配置与分析的实战案例:

# 配置Tomcat访问日志
cat > /Tomcat/app/conf/server.xml << EOF










EOF

# 重启Tomcat服务
/Tomcat/app/bin/shutdown.sh
/Tomcat/app/bin/startup.sh

# 访问Tomcat应用
curl http://localhost:8080/

# 查看访问日志
cat /Tomcat/app/logs/localhost_access_log.*.txt

# 输出示例:
127.0.0.1 – – [21/Jul/2024:11:00:00 +0800] “GET / HTTP/1.1” 200 12345 123 “http://www.example.com” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36”
127.0.0.1 – – [21/Jul/2024:11:00:05 +0800] “GET /favicon.ico HTTP/1.1” 404 1024 5 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36”

# 使用grep分析访问日志
grep “GET” /Tomcat/app/logs/localhost_access_log.*.txt | wc -l

# 输出示例:
100

# 查看访问最多的IP
awk ‘{print $1}’ /Tomcat/app/logs/localhost_access_log.*.txt | sort | uniq -c | sort -rn | head -10

# 输出示例:
50 192.168.1.100
30 192.168.1.101
20 192.168.1.102

# 查看响应时间最长的请求
awk ‘{print $NF, $7}’ /Tomcat/app/logs/localhost_access_log.*.txt | sort -rn | head -10

# 输出示例:
5000 /api/slow
3000 /api/timeout
2000 /api/heavy

# 查看错误请求
grep ” 4[0-9][0-9] ” /Tomcat/app/logs/localhost_access_log.*.txt | head -10

# 输出示例:
127.0.0.1 – – [21/Jul/2024:11:00:00 +0800] “GET /notfound HTTP/1.1” 404 1024 5 “-” “Mozilla/5.0”
127.0.0.1 – – [21/Jul/2024:11:00:05 +0800] “POST /api/error HTTP/1.1” 500 2048 10 “-” “Mozilla/5.0”

# 查看User-Agent统计
awk -F'”‘ ‘{print $6}’ /Tomcat/app/logs/localhost_access_log.*.txt | sort | uniq -c | sort -rn | head -10

# 输出示例:
80 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
15 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36
5 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36

4.2 应用日志配置与分析实战

以下是应用日志配置与分析的实战案例:

# 配置Tomcat应用日志
cat > /Tomcat/app/conf/logging.properties << EOF handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, 3manager.org.apache.juli.AsyncFileHandler, 4host-manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler .handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler 1catalina.org.apache.juli.AsyncFileHandler.level = FINE 1catalina.org.apache.juli.AsyncFileHandler.directory = /Tomcat/fgdata/logs 1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina. 1catalina.org.apache.juli.AsyncFileHandler.maxDays = 90 1catalina.org.apache.juli.AsyncFileHandler.encoding = UTF-8 2localhost.org.apache.juli.AsyncFileHandler.level = FINE 2localhost.org.apache.juli.AsyncFileHandler.directory = /Tomcat/fgdata/logs 2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost. 2localhost.org.apache.juli.AsyncFileHandler.maxDays = 90 2localhost.org.apache.juli.AsyncFileHandler.encoding = UTF-8 3manager.org.apache.juli.AsyncFileHandler.level = FINE 3manager.org.apache.juli.AsyncFileHandler.directory = /Tomcat/fgdata/logs 3manager.org.apache.juli.AsyncFileHandler.prefix = manager. 3manager.org.apache.juli.AsyncFileHandler.maxDays = 90 3manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8 4host-manager.org.apache.juli.AsyncFileHandler.level = FINE 4host-manager.org.apache.juli.AsyncFileHandler.directory = /Tomcat/fgdata/logs 4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager. 4host-manager.org.apache.juli.AsyncFileHandler.maxDays = 90 4host-manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8 java.util.logging.ConsoleHandler.level = FINE java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/myapp].level = INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/myapp].handlers = 2localhost.org.apache.juli.AsyncFileHandler EOF # 重启Tomcat服务 /Tomcat/app/bin/shutdown.sh /Tomcat/app/bin/startup.sh # 查看应用日志 tail -f /Tomcat/fgdata/logs/localhost.*.log # 输出示例: 21-Jul-2024 11:00:00.000 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/Tomcat/app/webapps/myapp] 21-Jul-2024 11:00:00.100 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/Tomcat/app/webapps/myapp] has finished in [100] ms 21-Jul-2024 11:00:01.000 INFO [http-nio-8080-exec-1] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [myapp] threw exception java.lang.NullPointerException: null at com.fgedu.MyServlet.doGet(MyServlet.java:25) at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) # 使用grep分析应用日志 grep "ERROR" /Tomcat/fgdata/logs/localhost.*.log # 输出示例: 21-Jul-2024 11:00:01.000 SEVERE [http-nio-8080-exec-1] com.fgedu.MyServlet.doGet Error processing request # 查看异常堆栈 grep -A 10 "Exception" /Tomcat/fgdata/logs/localhost.*.log # 输出示例: java.lang.NullPointerException: null at com.fgedu.MyServlet.doGet(MyServlet.java:25) at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) # 统计错误数量 grep "SEVERE" /Tomcat/fgdata/logs/localhost.*.log | wc -l # 输出示例: 5 # 查看特定时间段的日志 grep "21-Jul-2024 11:00" /Tomcat/fgdata/logs/localhost.*.log # 输出示例: 21-Jul-2024 11:00:00.000 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/Tomcat/app/webapps/myapp] 21-Jul-2024 11:00:01.000 SEVERE [http-nio-8080-exec-1] com.fgedu.MyServlet.doGet Error processing request

4.3 故障排查实战案例

以下是故障排查的实战案例:

# 故障1:应用启动失败
# 查看启动日志
tail -100 /Tomcat/fgdata/logs/catalina.*.log

# 输出示例:
21-Jul-2024 11:00:00.000 SEVERE [main] org.apache.catalina.core.StandardContext.startInternal Error deploying web application archive [/Tomcat/app/webapps/myapp.war]
java.lang.ClassNotFoundException: com.fgedu.MyServlet
at java.lang.ClassLoader.findClass(ClassLoader.java:718)
at java.lang.ClassLoader.loadClass(ClassLoader.java:589)

# 分析:缺少类文件
# 解决方案:检查WAR包中是否包含所有必要的类文件

# 故障2:内存溢出
# 查看日志中的内存错误
grep “OutOfMemoryError” /Tomcat/fgdata/logs/catalina.*.log

# 输出示例:
21-Jul-2024 11:00:00.000 SEVERE [main] java.lang.OutOfMemoryError: Java heap space

# 分析:堆内存不足
# 解决方案:增加堆内存大小
# 编辑catalina.sh文件
cat >> /Tomcat/app/bin/catalina.sh << EOF JAVA_OPTS="-Xms512m -Xmx1024m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m" EOF # 故障3:数据库连接失败 # 查看应用日志中的数据库错误 grep "SQLException" /Tomcat/fgdata/logs/localhost.*.log # 输出示例: 21-Jul-2024 11:00:00.000 SEVERE [http-nio-8080-exec-1] com.fgedu.DBConnection.getConnection Cannot connect to database java.sql.SQLException: Access denied for user 'fgedu'@'localhost' # 分析:数据库用户权限问题 # 解决方案:检查数据库用户权限 mysql -u root -p -e "GRANT ALL PRIVILEGES ON fgedudb.* TO 'fgedu'@'localhost'; FLUSH PRIVILEGES;" # 故障4:线程池耗尽 # 查看日志中的线程池错误 grep "ThreadPool" /Tomcat/fgdata/logs/catalina.*.log # 输出示例: 21-Jul-2024 11:00:00.000 WARNING [http-nio-8080-exec-1] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() threw exception java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@12345678 rejected from java.util.concurrent.ThreadPoolExecutor@87654321[Running, pool size = 200, active threads = 200, queued tasks = 0, completed tasks = 1000] # 分析:线程池已满 # 解决方案:增加线程池大小 # 编辑server.xml文件 sed -i 's/maxThreads="200"/maxThreads="400"/g' /Tomcat/app/conf/server.xml # 故障5:响应时间过长 # 查看访问日志中的响应时间 awk '{print $NF, $7}' /Tomcat/app/logs/localhost_access_log.*.txt | sort -rn | head -10 # 输出示例: 5000 /api/slow 3000 /api/timeout 2000 /api/heavy # 分析:某些接口响应时间过长 # 解决方案:优化这些接口的性能,或使用缓存 # 使用awk分析日志统计信息 # 统计每小时的请求数 awk '{print $4}' /Tomcat/app/logs/localhost_access_log.*.txt | cut -d: -f2 | sort | uniq -c # 输出示例: 100 11 200 12 150 13 # 统计HTTP状态码分布 awk '{print $9}' /Tomcat/app/logs/localhost_access_log.*.txt | sort | uniq -c # 输出示例: 900 200 50 404 30 500 20 301

更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 日志配置常见问题与解决方案

在日志配置中,常见的问题及解决方案如下:

  • 日志文件过大:配置日志轮转,定期清理历史日志
  • 日志丢失:检查日志文件权限,确保日志可以正常写入
  • 日志格式不统一:使用统一的日志格式,便于分析
  • 日志级别设置不当:根据环境设置合适的日志级别
  • 日志分析困难:使用日志分析工具,提高分析效率

5.2 生产环境日志管理最佳实践

在生产环境中,日志管理的最佳实践包括:

  • 集中式日志管理:使用ELK等工具实现集中式日志管理
  • 日志分级:根据日志级别设置不同的存储策略
  • 日志监控:配置日志监控,及时发现异常
  • 日志备份:定期备份日志,防止数据丢失
  • 日志审计:定期审计日志,发现安全问题

5.3 故障排查经验分享

以下是一些故障排查的经验分享:

  • 从错误日志开始:首先查看错误日志,快速定位问题
  • 使用时间线分析:按时间顺序分析日志,了解问题的发展过程
  • 关注异常堆栈:异常堆栈是定位问题的关键信息
  • 使用日志分析工具:使用ELK、Grep等工具提高分析效率
  • 建立故障知识库:记录常见故障和解决方案,便于快速排查

风哥提示:日志是系统运维的重要工具,合理配置和管理日志可以显著提高故障排查效率

from Tomcat视频:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息