Trang web này đã chỉ cho tôi đúng hướng.
Tôi đã phải tạo một LayoutPattern và PatternConverter tùy chỉnh để ghi đối tượng của tôi vào nhật ký thành công. Hóa ra văn bản "12wo" kỳ lạ mà tôi nhận được trong cơ sở dữ liệu là do mẫu chuyển đổi sử dụng cú pháp kiểu printf c. Nhưng dù sao, đây là một số mã.
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;
}
}
}
}
Đây là cách lấy một phiên bản của trình ghi theo tên:
private static readonly ILog TestLogger = LogManager.GetLogger("TestLogger");
Đây là cách ghi một đối tượng Kiểm tra vào nhật ký.
TestLogger.Info(new Test {One = "field one", Two = "field two"});
Đây là cách một tham số nên được xác định trong web.config.
<parameter>
<parameterName value="@one" />
<dbType value="String" />
<size value="50" />
<layout type="MyApp.TestLayoutPattern">
<conversionPattern value="%test{one}" />
</layout>
</parameter>
Một điều khác cần lưu ý là phần gốc và phần trình ghi của web.config. Trong phần gốc là nơi trình ghi mặc định được xác định với bộ cấp của nó. Tôi có thể xác định TestLogger tùy chỉnh của mình trong phần ghi nhật ký, phần này sẽ tham chiếu đến appender như được hiển thị bên dưới. Điều này cho phép tôi truy cập TestLogger theo tên như được hiển thị ở trên.
<root>
<level value="ALL"/>
<appender-ref ref="ADONetAppender"/>
</root>
<logger additivity="false" name="TestLogger">
<level value="ALL"/>
<appender-ref ref="TestAppender" />
</logger>
Tôi cũng thấy rằng nếu bạn chỉ muốn thêm một vài thuộc tính vào ADONetAppender mặc định (và thêm một vài trường vào bảng), thay vào đó bạn có thể sử dụng log4net.ThreadContext để đặt các thuộc tính đó như sau:
log4net.ThreadContext.Properties["MyCustomPrperty"] = value;
Sau đó, trong web.config dưới phần tham số, bạn có thể truy cập thuộc tính đó như sau:
<parameter>
<parameterName value="@myCustomProperty"/>
<dbType value="String"/>
<layout type="log4net.Layout.RawPropertyLayout">
<key value="MyCustomProperty" />
</layout>
</parameter>