实时查看日志命令
凌晨三点,日志服务器报警,命令网站挂了。日志你ssh上去,命令第一件事就是日志翻日志。这时候你用的命令不是tail就是less,但很多人连tail -f和tail -F的日志区别都没搞明白。
tail -f是命令跟随文件描述符,tail -F是日志跟随文件名。区别在轮转场景。命令日志切了,日志旧文件被rename,命令新文件顶上来。日志-f还在看旧文件,命令-F自动切到新文件。日志生产环境一律用-F,别给自己挖坑。
真正要实时看,我推荐multitail,一个终端里分屏跟多个日志。比如同时看nginx的access和error,还有后端应用的日志。上下分屏,颜色高亮,正则过滤。装一下不亏,比开三个终端窗口强太多。
但multitail有个毛病,内存占用偏高,服务器负载高的时候别用。这时候回到基本功,tail -F直接跟。想要过滤,管道接grep。grep --line-buffered参数别忘了,否则输出会攒一批才打印,实时性就没了。
还有个大坑——日志文件被清空,比如logrotate的copytruncate模式。文件还是那个文件,但内容没了。tail会继续等新内容,看起来像卡住了。这时候按Ctrl+C重新tail一下,或者用less +F模式。less +F是tail -f的加强版,按Ctrl+C切到普通less浏览,按F再切回跟随模式,翻历史日志和实时看能无缝切换。
我见过不少运维老手,日志一多就慌了。其实有个土办法,写个一行脚本循环刷新。watch -n 1 "tail -n 20 /var/log/app.log"。watch每秒执行一次,tail取最后20行,效果等同实时刷新,而且可读性好。
如果日志量巨大,每秒几百MB那种,tail直接扛不住。这时候用journalctl,systemd的日志系统。journalctl -u my-service -f,按服务名过滤,-f实时跟随。它还支持时间戳过滤,journalctl --since "10 min ago" --until "5 min ago",查问题的时候特别顺手。
最后说个冷门的。日志里全是乱码,编码不对,怎么看?tail管道接iconv转码。tail -F file | iconv -f gbk -t utf8。中日韩系统上这招救命,别在日志编码上浪费半小时。
工具就这些,关键还是习惯。实时看日志不是盯着屏幕等,而是带着问题去看。先想清楚你要找什么,再用对命令。tail -F打底,grep过滤,journalctl查服务,multitail做对比。够用了。
凌晨的告警不会等你熟悉命令。平时把这几招练熟,真出事的时候,手比脑子快,日志一翻,问题定位,那个爽快感比喝红牛提神。

喜欢
讨厌