EventLog.WriteEntry メソッドで出力可能な最大文字数が Windows のバージョンによって異なる

適用対象: .NET Framework 3.5 Service Pack 1.NET Framework 3.5.1.NET Framework 4.5

現象


.NET Framework System.Diagnostics.Eventlog.WriteEntry メソッドのリファレンスには、出力文字列が 32766 バイトを超えると ArgumentException が発生すると記載されていますが、それより短い文字列を出力した場合に Win32Exception が発生することがあります。

  EventLog.WriteEntry メソッド (String)
  http://msdn.microsoft.com/ja-jp/library/xzwc042w.aspx

原因


この現象は、EventLog.WriteEntry メソッドが内部で呼び出している Win32 API ReportEvent 関数の制限に依存して発生します。
ReportEvent 関数の第 8 引数 lpStrings で指定する文字列には制限長があり、この制限を超える場合に本件現象が発生します。

  ReportEvent function
  http://msdn.microsoft.com/en-us/library/aa363679.aspx

上記技術情報に記載のとおり、その制限値は、Windows Vista より前のバージョンの Windows では 32K すなわち 32,768 文字、Windows Vista 以降では 31,839 文字となっています。
この ReportEvent 関数の制限値と WriteEntry メソッドの制限値との大小関係から、WriteEntry メソッドで出力可能な最大文字数は、以下のとおりとなります。

  Windows Vista より前のバージョン (Windows XP, Windows Server 2003 等)
  32766 文字 (EventLog.WriteEntry メソッドの制限に従います)

  Windows Vista 以降のバージョン (Windows Vista, Windows Server 2008, Windows 7, Windows Server 2008 R2 等)
  31839 文字 (ReportEvent 関数の制限に従います)

環境により、上記制限長を超える文字列の出力が可能な場合もあることが確認されておりますが、WriteEntry メソッドとして動作を保証している制限長は、上記のとおりです。