find 命令可用 -newermt 按修改时间筛选日志文件,如 find /var/log -type f -newermt "2024-05-20" ! -newermt "2024-05-21" 查找 mtime 在当日范围的普通文件,因 linux 不记录生成时间,mtime 或 ctime 更可靠。

用 find 按修改时间筛选日志文件
Linux 本身不记录“生成时间”,文件的 ctime(状态变更时间)和 mtime(内容修改时间)更可靠;日志轮转后,通常以 mtime 判定当天写入的主日志文件。直接查某天(比如 2024-05-20)的日志,优先用 find:
-
find /var/log -type f -newermt "2024-05-20" ! -newermt "2024-05-21"—— 找出mtime落在当天 00:00:00 到 23:59:59 的所有普通文件 - 如果日志是按天切割的(如
syslog.20240520),也可用通配:ls /var/log/syslog.*20240520*,但注意命名规则因服务而异(journalctl、logrotate配置不同) -
-newermt在较老的 GNU find(touch -d "2024-05-20" /tmp/start; touch -d "2024-05-21" /tmp/end; find /var/log -type f -newer /tmp/start ! -newer /tmp/end
用 journalctl 查 systemd 日志的某天记录
如果服务用 systemd 管理(绝大多数现代发行版默认),原始日志由 journald 统一收集,journalctl 是最准的方式:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
journalctl --since "2024-05-20 00:00:00" --until "2024-05-20 23:59:59"—— 时间范围必须带引号,否则空格会中断命令 - 加
-u sshd可限定服务,加-n 100限制行数,避免卡顿;--no-pager防止分页器干扰管道处理 - 注意:
journald默认只保留最近 few days 的日志(取决于/etc/systemd/journald.conf中的RuntimeMaxUse和MaxRetentionSec),查太早的日期可能返回空
用 grep 在大日志里筛某天的行(不推荐但有时只能这么干)
有些日志格式固定(如 May 20 10:23:45 host app[123]: msg),且没轮转、单个文件巨大时,grep 是唯一办法,但效率低、易漏匹配:
-
grep "^May 20 " /var/log/syslog—— 注意月份是英文缩写,且开头有空格;^锚定行首,避免匹配到消息体里的 “May 20” - 更稳一点:
grep -E "^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) +20 " /var/log/syslog | head -50,先限制输出再排查 - 别用
date +%b\ %d直接拼进grep——如果当天是 1~9 日,%d输出的是" 1"(带前导空格),但日志里可能是" 1"或" 01",不一致就漏数据
为什么不能只靠文件名或 ls -l?
ls -l 显示的是 mtime,但它只反映最后一次写入时间,不是“生成日”。一个日志文件可能在 5 月 20 日创建、21 日凌晨被追加一行,它的 mtime 就变成 21 日;而 atime(访问时间)在多数系统上已禁用,birthtime(创建时间)在 ext4 上不可靠、xfs 上需特定挂载选项才支持。所以:
- 轮转日志(
logrotate)通常用copytruncate或重命名,新文件的mtime就是当天起始时间,可信 - 但像
/var/log/messages这种持续追写的主文件,mtime只能说明“最后更新在哪天”,不能反推“哪天生成” - 真正要追溯某天行为,得结合服务自身日志格式(如 nginx 的
$time_local)、journalctl时间戳,或提前配置日志轮转










