如何制作用于清理日志文件的 cron 脚本?

如何制作用于清理日志文件的 cron 脚本?

我通常不做这种事情,所以我必须问一下。我如何编写一个脚本来检查日志文件,假设它的名称为 log.txt,从中抓取除前 100 000 行之外的所有内容到新的 log.txt 文件中并删除旧的 log.txt?它也必须每月运行一次。

到目前为止,凭借我零编码知识,我只设法编写了一个脚本,每月删除一次 log.txt(自动生成新的脚本),但我真的很想保留除下面提到的最旧的 100 000 个条目之外的数据。

这是旧脚本

#!/bin/sh
find /mnt/usb_storage/ -type f -name "log.txt" -exec rm -r {} \;

我如何实现它:

# cd /privRoot
# chmod 755 deleteLogMonthly.sh
# crontab -e 

59 23 1 * * deleteLogMonthly.sh

答案1

你正在尝试重新发明轮子。

Logrotate 可以高效地完成这一任务:

https://www.linode.com/docs/uptime/logs/use-logrotate-to-manage-log-files

http://www.rackspace.com/knowledge_center/article/understanding-logrotate-utility

https://www.digitalocean.com/community/tutorials/how-to-configure-logging-and-log-rotation-in-apache-on-an-ubuntu-vps

您不需要指定 100K 行,只需给它一个时间间隔,它就会从该时间段开始写入新日志文件,并保留旧日志文件。

如果由于某些奇怪的原因,logrotate 不是一个真正的选择,请查看 Cronolog:

有没有可以替代 logrotate 的 apache 日志?

http://linux.die.net/man/1/cronolog

或者确实手动编写一个像这样的 bash 脚本:

http://www.paperstreetonline.com/2014/12/09/bash-script-an-alternative-to-logrotate-d-to-rotate-asterisk-log-files/

这仍然基于天数,但您可以在其中添加一些行计数。

答案2

在您的 logrotate 配置中添加以下内容(/etc/logrotate.d/ 下的新文件)

/mnt/usb_storage/log.txt {
           rotate 5 # Change this to number of files you need to preserve
           monthly
           prerotate
               /usr/bin/sed -e '1,100000d' < /mnt/usb_storage/log.txt
           endscript
           postrotate
               <some another action>
           endscript
       }

您可以使用以下方法进行验证logrotate -d /etc/logrotate.d/mylogrotate.conf(假设您已经创建了该文件)

答案3

查找“logrotate”的手册页或通过 shell 脚本自己制作。这没有什么神奇的。如果你知道如何手工制作,只需将其全部放在一个 txt 文件中就可以了。

还请查看工具“tail”的手册页。它旨在显示“尾部”或更准确地说是文件的最新 X 行。“man tail”为您提供有关如何使用它的更多信息。

相关内容