log4net不是';t开始时记录,过一段时间后开始

log4net不是';t开始时记录,过一段时间后开始,log4net,Log4net,我们一直在.net控制台应用程序中使用log4net。它用于将所有内容从第一个条目记录到console和SQL。突然,记录器直到很久以后才写入我们的SQL,考虑到: Logger.Info("my message won't log") Logger.Info("my message will log") 它不会记录第一个,而是记录第二个。似乎每次都发生在相同的代码行上,仍然在验证这一点。我进行了调试,在第一个记录器处停止,使用即时窗口并记录了一条消息,这就成功了。似乎不明白为什么 但与此同时

我们一直在.net控制台应用程序中使用log4net。它用于将所有内容从第一个条目记录到console和SQL。突然,记录器直到很久以后才写入我们的SQL,考虑到:

Logger.Info("my message won't log")
Logger.Info("my message will log")
它不会记录第一个,而是记录第二个。似乎每次都发生在相同的代码行上,仍然在验证这一点。我进行了调试,在第一个记录器处停止,使用即时窗口并记录了一条消息,这就成功了。似乎不明白为什么

但与此同时,所有的一切都被记录到了控制台上,一切正常

思考可能发生的事情或原因

自定义附加器的代码

namespace Dsmt.Logging
{
    public class HistoryPatternLayout : PatternLayout
    {
        public HistoryPatternLayout()
        {
            AddConverter(new ConverterInfo
            {
                Name = "migrationHistory",
                Type = typeof(MigrationHistoryConverter)
            });
        }
    }

    public class MigrationHistoryConverter : PatternConverter
    {
        protected override void Convert(TextWriter writer, object state)
        {
            if (state == null)
            {
                writer.Write(SystemInfo.NullText);
                return;
            }
            var loggingEvent = state as LoggingEvent;
            var historyInfo = loggingEvent!= null ? loggingEvent.MessageObject as HistoryLoggerInfo : null;
            if (historyInfo == null)
            {
                writer.Write(SystemInfo.NullText);
                return;
            }
            switch (this.Option.ToLower())
            {
                case "migrationhistoryid" :
                    writer.Write(historyInfo.MigrationHistoryId);
                    break;
                case "itemid" :
                    writer.Write(historyInfo.ItemID);
                    break;
                case "success" :
                    writer.Write(historyInfo.Success);
                    break;
                case "message" :
                    writer.Write(historyInfo.Message);
                    break;
                case "itemdatetime" :
                    writer.Write(historyInfo.ItemDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff"));
                    break;
                case "newlocation":
                    writer.Write(historyInfo.NewLocation);
                    break;

                default :
                    writer.Write(SystemInfo.NullText);
                    break;
            }
        }
    }

    public class HistoryLoggerInfo
    {
        public string MigrationHistoryId { get; set; }
        public string ItemID { get; set; }
        public bool Success { get; set; }
        public string Message { get; set; }
        public DateTime ItemDateTime { get; set; }

        public string NewLocation { get;set; }

        public override string ToString()
        {
            var serializeObject = JsonConvert.SerializeObject(this);
            //var serializeObject = JsonConvert.SerializeObject(this, new Log4NetDateTimeConverter());
            return serializeObject;
        }

        public class Log4NetDateTimeConverter : DateTimeConverterBase
        {
            public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
            {
                writer.WriteValue(((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss.fff"));
            }

            public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
            {
                return DateTime.Now.AddYears(-13);
            }
        }
    }

}

您是否在运行Sql探查器的情况下运行它,以查看是否正在发送Sql语句?我记得有一次log4net试图使用尚未创建的准备好的SQL语句句柄时出现了一个问题,服务器拒绝了这个问题。如果我读对了,我会在探查器中看到前两个日志条目,它使用的是exec sp_prepexec,而我在SQL中看到的条目都使用了exec sp_executeI misread。第一个条目似乎是在调用LogManager.GetLogger时出现的。第二个条目是logger.Info,我们在这之后立即调用它。然后还有其他的logger.Infos,它们在重新获取日志之前都会丢失,这很奇怪。所以它开始工作,然后停止,然后再开始?如果您想要奇怪的建议,那么:在失败的调用期间,您是否检查了记录器上的If IsInfo Enabled值是否仍然为真?您是否在程序执行期间多次配置log4net?您是否正在使用自定义appender或其他类,或者正在执行任何运行时配置更改?appender的缓冲区大小设置为多少?是否在运行Sql探查器的情况下运行它以查看是否正在发送Sql语句?我记得有一次log4net试图使用尚未创建的准备好的SQL语句句柄时出现了一个问题,服务器拒绝了这个问题。如果我读对了,我会在探查器中看到前两个日志条目,它使用的是exec sp_prepexec,而我在SQL中看到的条目都使用了exec sp_executeI misread。第一个条目似乎是在调用LogManager.GetLogger时出现的。第二个条目是logger.Info,我们在这之后立即调用它。然后还有其他的logger.Infos,它们在重新获取日志之前都会丢失,这很奇怪。所以它开始工作,然后停止,然后再开始?如果您想要奇怪的建议,那么:在失败的调用期间,您是否检查了记录器上的If IsInfo Enabled值是否仍然为真?您是否在程序执行期间多次配置log4net?您是否正在使用自定义appender或其他类,或者正在执行任何运行时配置更改?appender的缓冲区大小设置为多少?