Asterisk ログファイル

2020年8月21日 (金) 01:12時点におけるTakatyan (トーク | 投稿記録)による版 (古いファイルを自動で消す)


Asteriskのログファイルについて

目次

ログファイル

デフォルトの設定では/var/log/asterisk/messagesに、ログレベルnotice, warning, errorが出力されます。
ログファイルの設定は/etc/asterisk/logger.confで行います。

# /etc/asterisk/logger.conf
[logfiles]
messages => notice,warning,error

noticeレベルログとして認証失敗も記録されるため、Asteriskをインターネットに公開していると、膨大なログが出力されます。
Fail2banを使用していても、しつこい攻撃者がいると、ログが増えていきます。
ログファイルを置くvarパーティションが溢れないようにログファイルの管理を行う必要があります。

ログの記録レベルを変更する

必要がなければ、ログの記録レベルを落として出力を減らすのも、1つの手段です。
/etc/asterisk/logger.confのlogfilesセクションにて、上記の例にならいログレベルをカンマ区切りで記載します。
レベルとしてはdebug, trace, notice, warning, error, verbose, dtmf, fax, securityが記載できます。ログレベルとして「*」を使用すると、全ログレベルを意味します。
また、ログレベルの前に[json]を付与するとJSON出力が可能です。

full-json => [json]debug,verbose,notice,warning,error,dtmf,fax

警告:debugログレベル及びこれを含む*ログレベルを使用すると、極めて多量のログが出力されます。運用モードではdebugログを出力しないことを強く勧めます!
Fail2banを使用している場合は、ログ出力のレベルを変更すると動作に影響を及ぼす恐れがあります。注意して変更してください。

設定ファイルを変更したら、Asterisk CLIでlogger reloadを行うと変更が反映されます。

自動でログをローテートする

Asteriskには、内蔵のログローテート機構があります。

ローテートの仕方の設定

ログのローテートのファイル名の付け方をlogger.confの[general]セクションで設定できます。

[general]
rotatestrategy=sequential
none
全くローテートを行いません。
sequential(デフォルト)
ローテートするたびに、最も新しいログファイルのファイル名の通し番号が最も大きくなるように変名します。
rotate
ローテートするたびに、過去のログファイルのファイル名の通し番号を1ずつ増やし、最も新しいログファイルの末尾の数字を0とします。
timestamp
通し番号の代わりにタイムスタンプを使用します。

sequentialとrotateの違いが分かりにくいですが、例えば「messages」ログファイルを今、ローテートするとして、既にmessages.0 messages.1 messages.2がある場合、

sequential
ローテートすると、messagesはmessages.3に変名されます。0~2はそのままです。
rotate
ローテートすると、messages.2はmessages.3に、messages.1がmessages.2に、messages.0がmessages.1に変名され、messagesはmessage.0に変名されます。

その後、新しいmessagesが作られ、ローテート後はこの新しいmessagesに書き込まれます。

古いファイルを自動で消す

varパーティションが溢れないようにするためには、古いファイルを自動で消す必要があります。
古いログファイルを4世代保持しておき、古いファイルから消していくためには、[general]セクションで次のように設定します。

[general]
rotatestrategy=rotate
exec_after_rotate=rm -f $["${filename}" : "(.+)\.0$"].4

設定ファイルを変更したら、Asterisk CLIでlogger reloadを行うと変更が反映されます。

解説:上記の設定ファイルではAsterisk expressionsの記法が使用されています。${filename}は、rotatestrategy=rotateにおいては「/var/log/asterisk/messages.0」のような文字列になります。
これに正規表現 "(.+)\.0$" をマッチ(:演算子は正規表現をマッチさせる演算子ですが、暗黙の「^」により文字列の先頭にマッチされます)させ、Asterisk expressionsの正規表現は他の多数の言語でいう$1を返す仕様のため、
これに".4"を付与したものを削除することで、最も古いログファイルを削除します。
詳細はAsterisk expressionsを参照してください。

ローテートの実行

ログのローテートそのものは、Asterisk CLIでlogger rotateを行うと実行されます。

そこで、systemdの下で定期的にログローテートを行うためのユニットファイルの一例を示します。

# /etc/systemd/system/asterisk-logrotate.service
[Unit]
Description=Asterisk log rotate
Requires=asterisk.service

[Service]
Type=simple
#User=asterisk
#Group=asterisk
ExecStart=/usr/sbin/asterisk -rx 'logger rotate'
# /etc/systemd/system/asterisk-logrotate.timer
[Unit]
Description=Asterisk log rotate timer

[Timer]
OnCalendar=Mon *-*-* 04:00:00
RandomizedDelaySec=300
Persistent=true

[Install]
WantedBy=timers.target

設定したら、systemdにユニットファイルをリロードさせ、タイマーを始動します。

# systemctl daemon-reload
# systemctl start asterisk-logrotate.timer
# systemctl enable asterisk-logrotate.timer

手動で1回ローテートしてみようと思う場合、次を実行します。

# systemctl start asterisk-logrotate.service

外部の機構によりログをローテートする

上記はAsterisk内蔵のログローテート機構によるローテートを説明しました。logrotate等、外部のログローテートツールを使用してログローテートを行う方法もあります。
その場合の詳細は割愛しますが、voip-info.org等には参考となる情報があるようです。
外部のログローテートツールによる場合でも、ローテート後にはCLIからlogger reloadを実行すればAsteriskはログを開き直すようです。