将rollInterval设置为RollingFlatFileTraceListener的“午夜”时出现问题

时间:2019-03-27 12:32:14

标签: c# logging nullreferenceexception enterprise-library logging-application-block

我正在应用程序中使用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时存在线程问题。我发现此方法没有锁。

有人可以证实我的怀疑或有类似的问题吗?

0 个答案:

没有答案