現象
Windowsから日本語のログをCloudWatch Logsに転送し、AWSコンソール上で文字化けしてしまいました。
分析
原因はCloudWatchエンコード値と転送対象ログファイルのエンコード一致していないからです。
・CloudWatchエンコード値:デフォルト値は utf-8 です
・転送対象ログファイルのエンコード:shift_jis
AWS公式より抜粋(encoding )
encoding – 正しく読み込むことができるように、ログファイルのエンコードを指定します。正しくないエンコードを指定すると、デコードできない文字がその他の文字に置き換えられるため、データ損失が生じる可能性があります。
デフォルト値は utf-8 です。指定できる値は以下のとおりです。
ascii, big5, euc-jp, euc-kr, gbk, gb18030, ibm866, iso2022-jp, iso8859-2, iso8859-3, iso8859-4, iso8859-5, iso8859-6, iso8859-7, iso8859-8, iso8859-8-i, iso8859-10, iso8859-13, iso8859-14, iso8859-15, iso8859-16, koi8-r, koi8-u, macintosh, shift_jis, utf-8, utf-16, windows-874, windows-1250, windows-1251, windows-1252, windows-1253, windows-1254, windows-1255, windows-1256, windows-1257, windows-1258, x-mac-cyrillic
CloudWatch エージェント設定ファイル(文字化けの例)
{
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "C:\\Application\\TestApp\\logs\\test.log",
"log_group_name": "{hostname}",
"log_stream_name": "{instance_id}",
"timezone": "Local"
}
]
}
}
}
}
CloudWatch エージェント設定ファイル(OKの例:encoding を追加)
{
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "C:\\Application\\TestApp\\logs\\test.log",
"log_group_name": "{hostname}",
"log_stream_name": "{instance_id}",
"encoding": "shift_jis",
"timezone": "Local"
}
]
}
}
}
}
まとめ
Windowsの場合、日本語が含まれない場合、CloudWatchエンコードはディフォルトのままで問題ありませんが、Windowsから日本語を含むファイルをCloudWatch Logsに転送する場合、CloudWatchエンコード値を転送対象ファイルのエンコード値と同じように設定してあげてください。
また、Linuxの場合、日本語のログ転送し、文字化けしていないですが、原因を調べると、転送対象ファイルのエンコード値とCloudWatchのデフォルトエンコード値は同じです。
例:ファイルtest.logのエンコード値を確認する
$ file -i test.log
test.log: text/plain; charset=utf-8