C# 带有自定义数据的log4net adonetappender,如果包含DataTime数据,则无法写入日志
我需要将自定义数据记录到Db中,我遵循了本教程: 我实现了一个C# 带有自定义数据的log4net adonetappender,如果包含DataTime数据,则无法写入日志,c#,log4net,adonetappender,C#,Log4net,Adonetappender,我需要将自定义数据记录到Db中,我遵循了本教程: 我实现了一个ReflectionPatternConverter 这使我能够记录所需的任何自定义数据。代码如下: 反射模式转换器 public class ReflectionPatternConverter : PatternConverter { protected override void Convert(TextWriter writer, object state) {
ReflectionPatternConverter
这使我能够记录所需的任何自定义数据。代码如下:
反射模式转换器
public class ReflectionPatternConverter : PatternConverter
{
protected override void Convert(TextWriter writer, object state)
{
if (state == null)
{
writer.Write(SystemInfo.NullText);
return;
}
var loggingEvent = state as LoggingEvent;
if (loggingEvent == null)
return;
Type messageObjectType = loggingEvent.MessageObject.GetType();
PropertyInfo[] properties = messageObjectType.GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (var property in properties)
{
if (this.Option.ToLower().Equals(property.Name.ToLower()))
{
writer.Write(property.GetValue(loggingEvent.MessageObject, null));
}
}
}
我使用一个自定义的ReflectionPatternLayout
,它除了注册ReflectionPatternConverter
之外什么都不做
反射模式布局
public class ReflectionPatternLayout : PatternLayout
{
public ReflectionPatternLayout()
{
ConverterInfo converter = new ConverterInfo();
converter.Name = "customProperties";
converter.Type = typeof (ReflectionPatternConverter);
AddConverter(converter);
}
}
我要记录此自定义数据类:
CustomLogData
public class CustomLogData
{
public string Prop1 { get; set; }
public DateTime Prop2 { get; set; }
public int Prop3 { get; set; }
public override string ToString()
{
StringBuilder builder = new StringBuilder();
builder.AppendFormat(
"Prop1: {0}, Prop2: {1}, Prop3: {2}",
this.Prop1,
this.Prop2.ToString("yyyyMMdd HH:mm:ss"),
this.Prop3);
return builder.ToString();
}
}
因此,我使用这个配置文件(代码段)配置了log4net:
所以我高度怀疑这是datetime格式的一个愚蠢的区域设置问题。如何将日志记录与客户端语言环境设置分离 您可以使用SQL事件探查器查看实际的查询调用是什么吗?SQL希望DateTime在插入时采用特定格式。另一个可疑行是
rawtimstamplayout
-我不知道这是什么样子,但可能与SQL期望的不匹配。由于错误发生在提交SQL命令之前,因此不会执行任何查询。。。否则我会有一个SQLException,您可以添加一个文件追加器,至少您可以看到日期时间输出为什么格式。
<appender name="AdoNetManager" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="**omitted**" />
<commandText value="INSERT INTO dbo.ApplicationLog (Timestamp, Prop1, Prop2, Prop3) VALUES (@Timestamp, @Prop1, @Prop2, @Prop3)" />
<parameter>
<parameterName value="@Timestamp" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@Prop1" />
<dbType value="String" />
<size value="500" />
<layout type="MyAssembly.ReflectionPatternLayout, MyAssembly">
<conversionPattern value="%customProperties{Prop1}" />
</layout>
</parameter>
<parameter>
<parameterName value="@Prop2" />
<dbType value="DateTime" />
<layout type="MyAssembly.ReflectionPatternLayout, MyAssembly">
<conversionPattern value="%customProperties{Prop2}" />
</layout>
</parameter>
<parameter>
<parameterName value="@Prop3" />
<dbType value="Int32" />
<layout type="MyAssembly.ReflectionPatternLayout, MyAssembly">
<conversionPattern value="%customProperties{Prop3}" />
</layout>
</parameter>
</appender>
...
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
//log here