Catalina.out在bash脚本编辑后没有记录

时间:2015-02-13 21:39:41

标签: linux bash logging tomcat7

这是使用默认日志记录配置的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写入该文件?

1 个答案:

答案 0 :(得分:1)

我怀疑它是sed -i造成损害:在幕后,它将输出流写入临时文件,然后将临时文件移动到原始名称。我怀疑catalina持有的文件句柄不再指向任何文件。

您必须找到实际编辑文件的方法,而不是替换它。这可能是sed的有效替代:

printf "%s\n" "1,${middle}d" "wq" | ed "$catalinaLoc"

切线,更容易获得行数:

middle=$(( $(wc -l < "$catalinaLoc") / 2 ))

当您重定向到wc时,它不再打印出文件名。