重定向输出和日志轮换

重定向输出和日志轮换

我需要一些有关脚本/命令/cronjob 的帮助。

我需要将 tcpdump 命令的输出重定向到日志文件,并每天保留 1 个日志文件。我知道我可以使用 tcpdump 日志记录语法,但我还用它awk -F来过滤输出。我的命令看起来像这样,并且单独运行效果很好。

tcpdump -ieth0 -p "tcp[tcpflags] & (tcp-syn) !=0" | awk -F 'Flags' '{print $1}' > /var/log/tcpdump.log

我怎样才能使它每天轮换文件?有没有办法用 shell 脚本来做(我的 shell 脚本知识非常有限)。

答案1

如果你不擅长编写 shell 脚本,我不会尝试编写自己的日志轮换。听起来你没有任何需要,使用日志旋转而不是自己动手。你可以制作一个简单的配置文件

# /etc/logrotate.d/tcpdump
"/var/log/tcpdump.log" {
       daily
       rotate 30
       compress

       prerotate
            killall your_dump_script
       endscript

       postrotate
            your_dump_script &
       endscript
 }

这会:

  • 旋转文件daily
  • 保留30副本,因为你不想填满你的驱动器
  • compress使用 gzip 节省磁盘空间。您可以使用zlesszgrep查看它们。
  • 在旋转之前将其终止your_dump_script,然后重新启动。您可以随意将其重命名为您更喜欢的名字。

如果你把它放进去/etc/logrotate.d,它应该会被你内置的 cron 作业所接收,但如果你想手动运行它来验证它是否有效:

logrotate /etc/logrotate.d/tcpdump

或者将配置放在不同的位置并从脚本中运行。无论哪种方式,您编写的代码都更少,而且事情更有可能可靠地运行。

答案2

您可以利用rotatelogs文档在这里):您需要做的就是通过它传输输出,提供一些选项,它会处理剩下的事情。例如:

tcpdump ... | rotatelogs /var/log/tcpdump.log

当满足您指定的条件(文件大小、时间间隔)时将自动旋转输出文件。

答案3

我写了一个日志记录器这个周末。如果我读过@JdeBP 的很好的答案multilog

我专注于它的轻量级并且能够对其输出块进行 bzip2 处理,如下所示:

verbosecommand | logrotee \
  --compress "bzip2 {}" --compress-suffix .bz2 \
  /var/log/verbosecommand.log

不过,还有很多工作要做和测试。

相关内容