linux – stdout のログローテーション?

linux logrotate redirection shell-script stdout

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を加害者から
  • 私のcyclognoshから

multilog形式のログファイルセットを処理するためのツールには、特に以下のようなものがあります

Further reading

  • ジョナサン・デ・ボイン・ポラード(2015年)。”ロギング“。daemontoolsファミリー。よくある回答
  • ジョナサン・デ・ボイン・ポラード(2016)。今世紀はlogrotatenewsyslogを使ってはいけない。よくある回答
  • 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を回転するログファイルにリダイレクトします

  1. some-program.sh >> /tmp/output.txt 2>&1 &
  2. /etc/logrotate.dの下にlogrotate設定ファイルを作成します

    私の場合の設定例です

    /tmp/output.txt {
    notifempty
    missingok
    size 1G
    copytruncate
    start 0
    rotate 15
    compress
    }
    
  3. /etc/crontabファイル内にcronジョブを設定します

    *  *  *  *  * root /usr/sbin/logrotate /etc/logrotate.d/output_roll
    

    これで1分ごとにチェックしてくれます。ニーズに合わせて調整することができます

  4. 起動してくれ

    $> service crond restart
    
  5. 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.logmyapp 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


タイトルとURLをコピーしました