Situs ini mengarahkan saya ke arah yang benar.
Saya harus membuat LayoutPattern dan PatternConverter khusus untuk menulis objek saya ke log dengan sukses. Ternyata teks "12wo" aneh yang saya dapatkan di database adalah karena pola konversi menggunakan sintaks gaya printf c. Bagaimanapun, ini beberapa kode.
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;
}
}
}
}
Berikut ini cara mendapatkan instance logger berdasarkan nama:
private static readonly ILog TestLogger = LogManager.GetLogger("TestLogger");
Berikut adalah cara menulis objek Uji ke log.
TestLogger.Info(new Test {One = "field one", Two = "field two"});
Berikut adalah bagaimana parameter harus didefinisikan di web.config.
<parameter>
<parameterName value="@one" />
<dbType value="String" />
<size value="50" />
<layout type="MyApp.TestLayoutPattern">
<conversionPattern value="%test{one}" />
</layout>
</parameter>
Hal lain yang perlu diperhatikan adalah bagian root dan logger dari web.config. Di bagian root adalah tempat logger default didefinisikan dengan set levelnya. Saya dapat mendefinisikan TestLogger kustom saya di bagian logger yang akan mereferensikan appender seperti yang ditunjukkan di bawah ini. Ini memungkinkan saya untuk mengakses TestLogger dengan nama seperti yang ditunjukkan di atas.
<root>
<level value="ALL"/>
<appender-ref ref="ADONetAppender"/>
</root>
<logger additivity="false" name="TestLogger">
<level value="ALL"/>
<appender-ref ref="TestAppender" />
</logger>
Saya juga menemukan jika Anda hanya ingin menambahkan beberapa properti ke ADONetAppender default (dan menambahkan beberapa bidang ke tabel), Anda dapat menggunakan log4net.ThreadContext untuk mengatur properti tersebut seperti:
log4net.ThreadContext.Properties["MyCustomPrperty"] = value;
Kemudian di web.config di bawah bagian parameter Anda dapat mengakses properti itu seperti ini:
<parameter>
<parameterName value="@myCustomProperty"/>
<dbType value="String"/>
<layout type="log4net.Layout.RawPropertyLayout">
<key value="MyCustomProperty" />
</layout>
</parameter>