我需要将自定义数据记录到Db,我遵循本教程:http://stephenjamescode.blogspot.it/2014/01/logging-custom-objects-and-fields-with.html

我实现了 ReflectionPatternConverter ,这使我能够记录我需要的任何自定义数据 . 这是代码:

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 之外什么都不做 .

ReflectionPatternLayout

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 whit这个配置文件(片段):

<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>

任何时候我尝试写一个日志条目我得到这个异常(log4net的调试模式设置为true):

log4net:ERROR [AdoNetAppender] ErrorCode:GenericFailure . 写入数据库log4net时出现异常:ERROR [AdoNetAppender] ErrorCode:GenericFailure . 写入数据库时出现异常System.FormatException:无法从String do DateTime转换参数值 . ---> System.FormatException:String未被识别为有效的日期时间....

(异常消息可能不同,我将其翻译成意大利语) .
有趣的是,如果我将当前线程区域设置放到 CultureInfo.InvariantCulture ,我会正确完成日志

...        
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
//log here

所以我非常怀疑这是一个日期时间格式的愚蠢的语言环境问题 .
如何从客户端区域设置中解除日志记录?