这是使用默认日志记录配置的tomcat7安装,catalina.out仅在我们重新启动服务器时推出。由于它是prod服务器,我们不能经常重启它。我们有大量的条目进入该文件,这导致我们的catalina.out在几天内变得非常高,直到它消耗整个磁盘空间。
由于我们不想更改日志记录配置,因为它已被傀儡化,我们需要创建devops票证和所有那些缓慢的东西,我写了一个bash脚本,每隔5分钟通过crontab运行,这将削减达到限制时,将文件记录减半,脚本如下所示:
if [ $catalinaSize -gt $catalinaThreshold ]; then
middle=$(wc -l $catalinaLoc | awk '{ print $1 }')
middle=$(( $middle / 2 ))
sed -i -e 1,${middle}d $catalinaLoc
echo "+++ catalina.out was cut by half"
基本上这个脚本检查文件的当前大小并将其与阈值进行比较,然后使用wc和awk检索该文件中的行数,以便它可以使用sed将文件切割一半。 / p>
我在其他环境中测试了脚本,但它确实有效。问题是,在生产中连续几天成功运行之后,catalina.out突然从几天前就没有从tomcat获取任何日志条目。
我想到的解释是,由于减少了一半操作,Tomcat无法再写入该文件。
是否可以知道什么阻止Tomcat写入该文件?
答案 0 :(得分:1)
我怀疑它是sed -i
造成损害:在幕后,它将输出流写入临时文件,然后将临时文件移动到原始名称。我怀疑catalina持有的文件句柄不再指向任何文件。
您必须找到实际编辑文件的方法,而不是替换它。这可能是sed
的有效替代:
printf "%s\n" "1,${middle}d" "wq" | ed "$catalinaLoc"
切线,更容易获得行数:
middle=$(( $(wc -l < "$catalinaLoc") / 2 ))
当您重定向到wc
时,它不再打印出文件名。