web-dev-qa-db-ja.com

logrotateはどのように機能しますか?

自分のシェルファイル内でコマンドを実行するときに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分ごとにチェックして、指定されたサイズ(たとえば1 MB)を超えているかどうかを確認します。持っている場合は、ファイルをローテーションします。 rclone-vvオプションとともに使用すると、意図的に大量の出力が生成されます(つまり、この使用例でlogrotateが機能することを理解しようとします)。

適度に役立つチュートリアル here がありますが、それでも私は暗闇の中に残っています:

  1. 独自のシステム以外のプロセスからのログのローテーションをどのように構成するつもりですか? /etc/logrotate.confの下部に線を引くつもりですか?これは私がやったことです(「#システム固有のログはここで設定できます」の下で):

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

    later:個々のファイルを/etc/logrotate.dに置くこともできるようになりました-それほど複雑ではありません。

  2. ファイル/etc/cron.daily/logrotateのおかげで、デフォルトではlogrotateは1日に1回しか実行されないのですか?

  3. これは、より頻繁なチェックが必要な場合、これを実行するためにcronジョブを設定し、(この例では)10分ごとに実行する必要があることを意味しますか?

  4. Rootとしてlogrotate <config file>を実行するつもりですか?私はrootとユーザーの両方として試したので、この質問をします。ユーザーが機能していないようです。

この種の設定への初心者向けガイドへのリンクは、それほど珍しくあり得ないので、役立つでしょう。私は検索しましたが、私が見つけたもののほとんどは、ステップバイステップのガイドを提供していません。

6
mike rodent

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日1回) 、発生します)。 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エントリを毎月循環またはリセットする必要があります。

8
roaima

独自のログファイルを作成していて、よりリアルタイムなサイズの切り刻みが必要な場合は、Apacheユーティリティrotatelogsここ

Stdinを読み取ることで機能し、コマンドライン引数に基づいてログファイルを切り刻みます。

例えば。

program-writing-to-stdout|/bin/rotatelogs /home/mike/tmp/qqq.log 1M"

一方、logrotateは、実行時にログファイルをチェックし、通常、システムは1日1回(cronを介して)logrotateを実行するように設定されています。サブシステムの構成は、通常、構成ファイルを/etc/logrotate.dにドロップすることによって行われ、はい、通常、ルートとして実行されます。

編集:@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 Q/Answer は、特にリダイレクトとパイプについて説明しています。ただし、要約すると、stderrのみをリダイレクトするか、stdoutとマージしてパイプに入れることができます。

バッシュの例:

Stderrとstderrをパイプにマージ

FirstCommand 2>&1 | OtherCommand

パイプへのstderrのみ、他のファイルへのstdout(/ dev/nullまたはstdoutを閉じるハイフン-の可能性もあります)。

FirstCommand 2>&1 1>otherfile.log | otherCommand

これらは、古いbash構文を使用する例です。bashv4には、最新の冗長性の低いバリアントがあります。

4
X Tian