ログの回転はどのように機能しますか?

ログの回転はどのように機能しますか?

logrotate私のシェルファイルからコマンドを実行すると、これがどのように機能するのか、それがどのように機能しないのかを理解するのは本当に難しいです。

問題のコマンドは次のとおりです。

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分ごとに)確認し、そのファイルが指定されたサイズ(たとえば1MB)を超えることを確認したいと思います。その場合、ファイルは回転されます。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このファイルは1日1回だけ実行されますか/etc/cron.daily/logrotate

  3. これは、より頻繁に確認したい場合は、cronこのタスクを10分ごとに実行(この場合)するように設定する必要があるという意味ですか?

  4. rootとして実行しますかlogrotate <config file>?ルートとユーザーの両方で試してみたので、この質問をします。ユーザーが仕事をしていないようです。

このタイプの設定(まれではない)への初心者ガイドへのリンクが役立ちます。検索してみましたが、私が見つけたほとんどのコンテンツにはステップバイステップのガイドはありません。

答え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可能なタスクを1日1回に制限する純粋にサイズベースのチェックを望んでいたので、基準を削除しました(logrotate状況に応じて1日に最初に実行)。ではなく、実際のジョブで出力ファイルが生成されるようにcreate置き換えました。missingokrclonelogrotate

次に、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"

ログの回転一方、ログファイルは実行時に確認され、通常、システムは1日に1回(cronを介して)logrotateを実行するように設定されます。サブシステム構成は通常、構成ファイルをサブシステムに入れて実行され、通常は/etc/logrotate.drootとして実行されます。

編集者:@mikeげっ歯類

logrotate (cron経由または手動で)実行し、ファイルシステムに表示されているログファイル統計を確認し、その設定に従って回転をトリガーします。

rotatelogs標準入力を常に読み込み、ログファイルに追加し、ログファイルの時間またはサイズがトリガポイントに達したら、現在のログファイルを閉じて新しいログファイル(適切な命名)を作成し、それを新しいログファイルに追加し続けます。 。

これは、出力を生成するプログラムを開始する方法に関連しており、標準出力に書き込んでからそれを回転ログにパイプする必要があります。

例えば

while true ; do date ; sleep 30 ; done | rotatelogs -n 10 /home/mike/tmp/qqq.log 60

60秒ごとに切り取り、10個のファイルのループを提供します。

を使用して標準出力に書き込むことができますrclone--log-file "/dev/stdout"

[編集2] @mikeげっ歯類

私は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 は現代的であまり冗長ではないバリエーションを持っています。

関連情報