このサイト 正しい方向を示してくれました。
オブジェクトをログに正常に書き込むために、カスタム LayoutPattern と PatternConverter を作成する必要がありました。データベースに奇妙な "12wo" というテキストが表示されるのは、変換パターンが printf c スタイルの構文を使用しているためであることが判明しました。とにかく、ここにいくつかのコードがあります。
public class TestLayoutPattern : PatternLayout
{
public TestLayoutPattern()
{
AddConverter(new ConverterInfo
{
Name = "test",
Type = typeof (TestConverter)
});
}
}
public class TestConverter : PatternConverter
{
protected override void Convert(System.IO.TextWriter writer, object state)
{
if (state == null)
{
writer.Write(SystemInfo.NullText);
return;
}
var loggingEvent = state as LoggingEvent;
if (loggingEvent == null)
throw new NullReferenceException("loggingEvent");
var test = loggingEvent.MessageObject as Test;
if (test == null)
{
writer.Write(SystemInfo.NullText);
}
else
{
switch (Option.ToLower())
{
case "one":
writer.Write(test.One);
break;
case "two":
writer.Write(test.Two);
break;
default:
writer.Write(SystemInfo.NullText);
break;
}
}
}
}
ロガーのインスタンスを名前で取得する方法は次のとおりです:
private static readonly ILog TestLogger = LogManager.GetLogger("TestLogger");
Test オブジェクトをログに書き込む方法は次のとおりです。
TestLogger.Info(new Test {One = "field one", Two = "field two"});
web.config でパラメータを定義する方法は次のとおりです。
<parameter>
<parameterName value="@one" />
<dbType value="String" />
<size value="50" />
<layout type="MyApp.TestLayoutPattern">
<conversionPattern value="%test{one}" />
</layout>
</parameter>
もう 1 つの注意点は、web.config のルート セクションとロガー セクションです。ルート セクションでは、デフォルトのロガーがそのレベル セットで定義されています。以下に示すように、アペンダーを参照するロガー セクションでカスタム TestLogger を定義できます。これにより、上記のように名前で TestLogger にアクセスできます。
<root>
<level value="ALL"/>
<appender-ref ref="ADONetAppender"/>
</root>
<logger additivity="false" name="TestLogger">
<level value="ALL"/>
<appender-ref ref="TestAppender" />
</logger>
また、デフォルトの ADONetAppender にいくつかのプロパティを追加する (およびテーブルにいくつかのフィールドを追加する) だけの場合は、代わりに log4net.ThreadContext を使用してこれらのプロパティを次のように設定できることもわかりました:
log4net.ThreadContext.Properties["MyCustomPrperty"] = value;
次に、パラメーター セクションの下の web.config で、次のようにそのプロパティにアクセスできます。
<parameter>
<parameterName value="@myCustomProperty"/>
<dbType value="String"/>
<layout type="log4net.Layout.RawPropertyLayout">
<key value="MyCustomProperty" />
</layout>
</parameter>