首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java或其他平台上创建一个logrotate友好的文件写入器?

如何在Java或其他平台上创建一个logrotate友好的文件写入器?
EN

Stack Overflow用户
提问于 2011-06-29 05:17:34
回答 2查看 4.8K关注 0票数 11

在Java语言中实现与logrotate兼容的文件写入器/记录器的最佳实践是什么?目标是允许logrotate用于所有日志管理,而不是使用内置的日志API (Log4J等)的轮换/管理。

我很有兴趣听到关于Java以外的其他开发平台的评论/答案。

EN

回答 2

Stack Overflow用户

发布于 2011-06-29 07:27:36

您只需定期关闭并重新打开应用程序中的日志文件。您需要一个保持上次关闭时间的处理程序。如果(例如)自上次关闭以来已过了20秒,并且日志条目即将被写入,则处理程序应关闭并重新打开文件。它应该在写入日志条目之前进行这样的检查

如果不这样做,即使logrotate (!)重命名了旧文件,日志也会被写入旧文件。(文件描述符保持不变),然后当日志被压缩和移除时,日志条目将消失(在这种情况下,java将静默地丢弃这些日志)。

关闭并重新打开日志(使用文件名)将确保如果文件已被重命名,将创建一个新的文件。每次写入日志时关闭和重新打开文件是一种过度的杀伤力,因为打开文件是一项代价高昂的操作。

票数 9
EN

Stack Overflow用户

发布于 2017-02-01 01:03:42

我看了一些其他的应用程序,很明显有一个postrotate选项和一个copytruncate option。copytruncate选项更简单,但我认为它不太可靠,因为缓冲区可能不会刷新(即遵循@Jarek Potuik答案),即使刷新了,也可能会得到重复的条目或丢失的条目。

因此,假设您需要postrotate选项:

postrotate选项允许您运行命令来通知您的应用程序重新打开文件(关闭然后再打开)。在Java中打开和关闭文件时,您将使用同步块或某种类型的锁来执行此操作,当然还会刷新任何缓冲区。

假设您的应用程序名为myapp

您在/etc/logrotate.d/myapp中会有一个包含以下内容的文件:

代码语言:javascript
复制
/var/log/myapp/*.log {
        weekly
        missingok
        rotate 20
        compress
        delaycompress
        notifempty
        sharedscripts
        postrotate
            /etc/init.d/myapp rotate-logs > /dev/null
        endscript
}

命令/etc/init.d/myapp rotate-logs需要向应用程序发出信号,以关闭并重新打开日志文件。

信令部分相当棘手,这取决于你的应用程序类型,因为Java对IPC的支持不是很好(即unix信号),所以你可能不得不打开一个端口或使用现有的端口,如8080 (在servlet容器的情况下,即HTTP REST命令)来告诉你的应用程序关闭并重新打开日志文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6513186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档