Linux每天收集修改日志
/var/log/
我想每天从目录收集日志文件。
我的脚本将压缩目录中的所有文件并单独存储。但问题是我每天都会压缩所有日志文件,文件大小不断增加。
那么如何每天只压缩修改过的文件(仅修改过的内容)。
如何获取特定时间点后文件的修改内容。即,我们第一次可以收集整个日志。
从第二天开始,我们应该只收集当天的日志。
第二天....
....
答案1
如果满足您的需求,一个简单的方法是拥有一个每天轮换的特定日志文件。首先,您添加到/etc/(r)syslog.conf
,可能靠近顶部,以防有任何规则在记录后丢弃某些内容:
*.* -/var/log/daily.log
这将收到全部消息;即,任何其他日志中的任何内容都将在该日志中。
然后你只需要一个可以通过 cron 运行的脚本。您可以使用logrotate
它,但在这种情况下没有太多意义。
#!/bin/sh
gzip /var/log/daily.log
# Do whatever with the gzipped file
touch /var/log/daily.log
kill -s HUP `pidof syslogd` # see below
最后一步对于重新启动 syslogd 是必要的,因此它会重新打开新的/var/log/daily.log
- 否则您之后将看不到任何内容。如果您正在使用 rsyslog,请改用pidof rsyslogd
。pidof
首先尝试哪个来进行测试。
最后,在/etc/crontab
:
0 0 * * * root /path/to/rotationscript
每天半夜都会这样做。
答案2
您是否考虑过使用对数旋转?
Logrotate 是一个用于按预定时间间隔轮换日志文件的实用程序。安装后,您将使用如下所示的部分对其进行配置:
/var/log/*.log /var/log/auth /var/log/messages {
daily
rotate 5
copytruncate
compress
dateext
}
当你安装它时,你的包管理器应该已经将它添加到了/etc/cron.daily
,所以你不需要做任何其他事情。
这样您最终会得到诸如 之类的日志/var/log/auth.20140420.gz
。如果你想收集它们,你所要做的就是寻找文件.gz
。
重要笔记:
在我的示例中,我故意没有这样做/var/log/*
,即使在您最初的问题中说您想要轮换所有日志/var/log
。这是因为 中的一些内容/var/log
(例如utmp
和wtmp
)不是正常的日志文件,不应该被轮换出来。
有两种轮换日志的方法。您可以重命名日志,然后告诉写入日志的程序重新打开日志文件,也可以将日志文件的内容复制到新名称,然后截断原始文件。
移动方法更好,但有些应用程序没有办法通知它们重新打开日志,因此复制/截断更安全。
该copytruncate
选项是控制此行为的选项。如果您想使用 move 方法,请将其删除,然后放入一个postrotate
部分(请参阅手册页)。