Linux环境下日志查看场景与操作详解
一、日志查看核心场景
1.1 实时监控类场景
应用启动监控:观察应用初始化过程
-
错误追踪:实时发现系统异常
-
请求跟踪:监控API调用链路
-
性能监控:观察响应时间变化
1.2 历史分析类场景
故障复盘:分析历史故障原因
趋势分析:统计错误频率和模式
安全审计:检查安全相关事件
合规检查:满足审计要求
二、常用日志查看命令及示例
2.1 基础查看命令
bash
tail - 查看文件尾部
bash
- 查看日志最后100行
bash
tail -n 100 /var/log/application.log
- 实时监控日志新增内容(最常用)
bash
tail -f /var/log/application.log
- 监控多个日志文件
bash
tail -f /var/log/app/*.log
- 显示行号查看
bash
tail -n 50 -f /var/log/application.log
- 从第1000行开始显示到文件末尾
bash
tail -n +1000 /var/log/application.log
head - 查看文件头部
bash
查看日志前50行(常用于检查应用启动日志)
bash
head -n 50 /var/log/application.log
cat - 显示整个文件
bash
- 显示完整文件
bash
cat /var/log/application.log
- 显示并显示行号
bash
cat -n /var/log/application.log
- 合并显示多个文件
bash
cat /var/log/app.log /var/log/app_error.log
- 创建日志备份(常用操作)
bash
cat app.log > app.log.bak.$(date +%Y%m%d)
2.2 过滤搜索命令
bash
grep - 文本搜索(最常用)
bash
##1. 基础搜索(区分大小写)
bash
grep "ERROR" /var/log/application.log
2. 忽略大小写搜索
bash
grep -i "error" /var/log/application.log
3. 显示匹配行及前后行(重要!)
bash
grep -B 5 -A 5 "NullPointerException" app.log
-B 5: 显示匹配行前5行
-A 5: 显示匹配行后5行
4. 统计匹配次数
bash
grep -c "ERROR" app.log
5. 递归搜索目录
bash
grep -r "Connection refused" /var/log/
6. 显示不匹配的行
bash
grep -v "DEBUG" app.log
7. 使用正则表达式
bash
grep -E "ERROR|FATAL|Exception" app.log
8. 彩色输出
bash
grep --color=auto "ERROR" app.log
zgrep/zcat - 处理压缩日志
bash
1. 搜索压缩日志文件
bash
zgrep "ERROR" /var/log/app.log.2.gz
2. 查看压缩日志内容
zcat /var/log/app.log.1.gz | head -100
2.3 高级查看分析
bash
less/more - 分页查看
bash
1. 分页查看日志(推荐less)
bash
less /var/log/application.log
2. less常用操作:
空格键: 向下翻页
b: 向上翻页
/pattern: 搜索
n: 下一个匹配
N: 上一个匹配
g: 跳到文件开头
G: 跳到文件末尾
q: 退出
3. 查看时直接搜索
bash
less -p "ERROR" /var/log/app.log
4. 查看多个文件
bash
less app.log app_error.log
awk - 文本处理分析
bash
1. 提取特定列(如提取时间戳和错误信息)
bash
awk '{print $1, $2, $5}' /var/log/app.log
2. 统计不同错误类型数量
bash
awk '/ERROR/ {count++} END {print count}' app.log
3. 按时间范围过滤日志
bash
awk '$1 >= "10:00:00" && $1 <= "12:00:00"' app.log
4. 分组统计
bash
awk '{print $3}' app.log | sort | uniq -c | sort -rn
5. 复杂条件过滤
bash
awk '$5 == "ERROR" && $6 ~ /Timeout/' app.log
sed - 流编辑器
bash
1. 提取特定时间段的日志
bash
sed -n '/2024-01-15 10:00/,/2024-01-15 11:00/p' app.log
2. 替换文本
bash
sed 's/ERROR/ERR/g' app.log
3. 删除包含特定字符串的行
bash
sed '/DEBUG/d' app.log
4. 显示特定行范围
bash
sed -n '100,200p' app.log
2.4 组合命令管道操作
bash
1. 实时监控并过滤ERROR日志
bash
tail -f app.log | grep --color=auto "ERROR"
2. 查看最近1小时内的ERROR
bash
grep "$(date -d '1 hour ago' '+%Y-%m-%d %H')" app.log | grep "ERROR"
3. 统计每小时错误数
bash
grep "ERROR" app.log | awk '{print $2}' | cut -d: -f1 | sort | uniq -c
4. 查找包含异常的堆栈信息
bash
grep -A 20 "Exception" app.log | less
5. 查找ERROR并显示时间戳和消息
bash
grep "ERROR" app.log | awk '{print $1, $2, $NF}'
6. 实时监控并保存到文件
bash
tail -f app.log | tee -a app_monitor.log
7. 查找最频繁出现的错误
bash
grep "ERROR" app.log | awk -F'ERROR' '{print $2}' | sort | uniq -c | sort -rn | head -20
三、实际Java应用日志分析示例
3.1 Spring Boot应用日志示例
假设日志格式为:
bash
2024-01-15 10:30:25.123 INFO [main] com.example.Application: Started Application in 5.456 seconds
2024-01-15 10:30:30.456 ERROR [http-nio-8080-exec-1] c.e.controller.UserController: User not found for id: 123
1. 查找所有ERROR日志
bash
grep "ERROR" /var/log/spring-app.log
2. 查找特定Controller的错误
bash
grep "UserController.*ERROR" /var/log/spring-app.log
3. 统计各Controller错误数量
bash
grep "ERROR" /var/log/spring-app.log | awk '{print $5}' | sort | uniq -c
4. 查找响应时间超过5秒的请求
bash
grep "Processing time.*[5-9][0-9][0-9][0-9]" /var/log/spring-app.log
5. 提取堆栈跟踪
bash
grep -A 30 "NullPointerException" /var/log/spring-app.log > npe_trace.txt
3.2 Tomcat访问日志分析
假设access_log格式:
bash
192.168.1.100 - - [15/Jan/2024:10:30:25 +0800] "GET /api/users HTTP/1.1" 200 1234
1. 统计HTTP状态码分布
bash
awk '{print $9}' access_log | sort | uniq -c | sort -rn
2. 查找404请求
bash
awk '$9 == 404 {print $7}' access_log | sort | uniq -c | sort -rn
3. 统计IP访问频率
bash
awk '{print $1}' access_log | sort | uniq -c | sort -rn | head -20
4. 查找慢请求(响应时间>3s)
bash
awk '$NF > 3000 {print $0}' access_log
5. 统计API端点调用次数
bash
awk '{print $7}' access_log | sort | uniq -c | sort -rn | head -10
3.3 多服务器日志聚合分析
bash
1. 同时查看多台服务器日志
bash
ssh server1 "tail -f /var/log/app.log" &
ssh server2 "tail -f /var/log/app.log" &
2. 收集各服务器错误日志
bash
for server in {1..5}; do
echo "=== Server app${server} ==="
ssh app${server} "grep 'ERROR' /var/log/app.log | tail -10"
done
3. 使用multitail工具(需安装)
bash
multitail -l 'ssh server1 "tail -f /var/log/app.log"' \
-l 'ssh server2 "tail -f /var/log/app.log"'
四、实用脚本示例
4.1 自动日志分析脚本
bash
#!/bin/bash
analyze_logs.sh
bash
LOG_FILE="/var/log/application.log"
REPORT_FILE="/tmp/log_report_$(date +%Y%m%d_%H%M%S).txt"
echo "=== 日志分析报告 $(date) ===" > $REPORT_FILE
echo "" >> $REPORT_FILE
1. 错误统计
bash
echo "1. 错误统计:" >> $REPORT_FILE
grep -c "ERROR" $LOG_FILE >> $REPORT_FILE
2. 错误类型分布
bash
echo "" >> $REPORT_FILE
echo "2. 错误类型分布:" >> $REPORT_FILE
grep "ERROR" $LOG_FILE | awk -F'ERROR' '{print $2}' | \
awk '{print $1}' | sort | uniq -c | sort -rn >> $REPORT_FILE
3. 最频繁的错误消息
bash
echo "" >> $REPORT_FILE
echo "3. 最频繁的错误消息TOP 10:" >> $REPORT_FILE
grep "ERROR" $LOG_FILE | awk -F'ERROR' '{print $2}' | \
head -c 100 | sort | uniq -c | sort -rn | head -10 >> $REPORT_FILE
4. 按小时错误趋势
bash
echo "" >> $REPORT_FILE
echo "4. 按小时错误趋势:" >> $REPORT_FILE
grep "ERROR" $LOG_FILE | awk '{print $2}' | \
cut -d: -f1 | sort | uniq -c >> $REPORT_FILE
cat $REPORT_FILE
4.2 实时异常监控脚本
bash
#!/bin/bash
monitor_errors.sh
bash
LOG_FILE=$1
ALERT_THRESHOLD=10 # 10分钟内错误阈值
ALERT_EMAIL="admin@example.com"
监控ERROR日志
bash
tail -f $LOG_FILE | while read line
do
if echo "$line" | grep -q "ERROR"; then
echo "[$(date)] 发现错误: $line"
# 检查过去10分钟错误数
error_count=$(grep -c "ERROR" $LOG_FILE | \
awk -v d1="$(date --date="-10 min" "+%Y-%m-%d %H:%M:%S")" \
-v d2="$(date "+%Y-%m-%d %H:%M:%S")" \
'$0 >= d1 && $0 <= d2')
if [ $error_count -ge $ALERT_THRESHOLD ]; then
echo "警告:过去10分钟错误数超过阈值!" | \
mail -s "应用错误警报" $ALERT_EMAIL
fi
fi
done
五、日志管理最佳实践
5.1 日志轮转配置(logrotate)
bash
/etc/logrotate.d/myapp
bash
/var/log/myapp/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 644 appuser appgroup
postrotate
/usr/bin/systemctl reload myapp > /dev/null 2>&1 || true
endscript
}
5.2 性能优化技巧
bash
1. 使用LC_ALL=C加速grep
bash
LC_ALL=C grep "pattern" large.log
2. 大文件使用less替代vim
bash
less +G large.log
3. 使用split分割大文件
split -l 1000000 large.log chunk_
4. 并行处理多个文件
bash
find /var/log -name "*.log" -print0 | xargs -0 -P 4 grep "ERROR"
5.3 安全注意事项
bash
1. 使用sudo查看系统日志
bash
sudo tail -f /var/log/syslog
2. 避免在生产环境直接修改日志
错误做法:vi /var/log/app.log
正确做法:cp /var/log/app.log /tmp/ && vi /tmp/app.log
3. 清理敏感信息
bash
grep -v "password\|token\|secret" app.log > cleaned.log
六、常用工具推荐
jq - JSON日志处理
bash
cat app.json.log | jq '. | select(.level == "ERROR")'
lnav - 高级日志查看器
lnav /var/log/app.log
rg (ripgrep) - 更快的grep替代品
rg "ERROR" /var/log/
bat - 带语法高亮的cat
bat /var/log/app.log
总结
掌握Linux日志查看和分析技能对于Java高级开发至关重要。建议:
日常使用组合命令,如tail -f | grep实时监控
掌握正则表达式,提高搜索效率
编写常用脚本,自动化重复分析任务
理解日志轮转机制,知道如何查看历史日志
善用管道和重定向,构建复杂查询