我真的很难理解logrotate
在我自己的 shell 文件中运行命令时是如何工作的,以及它是如何不工作的。
有问题的命令是:
rclone -L -vv --log-file "/home/mike/tmp/qqq.log" sync "/media/mike/W10 D drive/My Documents/" remote:MyDocuments_M17A_from_Linux
我想要什么:
我希望经常检查这个 qqq.log 文件,比如每 10 分钟一次,看看它是否超过了给定的大小,比如 1 MB。如果有,旋转文件。rclone
使用该-vv
选项会故意产生丰富的输出(即试图理解让 logrotate 为这个用例工作)。
这里有一个适度有用的教程,但它仍然让我一无所知:
您打算如何配置来自您自己的非系统进程的日志轮换?您是要在底部粘贴线条
/etc/logrotate.conf
吗?这就是我所做的(在“#system-specific logs may be configured here”下):/home/mike/tmp/qqq.log { notifempty size 1M daily create 0664 root root rotate 3 }
后来:我现在意识到您也可以将单个文件放入
/etc/logrotate.d
其中-那里没有太大的复杂性。是不是默认情况下
logrotate
每天只运行一次,凭借文件/etc/cron.daily/logrotate
?这是否意味着如果我想要更频繁的检查,我可能应该设置一个
cron
工作来执行此操作,每 10 分钟运行一次(在此示例中)?你打算以
logrotate <config file>
root身份运行吗?我问这个问题是因为我以 root 和用户身份都尝试过。用户似乎没有工作。
指向此类设置的初学者指南的链接(这种设置并不少见)会很有帮助。我已经搜索过,但我发现的大部分内容都没有为您提供分步指南。
logrotate
可以作为普通用户运行,无需管理权限,为该用户轮换日志。我删除了您的
daily
标准,因为您想要纯粹基于大小的检查,这会将任何可能的操作限制为每天一次(每天第一次logrotate
运行,因为它发生了)。我已替换create
为,missingok
以便由您的实际rclone
工作来创建输出文件而不是logrotate
.然后将
logrotate
命令放入您的用户crontab
文件中:使用此示例,命令的输出将被写入
.crontab.log
,您可能需要一个logrotate
条目以每月循环或重置它。当您生成自己的日志文件并需要更实时的大小切割时,您应该在此处查看 Apache 实用程序rotatelogs 。
它通过读取标准输入来工作,并根据命令行参数分割日志文件。
例如。
另一方面, logrotate在运行时检查日志文件,通常系统设置为每天运行一次 logrotate(通过 cron)。子系统的配置通常通过将配置文件放入其中来完成
/etc/logrotate.d
,是的,它通常以 root 身份运行。编辑:@mike rodent
logrotate
运行(通过 cron 或手动),然后检查在文件系统中看到的日志文件统计信息,然后根据其配置触发轮换。rotatelogs
读取它的标准输入连续追加到日志文件,然后当日志文件的时间或大小达到触发点时,它关闭当前日志文件,创建一个新的日志文件(适当命名),然后继续追加到新的日志文件。这与您如何启动生成输出的程序有关,它需要写入标准输出,然后将其通过管道传输到旋转日志中。
例如
会给你一个循环旋转 10 个文件,每 60 秒切割一次
使用
rclone
,我希望--log-file "/dev/stdout"
它会写入标准输出。[编辑 2] @mike rodent
我不熟悉 rclone,它是否写入 stdout 或 stderr 以及它写入的任何内容,但有一些方法可以解决这个问题,即使它
--log-file=/dev/stdout
不起作用。这个StackOverflow Q/Answer等解释了重定向和管道。但总而言之,可以仅重定向 stderr 或与 stdout 合并到管道中。
重击示例:
将标准错误与标准输出合并到管道中
只有标准错误进入管道,标准输出到其他文件(可能是 /dev/null 甚至只是一个
-
关闭标准输出的连字符)。这些示例使用较旧的 bash 语法,bash v4 有一个现代的不那么冗长的变体。