システムで発生した例外はすべて、Exception.Message をファイルに書き込むことでログに記録しています。ただし、それらはクライアントのカルチャで書き込まれます。また、トルコ語のエラーは私にとってあまり意味がありません。
では、ユーザーの文化を変えずに、エラー メッセージを英語で記録するにはどうすればよいでしょうか?
ベストアンサー1
この問題は部分的に回避できます。フレームワーク例外コードは、現在のスレッド ロケールに基づいて、リソースからエラー メッセージを読み込みます。一部の例外の場合、これは Message プロパティにアクセスしたときに発生します。
これらの例外については、ログに記録するときにスレッド ロケールを一時的に en-US に切り替えることで、メッセージの完全な米国英語バージョンを取得できます (事前に元のユーザー ロケールを保存し、直後に復元します)。
これを別のスレッドで実行するとさらに効果的です。これにより、副作用が発生しないことが保証されます。例:
try
{
System.IO.StreamReader sr=new System.IO.StreamReader(@"c:\does-not-exist");
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString()); //Will display localized message
ExceptionLogger el = new ExceptionLogger(ex);
System.Threading.Thread t = new System.Threading.Thread(el.DoLog);
t.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
t.Start();
}
ExceptionLogger クラスは次のようになります。
class ExceptionLogger
{
Exception _ex;
public ExceptionLogger(Exception ex)
{
_ex = ex;
}
public void DoLog()
{
Console.WriteLine(_ex.ToString()); //Will display en-US message
}
}
しかし、ジョーこの返信の以前の改訂版のコメントで正しく指摘されているように、例外がスローされた時点で、一部のメッセージはすでに言語リソースから(部分的に)ロードされています。
これは、たとえば、ArgumentNullException("foo") 例外がスローされたときに生成されるメッセージの「パラメータを null にすることはできません」部分に適用されます。このような場合、上記のコードを使用していても、メッセージは (部分的に) ローカライズされた状態で表示されます。
最初から en-US ロケールのスレッドですべての非 UI コードを実行するなどの非実用的なハックを使用する以外、これについてできることはあまりないようです。.NET Framework 例外コードには、エラー メッセージのロケールをオーバーライドする機能がありません。