【linux查看日志】

Linux环境下日志查看场景与操作详解

一、日志查看核心场景

1.1 实时监控类场景

应用启动监控:观察应用初始化过程

  • 错误追踪:实时发现系统异常

  • 请求跟踪:监控API调用链路

  • 性能监控:观察响应时间变化

1.2 历史分析类场景

故障复盘:分析历史故障原因

趋势分析:统计错误频率和模式

安全审计:检查安全相关事件

合规检查:满足审计要求

二、常用日志查看命令及示例

2.1 基础查看命令

bash 复制代码
tail - 查看文件尾部

bash

  1. 查看日志最后100行
bash 复制代码
tail -n 100 /var/log/application.log
  1. 实时监控日志新增内容(最常用)
bash 复制代码
tail -f /var/log/application.log
  1. 监控多个日志文件
bash 复制代码
tail -f /var/log/app/*.log
  1. 显示行号查看
bash 复制代码
tail -n 50 -f /var/log/application.log
  1. 从第1000行开始显示到文件末尾
bash 复制代码
tail -n +1000 /var/log/application.log
head - 查看文件头部

bash

查看日志前50行(常用于检查应用启动日志)

bash 复制代码
head -n 50 /var/log/application.log

cat - 显示整个文件

bash

  1. 显示完整文件
bash 复制代码
cat /var/log/application.log
  1. 显示并显示行号
bash 复制代码
cat -n /var/log/application.log
  1. 合并显示多个文件
bash 复制代码
cat /var/log/app.log /var/log/app_error.log
  1. 创建日志备份(常用操作)
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实时监控

掌握正则表达式,提高搜索效率

编写常用脚本,自动化重复分析任务

理解日志轮转机制,知道如何查看历史日志

善用管道和重定向,构建复杂查询

相关推荐
计算机毕设指导68 小时前
基于微信小程序的校园食堂点餐系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·intellij-idea
AAA简单玩转程序设计8 小时前
救命!Java小知识点,基础党吃透直接起飞
java·前端
李玮豪Jimmy8 小时前
Day42:单调栈part2(42.接雨水、84.柱状图中最大的矩形)
java·算法
元气满满-樱8 小时前
Nginx虚拟主机实验
运维·chrome·nginx
福尔摩斯张8 小时前
Linux Kernel 设计思路与原理详解:从“一切皆文件“到模块化架构(超详细)
java·linux·运维·开发语言·jvm·c++·架构
深圳市恒讯科技9 小时前
俄罗斯服务器常见故障汇总及排查方法
运维·服务器
爱吃番茄鼠骗9 小时前
Linux操作系统———TCP网络编程
linux·网络
Qiuner9 小时前
Spring Boot AOP(二) 代理机制解析
java·spring boot·后端
wanhengidc9 小时前
云端算力 云手机 巨 椰
运维·服务器·科技·智能手机·云计算