Catalina.out 未通过 bash 脚本编辑后记录

Catalina.out not logging after edition by bash script

这是具有默认日志记录配置的 tomcat7 安装,catalina.out 仅在我们重新启动服务器时才会推出。因为它是 prod 服务器,我们不能经常重启它。我们有大量条目进入该文件,这导致我们的 catalina.out 在几天内增长得非常高,直到它消耗了整个磁盘空间。

因为我们不想更改日志记录配置,因为它是傀儡化的,而且我们需要创建 devops 票证和所有那些缓慢的东西,我写了一个 bash 脚本,正在 运行 每 5 分钟通过 crontab 在达到限制时将日志文件减半,脚本如下所示:

 if [ $catalinaSize -gt $catalinaThreshold ]; then
  middle=$(wc -l $catalinaLoc | awk '{ print  }')
  middle=$(( $middle / 2 ))
  sed -i -e 1,${middle}d $catalinaLoc
  echo "+++ catalina.out was cut by half"

基本上这个脚本检查文件的当前大小并将其与阈值进行比较,然后它使用 wc 和 awk 检索该文件中的行数,然后它可以使用 sed 将文件减半.

我在其他环境中测试了该脚本并且它有效。问题是,在生产中成功 运行 几天后,catalina.out 突然没有从 tomcat 获取任何日志条目,因为几天前。

我想到的解释是 Tomcat 由于减半操作而无法再写入该文件。

是否可以知道是什么阻止了 Tomcat 写入该文件?

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

您必须找到一种方法来实际编辑 文件,而不是替换它。这可能是 sed:

的有效替代品
printf "%s\n" "1,${middle}d" "wq" | ed "$catalinaLoc"

切向地,获取行数的更简单方法:

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

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