我有两个日志文件: abc.log和abc.log_old。当abc.log已满时,它将覆盖到abc.log_old文件中。但我不确定什么时候会满,日志文件的大小也没有固定。日志文件来自不同的系统。
我的要求是在abc.log_old文件被abc.log文件覆盖之前,先备份它。如何在备份日志文件被其他日志文件覆盖之前获取它?
发布于 2020-07-02 15:07:53
别再发明轮子了。这是logrotate的工作。
发布于 2020-07-02 18:02:36
如果覆盖abc.log_old的应用程序是支持它的应用程序,情况会好得多。这是系统通常的设置方式。具体来说,
如果是重设abc.log_old.
abc.log abc.log到abc.log_old.abc.log,以确保当前称为abc.log_old的文件的所有文件句柄都是closed.或者在无法重命名打开的文件(例如Windows)的系统上:
如果是重设abc.log.
abc.log_old.
abc.log.
abc.log的服务到abc.log_old.
abc.log.的服务
这就是logrotate背后的想法。
但是,听起来您希望由一个独立于覆盖abc.log_old的系统来执行备份。
比如说,abc.log从不需要少于T秒的时间就能吃饱。每隔T/3秒运行一个脚本,执行以下操作:
如果abc.log_old.
abc.log_old或
如果存在abc.log_old.
abc.log_old成功,abc.log_old的修改时间和size.通过使用T/3秒的时间,至少会有两次尝试在文件被覆盖之前备份它(允许其中一次尝试没有问题地失败)。使用小于T/(N+1)的周期来保证N次尝试。
上述假设假设备份所需的时间少于时间段。这也意味着重复的备份失败将导致数据丢失。这两个问题都可以通过以下方式加以解决:
如果存在
abc.log_old,则1. If there are any files in a directory set aside to be the queue directory, 1. Get the number of the highest numbered file in that directory.1. Else, 1. Consider the highest numbered file to be `0`.1. Rename `abc.log_old` such that: - It will be moved into the queue directory.
- It's file name ends with a number one higher than the previously obtained number.numerically.
列表中每个文件的
1. Backup the file.
2. If the backup was successful,
1. Delete `abc.log_old`.1. Else,
1. Exit.https://stackoverflow.com/questions/62698936
复制相似问题