我真的很难理解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
?这就是我所做的(在“#系统特定日志可以在此处配置”下):/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 分钟运行一次?你打算以 root 身份运行吗
logrotate <config file>
?我问这个问题是因为我已经尝试过作为 root 和用户。用户似乎没有工作。
此类设置的初学者指南的链接(这种情况并不少见)会很有帮助。我已经搜索过,但我发现的大部分内容都没有为您提供分步指南。
答案1
logrotate
可以作为普通用户运行,无需管理权限,以轮换该用户的日志。
# Create a local per-user configuration file
cat >.logrotate.conf <<'X'
/home/mike/tmp/qqq.log {
notifempty
missingok
size 1M
rotate 3
}
X
# Run logrotate with that configuration file
/usr/sbin/logrotate -v -s .logrotate.state .logrotate.conf
我删除了您的daily
标准,因为您想要纯粹基于大小的检查,这会将任何可能的操作限制为每天一次(每天第一次logrotate
运行,因为它发生了)。我已替换create
为missingok
,以便由您的实际rclone
工作来创建输出文件而不是logrotate
.
然后将logrotate
命令放入您的用户crontab
文件中:
# Capture any existing crontab entries
crontab -l >.crontab
# Append ours to the list
echo '0 * * * * /usr/sbin/logrotate -s .logrotate.state .logrotate.conf >>.crontab.log 2>&1' >>.crontab
# Reload crontab
crontab .crontab
使用此示例,命令的输出将写入到.crontab.log
,您可能需要一个logrotate
条目每月循环或重置它。
答案2
当您生成自己的日志文件并需要更实时的大小切割时,您应该查看 Apache 实用程序旋转日志 这里。
它通过读取标准输入来工作,并根据命令行参数分割日志文件。
例如。
program-writing-to-stdout|/bin/rotatelogs /home/mike/tmp/qqq.log 1M"
对数旋转另一方面,在运行时检查日志文件,通常系统设置为每天运行一次 logrotate(通过 cron)。子系统的配置通常是通过将配置文件放入其中来完成的/etc/logrotate.d
,是的,它通常以 root 身份运行。
编辑:@mike 啮齿动物
logrotate
运行(通过 cron 或手动),然后检查文件系统中看到的日志文件统计信息,然后根据其配置触发轮换。
rotatelogs
连续读取标准输入并附加到日志文件,然后当日志文件的时间或大小达到触发点时,它关闭当前日志文件,创建一个新的日志文件(适当命名),然后继续附加到新日志文件。
这与您如何启动生成输出的程序有关,它需要写入标准输出,然后将其通过管道传送到旋转日志中。
例如
while true ; do date ; sleep 30 ; done | rotatelogs -n 10 /home/mike/tmp/qqq.log 60
将为您提供 10 个文件的循环旋转,每 60 秒切割一次
使用rclone
,我希望--log-file "/dev/stdout"
它能够写入标准输出。
[编辑2] @mike rodent
我不熟悉 rclone,无论它是写入 stdout 还是 stderr,以及它写入其中任何一个会怎样,但有一些方法可以解决这个问题,即使不起作用--log-file=/dev/stdout
。
这StackOverflow 问题/解答等解释了重定向和管道。但总而言之,可以仅重定向 stderr 或与 stdout 合并到管道中。
重击示例:
将 stderr 与 stdout 合并到管道中
FirstCommand 2>&1 | OtherCommand
仅将 stderr 放入管道,将 stdout 放入其他文件(可以是 /dev/null 甚至只是一个-
关闭 stdout 的连字符)。
FirstCommand 2>&1 1>otherfile.log | otherCommand
这些示例使用较旧的 bash 语法,bash v4 有一个现代的不太详细的变体。