質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
logrotate

logrotateはログの世代管理やサイズ制限を行うLinux標準のツールです。

Q&A

1回答

112閲覧

logrotateでディレクトリ内のファイルを一括ローテーションしたい

tanaka_ray

総合スコア0

logrotate

logrotateはログの世代管理やサイズ制限を行うLinux標準のツールです。

0グッド

0クリップ

投稿2024/03/19 11:55

編集2024/03/19 13:24

実現したいこと

以下のような訳あってファイル名の異なる内容は同じログファイルが出力されるディレクトリのローテーションを行い、日毎のディレクトリ内の最新3ファイル以外のファイルを削除するようにしたいです。

■ローテーション前

-rw-r--r-- 1 root root 5 Mar 1 00:00 aaaaa_2024031921.log -rw-r--r-- 1 root root 5 Mar 2 00:00 bbbbb_2024031922.log -rw-r--r-- 1 root root 5 Mar 3 00:00 ccccc_2024031923.log -rw-r--r-- 1 root root 5 Mar 4 00:00 ddddd_2024031924.log -rw-r--r-- 1 root root 5 Mar 5 00:00 eeeee_2024031925.log -rw-r--r-- 1 root root 5 Mar 6 00:00 fffff_2024031926.log

■ローテーション後

-rw-r--r-- 1 root root 5 Mar 4 00:00 ddddd_2024031924.log -rw-r--r-- 1 root root 5 Mar 5 00:00 eeeee_2024031925.log -rw-r--r-- 1 root root 5 Mar 6 00:00 fffff_2024031926.log

発生している問題・分からないこと

同ファイル名でローテーションを行う場合、添付の設定にてrotateディレクトリ以上のファイル削除されることは確認できているのですが、別名のファイルを一括してローテーションを行いたい場合、方法がわからず困っています。

/var/log/example/*.log { daily rotate 3 missingok notifempty }

該当ソースに添付してあるようにdateformat ディレクティブを利用してみたりと、色々な手段を試してみたのですが解決できず手詰まりな状態です。

該当のソースコード

/var/log/example/*.log { daily rotate 3 missingok copytruncate dateext dateformat _%Y%m%d%H.log ifempty }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

添付した該当コードは以下の知恵袋の回答を参考にしております。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14254881974

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

それは「ログローテーション」じゃないです。
単に「新しい方から3ファイル残して残りを削除」ですね。
以下のようなスクリプトを適宜実行すれば良いです。

sh

1cd 目的ディレクトリ 2ls -t | # タイムスタンプ新しい順で出力 3tail -n +4 | # 先頭3行(新しい3ファイル)をスキップ 4xargs -r rm # 元の4行目以降を削除

「ログローテーション」とは、「固定のファイル名で出力されるログに連番を付けて一定個数だけ残しておく」という機能です。
Day1. fooの1ファイルのみ
Day2. foofoo.1にリネーム
Day3. foo.1foo.2に、foofoo.1にリネーム
Day4. foo.2foo.3に、Foo.1foo.2に、foofoo.1にリネーム
Day5. foo.3を削除、foo.2foo.3に、Foo.1foo.2に、foofoo.1にリネーム
Day6. Day5と同じことを以降繰り返す
設定により、連番でなくて日付を付けることも出来てこの場合はリネームは一度だけです。

投稿2024/03/19 13:21

otn

総合スコア84603

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanaka_ray

2024/03/19 13:26

ログローテーションの意味合いについてのご指摘ありがとうございます。理解致しました。 別解をご教授頂きましたが、logrotateを使用した解決方法は無いということでしょうか。
otn

2024/03/19 13:29

「ローテーション」というのは「回転」ですが、連番の付いた箱がいくつかあり、毎日中味をずらして移し替えるようなイメージなので、ローテーションというのでしょう。円状に回っている訳では無いですが、「車のタイヤのローテーション」「(色々な仕事を経験させるための)ジョブローテーション」と同じ。
otn

2024/03/19 13:57 編集

> logrotateを使用した解決方法は無いということでしょうか。 そうですね。やりたいことと全然関係ない機能なので。 logrotateコマンド実行前に、「ファイル名の "_" より前を固定の名前にリネームする」という処理を入れて、その後に logrotate すれば出来ますが、ファイル名変わっちゃいます。 追記:と思ったけど、簡単にはいかなそうですね。やっぱり全く関係ない機能のコマンドで何とかしようというのは無理があります。
melian

2024/03/19 15:15

> logrotateを使用した解決方法は無いということでしょうか。 まぁ、firstaction directive を使うと所望の動作になるかもしれません。("only if at least one log will actually be rotated" なのでダメかも) logrotate(8) > The script is executed once before all log files that match the wildcarded pattern are rotated, before the prerotate script is run and only if at least one log will actually be rotated. These directives may only appear inside a log file definition. The whole pattern is passed to the script as its first argument. If the script exits with an error, no further processing is done. See also lastaction and the SCRIPTS section. firstaction # delete all except most recent three files exit 1 endscript
otn

2024/03/20 04:23

第一感で、firstaction で行けるかと思って、書いたようにfirstactionで全部 "固定文字列_yyymmdd.log"にリネームしてみたんですけど、少なくともその方法では駄目でした。 ローテイトの機能を全く使わず、単なるランチャー的に使って、firstactionで、回答に書いたスクリプトを実行すれば出来そうですが、firstactionを起動しつつ、ローテイト動作を行わないという設定が出来るのかどうか。ローテイト対象がないとfirstactionが起動しないので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問