我正在应用程序中使用Enterprise Library Logging Application Block版本6.0。今天,应用程序在午夜崩溃,事件日志中记录了该事件。
时间戳:2019-03-27 00:00:00
异常信息:System.NullReferenceException 在Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener + StreamWriterRollingHelper.PerformRoll(System.DateTime)处 在Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener + StreamWriterRollingHelper.RollIfNecessary()中 在System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object,布尔值) 在System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object,布尔值) 在System.Threading.TimerQueueTimer.CallCallback()
通过app.config设置RollingFlatFileTraceListener
<add name="Flat File Destination"
type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging"
listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging"
fileName="trace.log"
footer=""
formatter="Text Formatter"
header=""
rollFileExistsBehavior="Increment"
rollInterval="Midnight"
rollSizeKB="50000"
timeStampPattern="yyyy-MM-dd"
maxArchivedFiles="10"
traceOutputOptions="None"
filter="All" />
在午夜前后的毫秒中,跟踪文件中都有日志条目。因此,在跟踪文件滚动时必须可以访问它。
我编写了一个小型测试程序,以从崩溃的应用程序中使用相同的设置对应用程序记录器施加压力。在应用程序运行时,我经常将时间更改为午夜之前的几秒钟,试图复制异常,但未成功。
我在版本5.0和6.0中打开了日志记录应用程序的程序集。 在6.0版中,RollingFlatFileTraceListener具有以下构造函数:
public RollingFlatFileTraceListener(string fileName, string header = "----------------------------------------", string footer = "----------------------------------------", ILogFormatter formatter = null, int rollSizeKB = 0, string timeStampPattern = "yyyy-MM-dd", RollFileExistsBehavior rollFileExistsBehavior = 0, RollInterval rollInterval = 0, int maxArchivedFiles = 0) : base(fileName, header, footer, formatter)
{
Guard.ArgumentNotNullOrEmpty(fileName, "fileName");
this.rollSizeInBytes = rollSizeKB * 1024;
this.timeStampPattern = timeStampPattern;
this.rollFileExistsBehavior = rollFileExistsBehavior;
this.rollInterval = rollInterval;
this.maxArchivedFiles = maxArchivedFiles;
this.rollingHelper = new RollingFlatFileTraceListener.StreamWriterRollingHelper(this);
if (rollInterval == RollInterval.Midnight)
{
DateTime currentDateTime = this.rollingHelper.DateTimeProvider.CurrentDateTime;
DateTime date = currentDateTime.AddDays(1).Date;
this.timer = new Timer((object o) => this.rollingHelper.RollIfNecessary(), null, date.Subtract(currentDateTime), TimeSpan.FromDays(1));
}
}
因此,如果需要将滚动间隔设置为Midnight
,则会启动一个单独的计时器来执行跟踪文件的滚动。在V5.0中不是这种情况。
方法RollIfNecessary
也被方法TraceData
调用。我的假设是,执行方法RollIfNecessary
时存在线程问题。我发现此方法没有锁。
有人可以证实我的怀疑或有类似的问题吗?