stdoutやstderrに情報を書き込めるLinuxプログラムを持っています
その出力を /var/log
のファイルにリダイレクトするシェルスクリプトがあります。(>>
と 2>&1
を経由して)
そのログファイルを回転させる方法はありますか?(サイズを最大にしてから別のファイルに切り替える、限られたファイルだけを保持する)
logrotate
プログラムの話をしているいくつかの回答を見ましたが、聞こえはいいのですが、内部的にログファイルを生成してHUPシグナルを処理するプログラムに焦点を当てているようにも見えます。基本的な出力リダイレクトスクリプトで動作させる方法はありますか?
59 Miral 2011-06-01
別の方法としては、サイズキャップされた自動回転されたログファイルセットを維持することを主な目的として設計されたツールを介して出力をパイプすることができます
- daemontoolsのダン・バーンスタインの
multilog
- Bruce Guenterの
multilog
をdaemontools-encoreから - s6からローラン・ベルコーの
s6-log
- runitからのGerrit Papeの
svlogd
- ウェイン・マーシャルの
tinylog
を加害者から - 私の
cyclog
はnoshから
multilog
形式のログファイルセットを処理するためのツールには、特に以下のようなものがあります
- ラス・オールベリーの
multilog-watch
logrange
- ポール・クレーマーの<++1
- 私の
follow-log-directories
はnoshから - 私の
export-to-rsyslog
はnoshから
Further reading
- ジョナサン・デ・ボイン・ポラード(2015年)。”ロギング“。daemontoolsファミリー。よくある回答
- ジョナサン・デ・ボイン・ポラード(2016)。今世紀は
logrotate
やnewsyslog
を使ってはいけない。よくある回答 - https://unix.stackexchange.com/a/326166/5132
51 JdeBP 2011-06-01
(docs を参照してください) apache に同梱されている rotatelogs
ツール (bin
ディレクトリにあります) は stdin からの入力を受け取り、一定時間後にログを回転させます
16 BertNase 2011-06-01
私も同じような問題を抱えていて、最初はlogrotateを捨てていましたが、logrotateは実際にこのようなことができることがわかりました。ググってもこの用語は出てこなかったので、この回答を追加して、この場合の使い方を明確にしています
このトリックは、リダイレクトが”>” (create)ではなく”>>” (append)で行われた場合にのみ機能するということです
設定ファイル(truncate.cfg)
/tmp/temp.log {
size 10M
copytruncate
rotate 4
maxage 100
}
テストプログラム(ファイルを放棄することはありません)。ログファイルを削除しても、実際にはディスク上の空き容量がなくなるように見えますが、それを見ることができます
cat /dev/urandom >> /tmp/temp.log
ランニングログを回転させます
logrotate truncate.cfg
15 Sam Hendley 2014-10-23
標準的なログストリーム(syslog、daemon、cron、user、security、mailなど)のいずれかにアクセスできる場合は、代わりにlogger
コマンドを使用してパイプすることができます
echo "Hello." | logger -p daemon.info
そうでなければ、ログに記録された内容をカスタムプログラムやスクリプトにパイプして処理するか、 logrotate
の設定を見てみるのが良いかもしれません
EDIT: JdeBPさんの回答は、あなたが探しているかもしれないものを持っているようです
14 Lara Dougan 2011-06-01
では、進行中のプロセスのリダイレクトされた標準出力でlogrotateを動作させる方法はありますか?
やったー!logrotate が提供する “copytruncate” ディレクティブをチェックしてください。logrotate にこのような状況を扱うように指示することができます
一つの注意点は、あなたの状況に問題があるかもしれないし、ないかもしれません
なお、コピーしてから切り捨てるまでのタイムスライスが非常に小さいので、一部のログデータが失われる可能性があることに注意してください
逸話ですが、このディレクティブを適用することをユーザに推奨している「現実世界」のログソースをいくつか見たことがあります。このオプションについては、こちらで議論されています
3 natevw 2013-10-14
coreutils の一部である split を使ってください。stdin を取得してチャンクに分割することができます (チャンクサイズや行数などに基づいて)
Example:
app | split --bytes 1G - /var/logs/put-prefix-here
ダッシュ (-) は、ファイルの代わりに標準入力を使用するように “split” を指示していることに注意してください
3 Nazar 2015-06-11
私のユースケースではmultilog
が好きなのですが、私のユースケースはあまりにも些細でシンプルなので、私が見つけたドキュメントやサンプルではあまり簡単には説明されていません。以下は単純なマルチログ回転の例です
mkdir /tmp/myapp
./myapp | multilog t s10000 n5 '!tai64nlocal' /tmp/myapp 2>&1
Some notes:
- これはログを /tmp/myapp/ ディレクトリにダンプします
- s10000は10,000バイト*を表します
- n5は5つのファイルを表します。* ‘current’ログはファイルの1つとしてカウントされるので、4つの古いログ+’current’を含みます
- これは、フランソワ-ボーソレイユによって提供された例から適応に基づいています。http://blog.teksol.info/pages/daemontools/best-practices
- 私は多くのオプションを理解していません – 私はあなたがこれを拡張するために、様々なドキュメントを参照してください
- ドキュメントにはこう警告されています。
"Note that running processor may block any program feeding input to multilog."
で、’processor’ はコマンドの'!tai64nlocal'
部分です
*多くのアプリケーションでは、長期的な使用には適していません。これらは、大規模なログよりも素早くログを充填したり回転させたりする動作を観察することができます
最後に、必要に応じてnohupを忘れずに!nohupを使えば、2>&1
(ここではs=10e6、n=30)は必要ありません
mkdir -p /tmp/myapp
nohup ./myapp | multilog t s10000000 n30 '!tai64nlocal' /tmp/myapp &
このコマンドを使えば始められます
3 sage 2015-10-28
上のサム・ヘンドリーのコメントに付け加えたいと思いました
このトリックは、リダイレクトが >
(create) の代わりに >>
(append) で行われた場合にのみ動作します
私は同じ問題に遭遇しました。>
(create)を使った場合は元のファイルが増え続けますが、>>
(append)を使った場合は、Logrotateのcopytruncateは美しく、期待通りに動作します。元のファイルはゼロバイトに戻り、プログラムは書き込みを続けます
STDOUTとSTDERRを回転するログファイルにリダイレクトします
some-program.sh >> /tmp/output.txt 2>&1 &
/etc/logrotate.d
の下にlogrotate設定ファイルを作成します私の場合の設定例です
/tmp/output.txt { notifempty missingok size 1G copytruncate start 0 rotate 15 compress }
/etc/crontab
ファイル内にcronジョブを設定します* * * * * root /usr/sbin/logrotate /etc/logrotate.d/output_roll
これで1分ごとにチェックしてくれます。ニーズに合わせて調整することができます
起動してくれ
$> service crond restart
That’s it
追記:SELinuxがSELINUX=enforcing
になっているのも問題だったので、SELINUX=disabled
にしてみました
1 user578558 2016-04-03
今週末にlogroteeを書きました。@JdeBPさんの素晴らしい回答とmultilog
を読んでいたら、たぶん書かないと思います
私は、軽量であることと、出力チャンクをbzip2にできることに注目しました
verbosecommand | logrotee \
--compress "bzip2 {}" --compress-suffix .bz2 \
/var/log/verbosecommand.log
まだまだやるべきこと、テストするべきことはたくさんあるけどね
1 Victor Sergienko 2017-07-10
ここに挙げたツールでは満足できなかったので、log_proxy
という別のツールを書きました(ごめんなさい!)
Main features:
- パイプとして使用可能(
myapp myapp_arg1 myapp_arg2 |log_proxy /log/myapp.log
) - 設定可能なログ回転サフィックスで、
stftime
プレースホルダを使用します (例:.%Y%m%d%H%M%S
) - は、回転させたファイルの数を制限することができます (最も古いファイルの削除も可能)
- は、ファイルのサイズ(バイト数)に応じてファイルを回転させることができます
- は年齢に応じてファイルを回転させることができます(秒単位)
- は、特定のアプリの特定のログディレクトリを必要としません (異なるアプリのログファイルをたくさん持ったディレクトリを持つことができます)
- 同じアプリの複数のインスタンスが問題なく同じファイルにログを取ることができます(例:
myapp arg1 |log_proxy --use-locks /log/myapp.log
とmyapp arg2 |log_proxy --use-locks /log/myapp.log
を同時に実行することができます) - Cで実装されています(高速でメモリをたくさん食わない)
- 環境変数と同様にCLIオプションで設定可能です
- stdout と stderr (
log_proxy_wrapper --stdout=/log/myapp.stdout --stderr=/log/myapp.stderr -- myapp myapp_arg1 myapp_arg2
) をキャプチャするラッパーとして使用可能 CentOS 6
(2011!) のような非常に古いディストリビューションでも、依存性のないバイナリのリリースが可能です
コメント、課題、PRを歓迎します。https://github.com/metwork-framework/log_proxy
0 Fabien 2020-03-24