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