Linux 日志时间解析:journalctl 查看完整时间戳

syslog 格式的日志默认不记录年份,看到 Nov 15 13:57:05 无法确认是哪一年。

显示完整年份(ISO 格式)

journalctl -u your-service -o short-iso

输出示例:

2025-11-15T13:57:05+08:00 hostname service: log message

-o short-iso 输出 ISO 8601 格式,包含年份和时区。

按时间范围过滤

journalctl -u your-service \
  --since "2025-11-15 13:52:00" \
  --until "2025-11-15 14:02:00"

查看最近 N 分钟:

journalctl -u your-service --since "10 minutes ago"

实时跟踪(类似 tail -f):

journalctl -u your-service -f

查找错误并显示上下文

已知有一条错误日志,想看前后发生了什么:

# 找到行号
journalctl -u your-service | grep -n "错误关键字"

# 查看前后 50 行
journalctl -u your-service -n 1000 | grep -C 50 "错误关键字"

-C 50 = Context 50,显示匹配行前后各 50 行。

普通日志文件的上下文查询

日志在 /opt/logs/app.log

# 找到行号
grep -n "错误关键字" /opt/logs/app.log

# 例如输出: 123456:错误关键字
# 查看附近 100 行
sed -n '123400,123500p' /opt/logs/app.log

或者直接用 -C 参数:

grep -nC 50 "错误关键字" /opt/logs/app.log

定位 Java 服务的真实错误原因

Java 的 查询简单视图数据失败 这类消息通常只是表层日志,真正原因在下面的 Caused by:

# 先找到关键字附近
grep -C 100 "查询简单视图数据失败" app.log | grep "Caused by"

常见真实原因:

  • Caused by: java.sql.SQLException — SQL 执行失败
  • Caused by: org.springframework.data.redis.RedisConnectionFailureException — Redis 连接断开
  • Caused by: feign.RetryableException — 上游服务不可达

找到 Caused by 后再针对异常类型排查。

大日志文件的搜索技巧

# 只看有关键字的行(不展示上下文)
grep "关键字" /var/log/app.log | tail -20

# 统计出现次数
grep -c "ERROR" /var/log/app.log

# 按时间段提取(前提:日志每行以时间开头)
awk '/2025-11-15 13:5[0-9]/' /var/log/app.log

journalctl 常用参数速查

journalctl -u <service>                  # 指定服务
journalctl -u <service> -n 100           # 最新 100 行
journalctl -u <service> -f               # 实时跟踪
journalctl -u <service> -o short-iso     # ISO 时间戳(含年份)
journalctl -u <service> -p err           # 只看 error 级别
journalctl --since "1 hour ago"          # 最近 1 小时
journalctl --disk-usage                  # 日志占用磁盘
journalctl --vacuum-time=7d              # 清理 7 天前日志