自分のシェルファイル内でコマンドを実行するときに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 がありますが、それでも私は暗闇の中に残っています:
独自のシステム以外のプロセスからのログのローテーションをどのように構成するつもりですか? /etc/logrotate.conf
の下部に線を引くつもりですか?これは私がやったことです(「#システム固有のログはここで設定できます」の下で):
/home/mike/tmp/qqq.log {
notifempty
size 1M
daily
create 0664 root root
rotate 3
}
later:個々のファイルを/etc/logrotate.d
に置くこともできるようになりました-それほど複雑ではありません。
ファイル/etc/cron.daily/logrotate
のおかげで、デフォルトではlogrotate
は1日に1回しか実行されないのですか?
これは、より頻繁なチェックが必要な場合、これを実行するためにcron
ジョブを設定し、(この例では)10分ごとに実行する必要があることを意味しますか?
Rootとしてlogrotate <config file>
を実行するつもりですか?私はrootとユーザーの両方として試したので、この質問をします。ユーザーが機能していないようです。
この種の設定への初心者向けガイドへのリンクは、それほど珍しくあり得ないので、役立つでしょう。私は検索しましたが、私が見つけたもののほとんどは、ステップバイステップのガイドを提供していません。
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回) 、発生します)。 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
エントリを毎月循環またはリセットする必要があります。
独自のログファイルを作成していて、よりリアルタイムなサイズの切り刻みが必要な場合は、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には、最新の冗長性の低いバリアントがあります。