リスナーログの肥大化に注意する

listener.log には、リスナー経由の接続情報が出力されていて、
エラー発生時などの調査で参照されるファイル。アラートログなどと同様に
監視対象として設定しておき、通常時はあまり参照されないことも多いはず。

リスナーログをローテーションして切替えたり、不要な過去ログを
退避するような運用が定めていればよいが、何もせず放置していると
膨大なサイズになってしまう。

そこでまず押さえておくべきは、リスナーログファイルの最大サイズだが、
プラットフォームやバージョン、ADR の設定によって異なる。



最大サイズ

・Windows
10g:2GB、11g以降:2GB (ADR 有効なら 4GB)
・Unix/Linux
10g:2GB、11g以降:4GB (ADR 有効なら 無制限)

環境によっては、あっという間にギガに達することもあるので、障害時の取得や
参照に時間がかかってしまう。制限の範囲内で Oracle の仕様上は問題なくても、
肥大したまま利用するのは、非現実的と言える。

一方、log.xml。
こちらは同じディレクトリに log_1.xml、log_2.xml ・・・・ と自動でローテーションされる。
サイズはほぼ10 MB で、このサイズの変更はできない。
従来のテキストログはそのような機能がなく、そのまま肥大していく。

切替方法

リスナーが停止可能なら、手順は至って簡単。
lsnrctl stop コマンドで停止して listenerbk.log などにリネームし、
lsnrctl start コマンドで起動するだけ。新しい listener.ora が作成される。

これが一番安全な手順かと思うが、リスナーを停止せずに切替えなければ
ならない場合は、以下のような方法がある。

カレントリスナーを確認

$ lsnrctl show current_listener

カレントでない場合、対象とするリスナーを設定

$ lsnrctl set current_listener <対象リスナー名>

出力ファイルを切替

$ lsnrctl set log_file listenertmp.log

過去ログを退避

$ mv -i listener.log listenerbk.log

元のカレントリスナー名に戻す

$ lsnrctl set log_file listener.log

ADR有効時は失敗する

ただし ADR が有効の場合はこの方法が失敗してしまう。
色々試してみたところ、使用中のリスナーログをそのままリネームすると、
新たにファイルが自動作成されることが分かった。

リスナーログをリネーム

$ mv -i listener.log listenerbk.log

すると、listener.log が自動作成される。ログの漏れもなさそうだし、
一時ファイルを作成したり戻したりする手間も省けるので、こちらの方が良さそう。

listener.log は、Oracle がずっとつかみっ放しのはずなので、さすがにマズイかと
思ったが、それ以降、自動作成されたファイルに正常出力されているので、問題はないはず。

あとは、log.xml のように、自動ローテーション機能があれば良いのだが、
これはシェルやバッチなどを使って、自前で実装するほかなさそう。