我有一个任务是使用 bash 脚本来监视几个以当天命名的日志文件,例如。 YYYY-MM-DD.log。
(1)我以前是tail -f
跟随文件但无法处理文件轮转。
即使使用tail -F $FILENAME
,我最多只能跟踪日志 24 小时,并且需要重新启动。
我希望完成的是拥有类似的东西tail -F $CURRENTDATE
,这样我就可以让它永远运行,并且每个午夜它都会切换到遵循以当前日期命名的新日志文件。
但变量似乎$CURRENTDATE
不是动态的。有没有另一种方法可以做到这一点,而无需crontab
每 24 小时执行一次脚本?也许设置一个符号文件之类的?
(2) 同时,如果tail -f
使用 ,如果后面的文件丢失或改名,它会返回什么信号?如何捕获执行过程中的异常。
答案1
该变量$CURRENTDATE
并不像您想象的那样动态。当tail -F $CURRENTDATE
命令被评估执行时,该变量会扩展。如果您ps
在执行命令后运行该命令,您可以看到这一点。请注意,输出中它显示的是当前日期的值,而不是$CURRENTDATE
.
$ CURRENTDATE=$(date +%Y%M%d.log)
$ tail -F $CURRENTDATE
$ ps -eaf|grep tail
saml 1171 13564 0 22:13 pts/4 00:00:00 tail -F 20130517.log
您遇到的这个问题通常是为什么大多数服务器守护程序(例如 Apache、Nginx 或 Jetty)将所有当前日期记录到名为 的文件中,error.log
然后将该文件轮换为其他名称(例如error_20130517.log
之后)的原因。
error.log
这允许您使用诸如 之类的命令连续监视tail -F error.log
。
答案2
这正是您正在寻找的:
watch -n 60 'tail -n 30 /path/to/logfile-$(date +%Y-%m-%d.log)'
这将每 60 秒刷新一次当前日期的日志文件。根据您的喜好自定义 n 个参数。请注意单引号:这使得 watch 命令每次都会评估该命令,而不是评估一次并提供输出。我自己也遇到了同样的问题,这对我来说非常有效。如果您尝试调试以这种方式而不是其他方式记录的程序,我认为当前的答案“大玩家不喜欢乱搞,所以他们使用 logrotate”是一个足够的解决方案。
这是一种快速而肮脏的方法,但是如果您正在开发某些东西,请像大公司一样使用 logrotate。