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 天前日志