「俺がシフトJISって言ったらCP932だろ」

2020/06/15

投げっぱなし

ごめんねカマスさん、いいお味です──! …ごきげんよう。

[Zabbix] Windowsホストのログ監視で空行が取得される → 原因はPowerShellでした


なんかアフィブログのような煽りタイトルつけてしまいましたが…。
だって事実なんだもん。(きめぇ

というわけで本日の業務上知り得た情報シリーズですが(シリーズだったのか)。

現象


Windowsマシン上のログファイルを取得するアイテムを作成しました。

タイプ
Zabbixエージェント(アクティブ)
キー
logrt[{$LOGFILE}]
データ型
テキスト
監視間隔
5m

しかし、内容が正しく取得されず、以下の挙動を示します。

  • 監視間隔ごとに空のテキストが2件~十数件取得される
  • 最後の1行のみ「??2」などのテキストが入る場合あり

以下のトピックとほぼ同じ現象と思われます。

空のログを取得されてしまう。 | 日本Zabbixユーザー会
http://www.zabbix.jp/node/4819

原因


同じマシン上の別のログは正しく取得できているので、アイテム設定の問題ではないだろうと判断。
ログファイル側を調べます。

ログはPowerShellスクリプトから定周期に追記しています。

Write-Output $line | Out-File -Append $outFile

出力ファイルをメモ帳で見ても、何も問題は見つかりません。
ところがサクラエディタで開いてみると、

_人人人人人人人_
> UTF-8 BOM付 <
 ̄Y^Y^Y^Y^Y^Y^Y^ ̄

…なんじゃこりゃあ!(キョエちゃんかよ)(キョエちゃんが元ネタじゃねえよ)

まさかのBOMキタコレですよ。
こんなものをZabbixに処理させたら悪さを起こすに決まってます。



っていうかー


BOMつきUTF-8には何度トラブルに頭を悩まされてきたことか。
SEの現場では悪名高い存在と言えるでしょう。
VBAでBOMなしUTF-8を出力するために、ストリームに書き込んで3バイト潰してバイナリー出力、なんて小細工かましたのもいい思い出。

閑話休題。(お前、閑話休題って言いたいだけちゃうんかと)

Out-Fileコマンドのデフォルトエンコーディング


を調べたところ、公式ドキュメントには Unicode (UTF-16) とあります。
UTF-16になってないじゃないですか! やだーーー!
さらに、新しいバージョンでは UTF8NoBOM オプションが追加されてそれがデフォルトに変わったようです。

バージョンによって -Encoding パラメータの内容が変わる不思議ドキュメントェ…。
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/out-file?view=powershell-5.1
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/out-file?view=powershell-6

修正


PowerShellのバージョンによってオプションのデフォルト値が異なるコマンドなんて危険すぎます。
動作環境によって挙動が変わってしまうわけですから。
ですので明示的にオプションを指定するしかありません。

幸い今回のログはマルチバイト文字を含まないので、ASCIIを指定して解決。

Write-Output $line | Out-File -Encoding ASCII -Append $outFile

監視側でも正しく最終行が取得されるようになりました。

おわりに


いやー、何かの不具合だと思って調べたら全然違うところに原因があったというよい例でした。
とりあえずWindowsにはまともなテキストエディターを入れておきましょう!

ソーシャル/購読

X Threads note
RSS Feedly Inoreader

このブログを検索

ブログ アーカイブ