Windowsから日本語のログをAWS CloudWatch Logsに転送し、文字化けしてしまう場合の対策

現象

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
Last modified: 2021-01-17

Author