snmpd のロギングコントロール

error on subcontainer 'ia_addr' insert (-1)

このエラー、10年前から google先生の定番ですね。どうやら1つのネットワークインターフェイスに2つ以上のIPアドレスを付与すると、デバッグログに出力されるみたいです。

で、これを syslog から消す方法はワリと見つかるんですが、snmpd 独自のログファイルをどう扱うか……とか -LS6d の意味とか、あんまりちゃんとした解説を見たことがないです。というか snmpcmd(5) の man ページも難解極まりない気がするので自分でいろいろ実験してみました。

snmpd のロギングオプションは -L です。この後ろに色々細かい指定を付けるんですが、その付け方について snmpcmd(5) の説明が非常に不親切な気がしますね……

syslog 出力の設定

-Ls または -LS で指定します。

-Ls[ud]

これは「facility を指定して syslog に出力せよ」という意味のオプションです。-Lsd とすると Daemon で、-Lsu とすると User で出力されるようです。いずれにしてもこの指定では件の “ia_addr” のエラーが30秒に1回 syslog に出力されて非常に鬱陶しいです。

-LS[01234567][ud]

ラージ S を指定した場合は「priority と facility を指定して syslog に出力せよ」という意味のオプションになります。priority の指定は snmpcmd(5) の man ページにあるとおりです。

  0 or ! for LOG_EMERG,
  1 or a for LOG_ALERT,
  2 or c for LOG_CRIT,  
  3 or e for LOG_ERR,  
  4 or w for LOG_WARNING,  
  5 or n for LOG_NOTICE,  
  6 or i for LOG_INFO, and  
  7 or d for LOG_DEBUG.  
 
Normal output is (or will be!) logged at a priority level of LOG_NOTICE

……実はここで既にひとつ解せない部分1)もあるんですが、ひとまずスモール “s” とラージ “S” の違いはここにあります。

なので -LS6d とした場合は「priority:INFO 以上でフィルタして faciryty:Daemon で syslog に出力せよ」という意味になります。ちなみにこの指定はブランクを挟んで -LS 6d とした場合や -LS 6 d とした場合でも有効に動作するようです。

なので syslog に関しては、件の “ia_addr” の出力は -LS6d 以上を指定してあげれば止まります。

ログファイル出力の設定

-Lf または -LF で指定します。この設定は syslog の出力設定と同時に指定できます。

-Lf /path/to/logfile

ログファイルを指定してログを出力します。syslog 指定の -Lsd-Lsu と同様に、priority を指定していないのでこの指定では30秒に1回 “ia_addr” のエラーが出力されます。

-LF [01234567] /path/to/logfile

priority とログファイルを指定してログを出力します。priority の指定は前述の syslog の指定と同じです。同じですが、1つ決定的に違うのはこのオプションに関してはブランクが必須です。必ず -LF 6 /path/to/logfile のように各オプションをブランクで区切って指定します。このへんの書式が snmpcmd(5) にはまったく記載されていないので、ネットでよく見る -LS5d のつもりで -LF6/path/to/logfile とか -LF6 /path/to/file とかやってハマるんです……ハマりました……ハマりませんか?

syslog 出力だけであれば -LS 5 d を指定、ログファイル出力なら -LF 6 /path/to/logfile-LF 5 /path/to/logfile あたりをお好みで。両方指定するなら -LS 5 d -LF 6 /path/to/logfile あたりのオプションが妥当でしょうか? priority に 5 を指定するか 6 を指定するかの違いは、普通に運用してる限りは agent が受けたリクエスト1回ごとにログを出力するか、出力しないかの違いぐらいです。

gentoo linux の場合は /etc/conf.d/snmpd に……

SNMPD_FLAGS="${SNMPD_FLAGS} -LS 5 d -Lf 6 /path/to/logfile"

……あたりを追加するんだと思いますが。実は systemd 経由で snmpd を起動している場合、この設定は読みません。 なので、snmpd.service をオーバーライドします。

# systemctl edit snmpd.service

を実行して、こんな感じに書いてあげます。

[Service]
ExecStart=
ExecStart=/usr/sbin/snmpd -f -p /var/run/snmpd.pid -I -smux -LS 5 d -LF 6 /var/log/snmp/net-snmpd.log
1)
“Normal output is (or will be!) logged at a priority level of LOG_NOTICE” : 「放っといたら LOG_NOTICE だよ」(意訳) ってじゃあ件の “ia_addr” はなぜ -Lsd で出力されるんだ……
https://manimani.cc/lib/plugins/linkback/exe/trackback.php/wiki:linux:snmpd_ia_addr