Linux查找文件与筛选日志内容

“文件在哪”和“日志里有没有某句话”是两类任务。find按文件名、类型和时间等条件定位文件,grep读取文本内容。先限定业务目录,可以减少扫描量,也避免把其他客户数据或系统秘密带进排查结果。

从已知目录查找文件

search_dir=/var/log
find "$search_dir" -xdev -type f -name '*.log'
find "$search_dir" -xdev -type f -name '*.log' -mtime -1

将search_dir改为你已确认可读取的业务目录。-type f只找普通文件;单引号让*.log交给find匹配,而不先被Shell展开;-xdev不跨到其他文件系统,挂载在子目录中的日志可能因此不被搜索。-mtime -1表示按find的24小时计数规则选择最近修改的文件,不等同于“今天零点以来”。

在具体文本日志里找线索

grep -nF -- 'ERROR' /实际路径/app.log
grep -niE -- 'error|failed|timeout' /实际路径/app.log
tail -n 100 /实际路径/app.log

这里的“实际路径”必须先替换。-n附行号,-F按普通字符串搜索,适合包含点号、括号的报错原文;-i忽略大小写,-E把竖线等作为扩展正则语法。不能把用户提供的任意报错都直接塞进正则表达式。grep没有匹配时通常退出状态为1,读取错误一般为2,要区分“没找到”和“没读到”。

先用练习文件理解结果

search_lab=$(mktemp -d)
printf 'INFO start\nERROR connection timeout\nINFO finish\n' > "$search_lab/app.log"
grep -nF -- 'ERROR' "$search_lab/app.log"
grep -n -B 1 -A 1 -F -- 'ERROR' "$search_lab/app.log"

第一条grep应找到第2行;第二条附带命中前后各1行,帮助看到事件上下文。真实日志可能包含多行堆栈、时区和轮转文件,单独一句ERROR往往不够;应结合异常发生时间、进程和请求标识缩小范围,而不是把所有错误都视为本次故障。

安全导出与常见遗漏

  • 只导出相关时间段和上下文,保存到当前账号的私有目录,分享前遮挡令牌、密码、完整用户数据和无关内部地址。
  • Permission denied先查读取权限;不要为了搜日志把整个目录改为可公开读取。
  • 没有结果时确认大小写、文件是否已经轮转、是否为压缩文件,以及程序是否把日志写到journal。二进制journal不能直接用grep代替journalctl读取。
  • 不要从根目录无限制递归搜索,也不要把find后面直接接删除操作;确认输出是独立步骤。

实时日志持续增长时,tail读到的是某个时刻的末尾。需要持续观察可使用 tail -F /实际路径/app.log,按Ctrl+C结束本地跟随。保存结果时同时记录原文件名、采集时间和时区,方便与其他记录对应。