2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

logrotate対象に、ある文字列「ではない」ファイルを指定したいのですけど、ひょっとして不可でしょうか

Posted at

やりたいこと

logrotate の設定ファイルで、下記のように指定したい。

/etc/logrotate.d/nanika_no_service
/var/log/nanika_no_service/【"aiueo" から始まるログ以外】.log {
    monthly
}

/var/log/nanika_no_service/aiueo.log {
    daily
}

調べてみた結果

無理っぽい。
やむをえず、下記で妥協。

/etc/logrotate.d/nanika_no_service
/var/log/nanika_no_service/[!a]*.log {
    monthly
}

/var/log/nanika_no_service/a*.log {
    daily
}

理由

https://github.com/logrotate/logrotate/blob/master/logrotate.c
https://github.com/logrotate/logrotate/blob/master/config.c

ソースコードによると、rotate するファイルの探索にはglobを使っているようです。
でもって、globの仕様も読んでみたのですが、「単一文字以外」のワイルドカードの案内はあれど、「複数文字以外」の書き方はありませんでした。

そんなわけで、logrotate.conf のファイル指定では

/var/log/nanika_no_service/【"aiueo" から始まるログ以外】.log {
    # 略
}

上記のように書けない、というのが、今のところの結論です。
うまい方法はないものでしょうか。

経緯

同じディレクトリにあるログで、1種類のログだけ別条件で rotate したくなりました。それで調査したというわけです。
上の例だと aiueo.log が、それに当たります。

でも、ちょっと待ってください。[!] を使わず下記のように書けばいいのではないでしょうか。

/etc/logrotate.d/nanika_no_service
/var/log/nanika_no_service/*.log {
    monthly
}

/var/log/nanika_no_service/aiueo.log {
    daily
}

そうですね。僕もそう予想しました。
ですが残念なことに NG です。

logrotate 設定では、重複があると上手く動作しません。上記のようにしてしまうと、aiueo.log*.log にも含まれ、設定に重複があります。
このような条件だと、実行時にエラーになるか、aiueo.log*.log の設定に従ってしまいます (設定順によって変わりますが、どの並びがどの動作になるかは、ちょっと忘れました)。

おわりに

この投稿では、logrotate の対象ログ指定で、「複数文字以外」の表現ができないか調べました。
残念ながら、今のところ実現方法を見つけられていません。

それではごきげんよう。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?