log4netで出力するログの文字コードを変更する

2020-12-07

UTF-8がBOM付いたり付かなかったりして切り替えるのに戸惑ったので備忘録として保存しておきます。

log4netのインストール方法~最低限動かす方法については以下の記事に手順を記載しています。

log4netを新規インストールする
log4netをインストールしてから初めて動かすまでの手順書です。
mikan-tech.info

規定の文字コード

初期設定はsjis

<Encoding value="shift_jis" />

この文言で明示的に文字コードをshiftjisに指定することもできます。

UTF-8でログを出力する

UTF-8でログファイルを出力したいのであればconfig中appenderの下に以下の記述を追加します。

<Encoding type="System.Text.UTF8Encoding" />

UTF-8(BOM付)でログを出力する

UTF-8(BOM付)でログファイルを出力したいならconfig中appenderの下に以下の記述を追加します。

<Encoding value="utf-8" />

typeとvalueの違いは何か

上司

同じEncodingでもtypeとvalueでなんか動きが変わることは分かったけど、他の文字コードにするには一体何を入れたらいいの?

type指定

<Encoding type="///A///" />

「///A///」の部分にはSystem.Text.Encodingの派生クラス名を入力します。
上のUTF8(BOMなし)のコードでは「System.Text.UTF8Encoding」をtypeの値として設定しました。

System.Text.ASCIIEncodingASCII
System.Text.UnicodeEncodingUnicode(UTF-16)
System.Text.UTF32EncodingUTF-32
System.Text.UTF7EncodingUTF-7
System.Text.UTF8EncodingUTF-8

value指定

<Encoding value="///B///" />

「///B///」の部分にはSystem.Text.Encodingのエンコード表の中の「Name」を入力します。
上のUTF8(BOMつき)のコードでは「utf-8」をtypeの値として設定しました。

shift_jisJapanese (Shift-JIS)
x-mac-japaneseJapanese (Mac)
IBM290IBM EBCDIC (Japanese katakana)
EUC-JPJapanese (JIS 0208-1990 and 0212-1990)
iso-2022-jpJapanese (JIS)
csISO2022JPJapanese (JIS-Allow 1 byte Kana)
iso-2022-jpJapanese (JIS-Allow 1 byte Kana – SO/SI)
euc-jpJapanese (EUC)
utf-7Unicode (UTF-7)
utf-8Unicode (UTF-8)

上記サイトから日本語で使いそうなものを抽出しました。使いたい文字コードはこの中にあるでしょうか?

指定方法によってBOMが付いたり付かなかったり結果が変わるのは何故?

ズバリ、「初期設定値の違い」です。

以下の記事でEncodingクラスでUnicode体系を指定した場合に初期設定でBOMが付いているか付いていないかを検証しているので興味のある方はご覧ください。

System.Text.Encodingの初期設定がBOM付きかどうか調べる
Unicode系の文字コードで、初期値によってBOMが付くのか付かないのかを検証していきます。
mikan-tech.info

BOMとかBEとか設定ファイルで指定できないの?

現在、log4netの設定ファイルに明示的に引数としてEncodingクラスの引数を渡す方法は見つかっていません。
(以下の記事に書いたように色々実験しましたが、上手くいかず…)

log4netの設定ファイルで文字コードをBOM付きとかBEとか細かく設定したい
log4netで出力するログの文字コードを自由自在に変更するには一体どうしたら…
mikan-tech.info