- 我正在使用 cronolog 来让 apache 日志文件轮换。
我正在使用 fail2ban 来监控这些日志文件,并在发生滥用行为时禁止。
总有一个访问日志由 cronolog 创建的符号链接,指向当前日志文件。
每天晚上,我都会运行一个 cron 来压缩昨天的日志文件:
find /var/log/apache2/ -daystart -mtime +0 \( -name "*access*.log" -or -name "*error*.log" \) -type f -exec gzip {} \;
问题是,对于流量较低的网站,访问日志symlink 现在已失效,因为它指向的文件已被重命名gzip
。结果是 fail2ban 放弃了这些 jail,因为它无法再保存文件。
解决方案是仅压缩没有符号链接指向的日志文件。
我找到了一种这样做的方法,并且它有效,但我想知道是否有更简单的方法,因为这个方法真的很复杂,而且不是很快(afind
中的a find
)。
find /var/log/apache2/ -daystart -mtime +0 \( -name "*access*.log" -or -name "*error*.log" \) -type f -exec sh -c 'test `find /var/log/apache2/ -lname {} | wc -l` -eq 0' \; -exec gzip {} \;
答案1
可能是这样的:
LOGDIR=/路径/到/日志/文件 CURRENT=$(stat -c "%N" $LOGDIR/access.log | sed -e "s/.* -> //" -e "s/[\`']//g") 对于 $(find $LOGDIR -type f -name \*.log) 中的日志文件 做 如果 [ “$logfile” != “$LOGDIR/$CURRENT” ] 然后 gzip $日志文件 菲 完毕
可能需要根据您的具体要求和文件位置进行修改。