在 Bash 中使用 tail 跟踪每日日志文件

在 Bash 中使用 tail 跟踪每日日志文件

我有一个任务是使用 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。

相关内容