日志轮转如何工作?

日志轮转如何工作?

我真的很难理解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 适合此用例)。

有一个相当有用的教程这里,但它仍然让我一无所知:

  1. 您打算如何配置您自己的非系统进程的日志轮换?你的意思是在底部粘上线条吗/etc/logrotate.conf?这就是我所做的(在“#系统特定日志可以在此处配置”下):

    /home/mike/tmp/qqq.log {
      notifempty
      size 1M
      daily
      create 0664 root root
      rotate 3
    }
    

    之后:我现在意识到您还可以放入单独的文件/etc/logrotate.d- 那里并不复杂。

  2. 默认情况logrotate下,凭借该文件每天只运行一次吗/etc/cron.daily/logrotate

  3. 这是否意味着,如果我想要更频繁地进行检查,我也许应该设置一个cron作业来执行此操作,(在本例中)每 10 分钟运行一次?

  4. 你打算以 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运行,因为它发生了)。我已替换createmissingok,以便由您的实际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 有一个现代的不太详细的变体。

相关内容