コード例 #1
0
ファイル: LogMonitor.cs プロジェクト: YHZX2013/exchange_diff
        internal virtual void AddNewLogsToProcess(IEnumerable <FileInfo> fileInfoList)
        {
            this.ResetStaleLogCollection();
            int num  = 0;
            int num2 = 0;
            IOrderedEnumerable <FileInfo> orderedEnumerable = from f in fileInfoList
                                                              orderby f.CreationTimeUtc descending
                                                              select f;
            bool flag  = true;
            bool flag2 = false;
            List <LogFileInfo> list = new List <LogFileInfo>();
            DateTime           t    = DateTime.UtcNow - this.Config.ActiveLogFileIdleTimeout;

            foreach (FileInfo fileInfo in orderedEnumerable)
            {
                try
                {
                    bool         isActive = flag || (this.Config.EnableMultipleWriters && fileInfo.LastWriteTimeUtc > t);
                    ILogFileInfo logFileInfo;
                    LogFileInfo  logFileInfo2;
                    if (!this.knownLogNameToLogFileMap.TryGetValue(fileInfo.Name, out logFileInfo))
                    {
                        logFileInfo2 = new LogFileInfo(fileInfo.Name, isActive, this.instance, this.watermarkFileHelper);
                        this.knownLogNameToLogFileMap.TryAdd(fileInfo.Name, logFileInfo2);
                        list.Add(logFileInfo2);
                        num++;
                    }
                    else
                    {
                        logFileInfo2          = (LogFileInfo)logFileInfo;
                        logFileInfo2.IsActive = isActive;
                    }
                    if (!flag2)
                    {
                        this.CalculateIncompleteBytes(logFileInfo2, out flag2);
                    }
                    this.UpdateStaleLogs(logFileInfo2);
                    if (logFileInfo2.Status == ProcessingStatus.NeedProcessing)
                    {
                        num2++;
                    }
                }
                catch (FailedToInstantiateLogFileInfoException ex)
                {
                    EventLogger.Logger.LogEvent(LogUploaderEventLogConstants.Tuple_FailedToInstantiateLogFileInfo, fileInfo.Name, new object[]
                    {
                        ex.Message
                    });
                    ServiceLogger.LogError(ServiceLogger.Component.LogMonitor, (LogUploaderEventLogConstants.Message) 2147486660U, ex.Message, this.instance, fileInfo.Name);
                }
                flag = false;
            }
            if (list.Count > 0)
            {
                this.AddLogToNeedProcessing(list);
            }
            this.perfCounterInstance.TotalIncomingLogs.IncrementBy((long)num);
            this.perfCounterInstance.NumberOfIncomingLogs.RawValue     = (long)num;
            this.perfCounterInstance.LogsNeverProcessedBefore.RawValue = (long)num2;
        }
コード例 #2
0
        private T Dequeue()
        {
            T result = default(T);

            if (!this.queue.TryDequeue(out result))
            {
                ServiceLogger.LogDebug(ServiceLogger.Component.LogReader, LogUploaderEventLogConstants.Message.LogBatchEnqueue, string.Format("Enqueue: called : Type={0}, thread={1}, queueSize={2}, capacity={3} ?---InDequeuExp ", new object[]
                {
                    typeof(T),
                    Thread.CurrentThread.ManagedThreadId,
                    this.queue.Count,
                    this.Capacity
                }), "", "");
                throw new Exception("TryDequeue should always return true");
            }
            int num = this.producerSemaphore.Release();

            this.ProducerSemaphoreCount = num + 1;
            ServiceLogger.LogDebug(ServiceLogger.Component.LogReader, LogUploaderEventLogConstants.Message.LogBatchEnqueue, string.Format("Enqueue: called : Type={0}, thread={1}, queueSize={2}, capacity={3}, consumerSemaphore={4} ?---InDequeuDone ", new object[]
            {
                typeof(T),
                Thread.CurrentThread.ManagedThreadId,
                this.queue.Count,
                this.Capacity,
                num
            }), "", "");
            return(result);
        }
コード例 #3
0
 public LogFileInfo(string fileName, bool isActive, string instanceName, IWatermarkFileHelper wmkFileHelper)
 {
     ArgumentValidator.ThrowIfNullOrEmpty("fileName", fileName);
     ArgumentValidator.ThrowIfNull("wmkFileMgr", wmkFileHelper);
     ArgumentValidator.ThrowIfNullOrEmpty("LogFileDirectory", wmkFileHelper.LogFileDirectory);
     this.fileName = Path.GetFileName(fileName);
     ArgumentValidator.ThrowIfNullOrEmpty("this.fileName", this.fileName);
     this.fullFileName = Path.Combine(wmkFileHelper.LogFileDirectory, this.fileName);
     this.status       = ProcessingStatus.NeedProcessing;
     this.isActive     = isActive;
     this.syncObject   = new object();
     this.instance     = instanceName;
     if (!File.Exists(this.fullFileName))
     {
         EventLogger.Logger.LogEvent(LogUploaderEventLogConstants.Tuple_FailedToInstantiateLogFileInfoFileNotExist, this.fullFileName, new object[]
         {
             this.fullFileName
         });
         ServiceLogger.LogError(ServiceLogger.Component.LogFileInfo, (LogUploaderEventLogConstants.Message) 3221226477U, string.Empty, this.instance, this.fullFileName);
         throw new FailedToInstantiateLogFileInfoException(Strings.FailedToInstantiateLogFileInfoFileNotExist(this.fullFileName));
     }
     this.fileInfo = new FileInfo(this.fullFileName);
     this.fileInfo.Refresh();
     this.creationTimeUtc = this.fileInfo.CreationTimeUtc;
     this.waterMarkFile   = wmkFileHelper.CreateWaterMarkFileObj(this.fileName, instanceName);
     Tools.DebugAssert(this.waterMarkFile != null, "this.waterMarkFile != null");
 }
コード例 #4
0
        public static void LogCommon(ServiceLogger.LogLevel logLevel, string message, string customData, ServiceLogger.Component componentName = ServiceLogger.Component.None, string logFileType = "", string logFilePath = "")
        {
            if (ServiceLogger.serviceLog == null)
            {
                ServiceLogger.InitializeMtrtLog();
            }
            if (ServiceLogger.ServiceLogLevel == ServiceLogger.LogLevel.None || logLevel < ServiceLogger.ServiceLogLevel)
            {
                return;
            }
            LogRowFormatter logRowFormatter = new LogRowFormatter(ServiceLogger.MessageTracingServiceLogSchema);

            logRowFormatter[1] = logLevel.ToString();
            if (!string.IsNullOrEmpty(logFileType))
            {
                string[] array = logFileType.Split(new char[]
                {
                    '_'
                });
                logRowFormatter[2] = array[0];
            }
            if (!string.IsNullOrEmpty(logFilePath))
            {
                logRowFormatter[3] = logFilePath;
            }
            logRowFormatter[4] = componentName.ToString();
            logRowFormatter[5] = message;
            if (!string.IsNullOrEmpty(customData))
            {
                logRowFormatter[6] = customData;
            }
            ServiceLogger.serviceLog.Append(logRowFormatter, 0);
        }
コード例 #5
0
 public void WriteWatermark(List <LogFileRange> ranges)
 {
     ArgumentValidator.ThrowIfNull("ranges", ranges);
     if (this.disposed > 0)
     {
         ServiceLogger.LogError(ServiceLogger.Component.WatermarkFile, (LogUploaderEventLogConstants.Message) 3221231496U, string.Empty, this.instance, this.logFileFullName);
         return;
     }
     lock (this.watermarkFileLock)
     {
         if (this.disposed > 0)
         {
             ServiceLogger.LogError(ServiceLogger.Component.WatermarkFile, (LogUploaderEventLogConstants.Message) 3221231496U, string.Empty, this.instance, this.logFileFullName);
             return;
         }
         if (this.streamWriter == null)
         {
             FileStream stream = File.Open(this.watermarkFullFileName, FileMode.Append, FileAccess.Write, FileShare.Read);
             this.streamWriter = new StreamWriter(stream);
         }
         string arg = DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ss");
         foreach (LogFileRange logFileRange in ranges)
         {
             this.streamWriter.WriteLine("{0},{1},{2}", logFileRange.StartOffset, logFileRange.EndOffset, arg);
             this.UpdateBlocksProcessed(logFileRange.StartOffset, logFileRange.EndOffset);
         }
         this.streamWriter.Flush();
     }
     if (ExTraceGlobals.WriterTracer.IsTraceEnabled(TraceType.DebugTrace))
     {
         DateTime utcNow  = DateTime.UtcNow;
         string   message = string.Format("Watermark update time is {0} for log {1}", utcNow, this.watermarkFullFileName);
         ExTraceGlobals.WriterTracer.TraceDebug((long)this.GetHashCode(), message);
     }
 }
コード例 #6
0
ファイル: LogMonitor.cs プロジェクト: YHZX2013/exchange_diff
 private bool RetryableStart()
 {
     try
     {
         this.CreateWriters();
     }
     catch (ConfigurationErrorsException ex)
     {
         if (ex.Message.Contains("Log Path is not set in Registry"))
         {
             int num = Math.Max(1, 300 / (int)this.config.LogDirCheckInterval.TotalSeconds);
             if (this.checkDirectoryCount / num < 1)
             {
                 EventLogger.Logger.LogEvent(LogUploaderEventLogConstants.Tuple_FailedToGetLogPath, this.instance, new object[]
                 {
                     this.instance,
                     ex.Message
                 });
                 ServiceLogger.LogError(ServiceLogger.Component.LogMonitor, (LogUploaderEventLogConstants.Message) 3221488641U, ex.Message, this.instance, this.logDirectory);
                 return(false);
             }
         }
         throw;
     }
     this.StartWriterThreads(this.stopTokenSource.Token);
     this.StartReaderThreads(this.stopTokenSource.Token);
     return(true);
 }
コード例 #7
0
ファイル: LogMonitor.cs プロジェクト: YHZX2013/exchange_diff
 private void RemoveLogFileInfoObjects(IEnumerable <LogFileInfo> toBeRemovedList)
 {
     foreach (LogFileInfo logFileInfo in toBeRemovedList)
     {
         LogFileInfo logFileInfo2;
         this.logsJustFinishedParsing.TryRemove(logFileInfo.FileName, out logFileInfo2);
         logFileInfo.Status = ProcessingStatus.CompletedProcessing;
         logFileInfo.WatermarkFileObj.Dispose();
         if (logFileInfo.FileExists)
         {
             logFileInfo.WatermarkFileObj.CreateDoneFile();
         }
         ILogFileInfo logFileInfo3;
         if (this.knownLogNameToLogFileMap.TryRemove(logFileInfo.FileName, out logFileInfo3))
         {
             string text = string.Format("log file {0} is removed from KnownLogNameToLogFileMap.", logFileInfo.FileName);
             ExTraceGlobals.LogMonitorTracer.TraceDebug((long)this.GetHashCode(), text);
             ServiceLogger.LogInfo(ServiceLogger.Component.LogMonitor, LogUploaderEventLogConstants.Message.LogFileDeletedFromKnownLogNameToLogFileMap, text, "", logFileInfo.FileName);
         }
         else
         {
             string.Format("The log {0} disappeared from KnownLogNameToLogFileMap. This indicates a bug somewhere", logFileInfo.FullFileName);
             EventLogger.Logger.LogEvent(LogUploaderEventLogConstants.Tuple_LogDisappearedFromKnownLogNameToLogFileMap, logFileInfo.FullFileName, new object[]
             {
                 logFileInfo.FullFileName
             });
             ServiceLogger.LogError(ServiceLogger.Component.LogMonitor, (LogUploaderEventLogConstants.Message) 2147748808U, "", "", logFileInfo.FullFileName);
         }
     }
 }
コード例 #8
0
        public bool ReaderHasBytesToParse()
        {
            long logFileSize = this.GetLogFileSize();

            if (logFileSize == 0L)
            {
                return(false);
            }
            if (this.lastReaderProcessedEndOffset < this.lastCheckedEndOffsertBeforeHoles)
            {
                ServiceLogger.LogCommon(ServiceLogger.LogLevel.Error, "lastReaderProcessedEndOffset", string.Format("this.lastReaderProcessedEndOffset {0}, lastCheckedEndOffsertBeforeHoles {1}", this.lastReaderProcessedEndOffset, this.lastCheckedEndOffsertBeforeHoles), ServiceLogger.Component.WatermarkFile, this.instance, this.logFileFullName);
                Tools.DebugAssert(false, string.Format("this.lastReaderProcessedEndOffset {0}, lastCheckedEndOffsertBeforeHoles {1}", this.lastReaderProcessedEndOffset, this.lastCheckedEndOffsertBeforeHoles));
            }
            if (this.blocksNeedReprocessing.Count == 0 && this.lastCheckedEndOffsertBeforeHoles < this.lastReaderProcessedEndOffset)
            {
                if (this.inMemoryBatchCount == 0)
                {
                    this.FindUnprocessedHoles();
                }
                else
                {
                    ServiceLogger.LogCommon(ServiceLogger.LogLevel.Debug, "MemoryBatchCountNotZero", this.inMemoryBatchCount.ToString(), ServiceLogger.Component.WatermarkFile, this.instance, this.logFileFullName);
                }
            }
            return(this.blocksNeedReprocessing.Count > 0 || logFileSize > this.lastReaderProcessedEndOffset);
        }
コード例 #9
0
        private void Enqueue(T item)
        {
            ServiceLogger.LogDebug(ServiceLogger.Component.LogReader, LogUploaderEventLogConstants.Message.LogBatchEnqueue, string.Format("Enqueue: called : Type={0}, thread={1}, queueSize={2}, capacity={3} ?---In ", new object[]
            {
                typeof(T),
                Thread.CurrentThread.ManagedThreadId,
                this.queue.Count,
                this.Capacity
            }), "", "");
            if (this.queue.Count >= this.Capacity)
            {
                ServiceLogger.LogDebug(ServiceLogger.Component.LogReader, LogUploaderEventLogConstants.Message.LogBatchEnqueue, string.Format("Enqueue: called : Type={0}, thread={1}, queueSize={2}, capacity={3} ?---InEnqueuFull ", new object[]
                {
                    typeof(T),
                    Thread.CurrentThread.ManagedThreadId,
                    this.queue.Count,
                    this.Capacity
                }), "", "");
                throw new Exception("Queue should never be full here. The caller should have acquired writer quota");
            }
            this.queue.Enqueue(item);
            int num = this.consumerSemaphore.Release();

            this.ConsumerSemaphoreCount = num + 1;
            ServiceLogger.LogDebug(ServiceLogger.Component.LogReader, LogUploaderEventLogConstants.Message.LogBatchEnqueue, string.Format("Enqueue: called : Type={0}, thread={1}, queueSize={2}, capacity={3}, consumerSemaphore={4} ?---InDone ", new object[]
            {
                typeof(T),
                Thread.CurrentThread.ManagedThreadId,
                this.queue.Count,
                this.Capacity,
                num
            }), "", "");
        }
コード例 #10
0
ファイル: InputBuffer.cs プロジェクト: YHZX2013/exchange_diff
        internal void FlushMessageBatchBufferToWriter(bool forceFlush)
        {
            if (!this.shouldBufferBatches)
            {
                return;
            }
            if (!LogDataBatchReflectionCache <T> .IsMessageBatch)
            {
                return;
            }
            List <T> list = this.messageBatchBuffer;

            Tools.DebugAssert(list.Count <= this.maximumBatchCount, "Verify the buffer size will never goes above the maximumBatchCount");
            if (!forceFlush && (DateTime.UtcNow - this.lastFluchCheckTime).TotalMilliseconds < 1000.0 && list.Count < this.maximumBatchCount)
            {
                return;
            }
            this.lastFluchCheckTime = DateTime.UtcNow;
            foreach (T t in list)
            {
                MessageBatchBase messageBatchBase = t as MessageBatchBase;
                Tools.DebugAssert(messageBatchBase != null, "Failed cast to MessageBatchBase.");
                if (forceFlush || messageBatchBase.ReadyToFlush(this.newestLogLineTS))
                {
                    ServiceLogger.LogDebug(ServiceLogger.Component.LogReader, LogUploaderEventLogConstants.Message.LogBatchEnqueue, string.Format("FlushMessageBatchBufferToWriter: called : thread={0}, forceFlush={1}, this.shouldBufferBatches={2}, bufferCount={3}, this.maximumBatchCount={4} ?---BufEnqueBatch ", new object[]
                    {
                        Thread.CurrentThread.ManagedThreadId,
                        forceFlush,
                        this.shouldBufferBatches,
                        list.Count,
                        this.maximumBatchCount
                    }), "", "");
                    this.EnqueueBatch(t);
                    messageBatchBase.Flushed = true;
                }
            }
            list.RemoveAll(delegate(T batch)
            {
                MessageBatchBase messageBatchBase3 = batch as MessageBatchBase;
                Tools.DebugAssert(messageBatchBase3 != null, "Failed cast to MessageBatchBase.");
                return(messageBatchBase3.Flushed);
            });
            while (list.Count >= this.maximumBatchCount)
            {
                ServiceLogger.LogDebug(ServiceLogger.Component.LogReader, LogUploaderEventLogConstants.Message.LogBatchEnqueue, string.Format("FlushMessageBatchBufferToWriter: called : thread={0}, forceFlush={1}, this.shouldBufferBatches={2}, bufferCount={3}, this.maximumBatchCount={4} ?---BufEnqueBatch2 ", new object[]
                {
                    Thread.CurrentThread.ManagedThreadId,
                    forceFlush,
                    this.shouldBufferBatches,
                    list.Count,
                    this.maximumBatchCount
                }), "", "");
                this.EnqueueBatch(list[0]);
                MessageBatchBase messageBatchBase2 = list[0] as MessageBatchBase;
                Tools.DebugAssert(messageBatchBase2 != null, "Failed cast to MessageBatchBase.");
                messageBatchBase2.Flushed = true;
                list.RemoveAt(0);
            }
        }
コード例 #11
0
 private void TraceBlockNeedProcessing(long startOffset, long endOffset)
 {
     if (ServiceLogger.ServiceLogLevel == ServiceLogger.LogLevel.Debug)
     {
         string message = string.Format("FindblocksNeedProcessing for {0} add ({1}, {2})", Path.GetFileName(this.logFileFullName), startOffset, endOffset);
         ExTraceGlobals.ReaderTracer.TraceDebug((long)this.GetHashCode(), message);
         ServiceLogger.LogCommon(ServiceLogger.LogLevel.Debug, "FindblocksNeedProcessing", string.Format("{0},{1}", startOffset, endOffset), ServiceLogger.Component.WatermarkFile, this.instance, this.LogFileFullName);
     }
 }
コード例 #12
0
 internal LogFileRange ProcessOneWatermark(string line)
 {
     ArgumentValidator.ThrowIfNull("line", line);
     try
     {
         string       fileRangeFromWatermark = WatermarkFile.GetFileRangeFromWatermark(line);
         LogFileRange logFileRange           = LogFileRange.Parse(fileRangeFromWatermark);
         logFileRange.ProcessingStatus = ProcessingStatus.CompletedProcessing;
         lock (this.blocksProcessedLock)
         {
             if (!this.blocksProcessed.ContainsKey(logFileRange.StartOffset))
             {
                 this.AddRangeToProcessed(logFileRange);
                 return(logFileRange);
             }
             EventLogger.Logger.LogEvent(LogUploaderEventLogConstants.Tuple_OverlappingLogRangeInWatermarkFile, this.WatermarkFileFullName, new object[]
             {
                 this.WatermarkFileFullName,
                 logFileRange.StartOffset,
                 logFileRange.EndOffset,
                 logFileRange.StartOffset,
                 this.blocksProcessed[logFileRange.StartOffset].EndOffset
             });
             string text = string.Format("There are overlapping log ranges in watermark file {0}: ({1}, {2}), ({3}, {4}).", new object[]
             {
                 this.WatermarkFileFullName,
                 logFileRange.StartOffset,
                 logFileRange.EndOffset,
                 logFileRange.StartOffset,
                 this.blocksProcessed[logFileRange.StartOffset].EndOffset
             });
             if (Interlocked.CompareExchange(ref WatermarkFile.overlappingWatermarksInWatermarkFile, 1, 0) == 0)
             {
                 EventNotificationItem.Publish(ExchangeComponent.Name, "OverlappingWatermarkRecordsInFile", null, text, ResultSeverityLevel.Error, false);
             }
             ServiceLogger.LogError(ServiceLogger.Component.WatermarkFile, (LogUploaderEventLogConstants.Message) 3221231476U, text, this.instance, this.WatermarkFileFullName);
         }
     }
     catch (MalformedLogRangeLineException ex)
     {
         string text2 = string.Format("Failed to parse watermark from {0}: {1}", this.watermarkFullFileName, ex.Message);
         ExTraceGlobals.ReaderTracer.TraceError((long)this.GetHashCode(), text2);
         EventLogger.Logger.LogEvent(LogUploaderEventLogConstants.Tuple_WatermarkFileParseException, this.watermarkFullFileName, new object[]
         {
             this.watermarkFullFileName,
             ex.Message
         });
         if (Interlocked.CompareExchange(ref WatermarkFile.watermarkParseError, 1, 0) == 0)
         {
             EventNotificationItem.Publish(ExchangeComponent.Name, "MalformedWatermarkRecordError", null, text2, ResultSeverityLevel.Warning, false);
         }
         ServiceLogger.LogError(ServiceLogger.Component.WatermarkFile, (LogUploaderEventLogConstants.Message) 3221231475U, ex.Message, this.instance, this.watermarkFullFileName);
     }
     return(null);
 }
コード例 #13
0
ファイル: InputBuffer.cs プロジェクト: YHZX2013/exchange_diff
 private void BufferOrEnqueueToWriter()
 {
     if (!this.shouldBufferBatches)
     {
         ServiceLogger.LogDebug(ServiceLogger.Component.LogReader, LogUploaderEventLogConstants.Message.LogBatchEnqueue, string.Format("BufferOrEnqueueToWriter: called : thread={0} ?---BufEnque2 ", Thread.CurrentThread.ManagedThreadId), "", "");
         this.EnqueueBatch(this.activeBatch);
         return;
     }
     this.messageBatchBuffer.Add(this.activeBatch);
     Tools.DebugAssert(this.messageBatchBuffer.Count <= this.maximumBatchCount, "Verify the buffer size will never go above the maximumBatchCount");
 }
コード例 #14
0
        internal void UpdateBlocksProcessed(long startOffset, long endOffset)
        {
            LogFileRange logFileRange = new LogFileRange(startOffset, endOffset, ProcessingStatus.CompletedProcessing);

            lock (this.blocksProcessedLock)
            {
                if (this.blocksProcessed.ContainsKey(startOffset))
                {
                    string text;
                    if (this.blocksProcessed[startOffset].EndOffset == endOffset)
                    {
                        text = string.Format("Tried to add an existing block ({0}, {1}) when updating in-memory watermarks for log {2}.", startOffset, endOffset, this.logFileFullName);
                        ExTraceGlobals.WriterTracer.TraceError((long)this.GetHashCode(), text);
                        EventLogger.Logger.LogEvent(LogUploaderEventLogConstants.Tuple_WatermarkFileDuplicateBlock, this.logFileFullName, new object[]
                        {
                            startOffset.ToString(),
                            endOffset.ToString(),
                            this.logFileFullName
                        });
                        ServiceLogger.LogError(ServiceLogger.Component.WatermarkFile, (LogUploaderEventLogConstants.Message) 3221231474U, string.Format("startOffset={0};endOffset={1}", startOffset, endOffset), this.instance, this.logFileFullName);
                    }
                    else
                    {
                        text = string.Format("Tried to add an block ({0}, {1}) that overlaps with an existing block ({2}, {3}) in the in-memory watermarks for log {4}.", new object[]
                        {
                            startOffset,
                            endOffset,
                            startOffset,
                            this.blocksProcessed[startOffset].EndOffset,
                            this.logFileFullName
                        });
                        ExTraceGlobals.WriterTracer.TraceError((long)this.GetHashCode(), text);
                        EventLogger.Logger.LogEvent(LogUploaderEventLogConstants.Tuple_WatermarkFileOverlappingBlock, null, new object[]
                        {
                            startOffset,
                            endOffset,
                            startOffset,
                            this.blocksProcessed[startOffset].EndOffset,
                            this.logFileFullName
                        });
                        ServiceLogger.LogError(ServiceLogger.Component.WatermarkFile, (LogUploaderEventLogConstants.Message) 3221231479U, string.Format("startOffset={0};endOffset={1}", startOffset, endOffset), this.instance, this.logFileFullName);
                    }
                    if (Interlocked.CompareExchange(ref WatermarkFile.overlappingWatermarksInMemory, 1, 0) == 0)
                    {
                        EventNotificationItem.Publish(ExchangeComponent.Name, "OverlappingWatermarkRecordsInMemory", null, text, ResultSeverityLevel.Error, false);
                    }
                }
                else
                {
                    this.AddRangeToProcessed(logFileRange);
                }
            }
        }
コード例 #15
0
        public bool IsLogCompleted()
        {
            bool flag = this.ReaderHasBytesToParse();

            ServiceLogger.LogCommon(ServiceLogger.LogLevel.Debug, "LogIsNotCompleted", string.Format("{0}, {1}, {2}, {3} ", new object[]
            {
                this.blocksNeedReprocessing.Count,
                this.lastCheckedEndOffsertBeforeHoles,
                this.lastReaderProcessedEndOffset,
                this.inMemoryBatchCount
            }), ServiceLogger.Component.WatermarkFile, this.instance, this.logFileFullName);
            return(!flag && this.lastCheckedEndOffsertBeforeHoles >= this.GetLogFileSize());
        }
コード例 #16
0
 private static void InitializeMtrtLog()
 {
     try
     {
         ServiceLogger.ReadConfiguration();
     }
     finally
     {
         Log log = new Log("MessageTracingService_", new LogHeaderFormatter(ServiceLogger.MessageTracingServiceLogSchema), "Microsoft.ForeFront.Hygiene.MessageTracing");
         log.Configure(ServiceLogger.FileLocation, ServiceLogger.MaximumLogAge, ServiceLogger.MaximumLogDirectorySize, ServiceLogger.MaximumLogFileSize, false, 0, TimeSpan.MaxValue, LogFileRollOver.Hourly);
         ServiceLogger.Initialize(log);
     }
 }
コード例 #17
0
ファイル: LogMonitor.cs プロジェクト: YHZX2013/exchange_diff
 private void ReportCompleteLogs(List <LogFileInfo> completeLogs)
 {
     foreach (LogFileInfo logFileInfo in completeLogs)
     {
         this.perfCounterInstance.TotalCompletedLogs.Increment();
         string message = string.Format("The processing of log {0} is completed.", logFileInfo.FullFileName);
         ExTraceGlobals.LogMonitorTracer.TraceDebug((long)this.GetHashCode(), message);
         EventLogger.Logger.LogEvent(LogUploaderEventLogConstants.Tuple_LogMonitorLogCompleted, logFileInfo.FullFileName, new object[]
         {
             logFileInfo.FullFileName
         });
         ServiceLogger.LogInfo(ServiceLogger.Component.LogMonitor, LogUploaderEventLogConstants.Message.LogMonitorLogCompleted, "", "", logFileInfo.FullFileName);
     }
 }
コード例 #18
0
        internal void FindUnprocessedHoles()
        {
            if (ServiceLogger.ServiceLogLevel == ServiceLogger.LogLevel.Debug)
            {
                string message = string.Format("FindblocksNeedProcessing found {0} blocks processed for {1}", this.blocksProcessed.Count, this.LogFileFullName);
                ExTraceGlobals.ReaderTracer.TraceDebug((long)this.GetHashCode(), message);
            }
            Tools.DebugAssert(this.blocksNeedReprocessing.Count == 0, "this.blocksNeedProcessing.Count == 0");
            bool foundHole             = false;
            Action <long, long> action = delegate(long s, long e)
            {
                foundHole = true;
                LogFileRange logFileRange2 = new LogFileRange(s, e, ProcessingStatus.NeedProcessing);
                this.TraceBlockNeedProcessing(logFileRange2.StartOffset, logFileRange2.EndOffset);
                this.blocksNeedReprocessing.Add(logFileRange2);
            };
            long num = 0L;

            lock (this.blocksProcessedLock)
            {
                int count = this.blocksProcessed.Count;
                this.lastCheckedEndOffsertBeforeHoles = 0L;
                for (int i = 0; i < count; i++)
                {
                    LogFileRange logFileRange = this.blocksProcessed.Values[i];
                    if (logFileRange.EndOffset < logFileRange.StartOffset)
                    {
                        ServiceLogger.LogCommon(ServiceLogger.LogLevel.Error, "Invalid watermark range", string.Format("{0},{1}", logFileRange.StartOffset, logFileRange.EndOffset), ServiceLogger.Component.WatermarkFile, "", "");
                        Tools.DebugAssert(false, string.Format("detected invalid range {0},{1}", logFileRange.StartOffset, logFileRange.EndOffset));
                    }
                    else
                    {
                        if (num < logFileRange.StartOffset)
                        {
                            action(num, logFileRange.StartOffset);
                        }
                        num = Math.Max(num, logFileRange.EndOffset);
                        if (!foundHole)
                        {
                            this.lastCheckedEndOffsertBeforeHoles = num;
                        }
                    }
                }
            }
            if (this.lastReaderProcessedEndOffset > num)
            {
                action(num, this.lastReaderProcessedEndOffset);
            }
        }
コード例 #19
0
ファイル: LogMonitor.cs プロジェクト: YHZX2013/exchange_diff
        private void DumpPendingProcessLogFilesInfo(IEnumerable <FileInfo> pendingProcessLogFiles)
        {
            if (ServiceLogger.ServiceLogLevel > ServiceLogger.LogLevel.Debug)
            {
                return;
            }
            StringBuilder stringBuilder = new StringBuilder();

            foreach (FileInfo fileInfo in pendingProcessLogFiles)
            {
                stringBuilder.AppendLine(string.Format("file={0},created={1},modified={2}", fileInfo.FullName, fileInfo.CreationTimeUtc, fileInfo.LastWriteTimeUtc));
            }
            if (stringBuilder.Length > 0)
            {
                ServiceLogger.LogDebug(ServiceLogger.Component.LogMonitor, LogUploaderEventLogConstants.Message.PendingProcessLogFilesInfo, stringBuilder.ToString(), this.instance, this.logDirectory);
            }
        }
コード例 #20
0
        public void CreateDoneFile()
        {
            string path = Path.ChangeExtension(this.watermarkFullFileName, "done");

            try
            {
                File.Open(path, FileMode.OpenOrCreate).Close();
            }
            catch (IOException ex)
            {
                if (!ex.Message.Contains("There is not enough space on the disk."))
                {
                    throw;
                }
                ServiceLogger.LogError(ServiceLogger.Component.WatermarkFile, (LogUploaderEventLogConstants.Message) 3221231487U, ex.Message, this.instance, this.logFileFullName);
            }
        }
コード例 #21
0
ファイル: LogMonitor.cs プロジェクト: YHZX2013/exchange_diff
 internal void ClearnupWmkDoneFiles(string dir, string filter)
 {
     foreach (string text in Directory.EnumerateFiles(dir, filter))
     {
         try
         {
             string path = this.watermarkFileHelper.DeduceLogFullFileNameFromDoneOrWatermarkFileName(text);
             if (!File.Exists(path))
             {
                 if (this.knownLogNameToLogFileMap.ContainsKey(Path.GetFileName(path)))
                 {
                     ServiceLogger.LogInfo(ServiceLogger.Component.LogMonitor, LogUploaderEventLogConstants.Message.DeletingFile, "Skipped for it's still processed by this logMonitor", this.instance, text);
                 }
                 else
                 {
                     ServiceLogger.LogInfo(ServiceLogger.Component.LogMonitor, LogUploaderEventLogConstants.Message.DeletingFile, "Delete Done or watermark file", this.instance, text);
                     File.Delete(text);
                 }
             }
         }
         catch (IOException ex)
         {
             string text2 = string.Format("Failed to clean up {0}. Exception: {1}.", text, ex.Message);
             ExTraceGlobals.LogMonitorTracer.TraceError((long)this.GetHashCode(), text2);
             EventLogger.Logger.LogEvent(LogUploaderEventLogConstants.Tuple_LogMonitorWatermarkCleanupFailed, text, new object[]
             {
                 text,
                 ex.Message
             });
             ServiceLogger.LogError(ServiceLogger.Component.LogMonitor, (LogUploaderEventLogConstants.Message) 3221228476U, text2, "", text);
         }
         catch (UnauthorizedAccessException ex2)
         {
             string text3 = string.Format("Failed to clean up {0}. Exception: {1}.", text, ex2);
             ExTraceGlobals.LogMonitorTracer.TraceError((long)this.GetHashCode(), text3);
             EventLogger.Logger.LogEvent(LogUploaderEventLogConstants.Tuple_LogMonitorWatermarkCleanupFailed, text, new object[]
             {
                 text,
                 ex2
             });
             ServiceLogger.LogError(ServiceLogger.Component.LogMonitor, (LogUploaderEventLogConstants.Message) 3221228476U, text3, "", text);
         }
     }
 }
コード例 #22
0
        private long GetLogFileSize()
        {
            long result;

            try
            {
                result = new FileInfo(this.LogFileFullName).Length;
            }
            catch (FileNotFoundException ex)
            {
                EventLogger.Logger.LogEvent(LogUploaderEventLogConstants.Tuple_FileDeletedWhenCheckingItsCompletion, this.LogFileFullName, new object[]
                {
                    this.LogFileFullName
                });
                ServiceLogger.LogError(ServiceLogger.Component.WatermarkFile, (LogUploaderEventLogConstants.Message) 2147486661U, ex.Message, this.instance, this.LogFileFullName);
                result = 0L;
            }
            return(result);
        }
コード例 #23
0
ファイル: LogMonitor.cs プロジェクト: YHZX2013/exchange_diff
 private Action <object> DoWorkAction(Action <object> realDoWorkMethod)
 {
     if (!this.catchReaderWriterExceptionsForUnitTest)
     {
         return(realDoWorkMethod);
     }
     return(delegate(object stateObj)
     {
         try
         {
             realDoWorkMethod(stateObj);
         }
         catch (Exception ex)
         {
             ServiceLogger.LogError(ServiceLogger.Component.LogMonitor, (LogUploaderEventLogConstants.Message) 3221226485U, ex.ToString(), "", "");
             EventNotificationItem.Publish(ExchangeComponent.Name, "ServiceStartUnknownException", null, ex.ToString(), ResultSeverityLevel.Error, false);
             LogMonitor <T> < > 4__this = this;
             < > 4__this.unitTestCatchedExceptionMessage += ex.ToString();
         }
コード例 #24
0
        public void DoWork(object obj)
        {
            ArgumentValidator.ThrowIfNull("obj", obj);
            if (string.IsNullOrEmpty(Thread.CurrentThread.Name))
            {
                Thread.CurrentThread.Name = string.Format("Writer {0} for log type {1}", this.id, this.instance);
            }
            ServiceLogger.LogDebug(ServiceLogger.Component.DatabaseWriter, LogUploaderEventLogConstants.Message.LogBatchEnqueue, string.Format("DoWork: called : thread={0}, log={1}  ?---LogWriter", Thread.CurrentThread.ManagedThreadId, this.instance), "", "");
            this.cancellationContext = (CancellationContext)obj;
            while (!this.CheckServiceStopRequest("DoWork()"))
            {
                this.DequeueAndWriteOneItem();
            }
            string message = string.Format("Writer {0} for log type {1} stopped.", this.id, this.instance);

            ExTraceGlobals.WriterTracer.TraceDebug((long)this.GetHashCode(), message);
            ServiceLogger.LogInfo(ServiceLogger.Component.DatabaseWriter, LogUploaderEventLogConstants.Message.LogMonitorRequestedStop, Thread.CurrentThread.Name, this.instance, "");
            this.stopped = true;
        }
コード例 #25
0
        internal void LogErrorAndUpdatePerfCounter(long rowStartOffset, long rowEndOffset, Exception exception, ExEventLog.EventTuple eventTuple, LogUploaderEventLogConstants.Message message, string component)
        {
            string text = string.Format("Failed to parse log {0} at row ({1}, {2}): \nException: {3}", new object[]
            {
                this.FullLogName,
                rowStartOffset,
                rowEndOffset,
                exception
            });

            ExTraceGlobals.ParserTracer.TraceError((long)this.GetHashCode(), text);
            EventLogger.Logger.LogEvent(eventTuple, exception.Message, new object[]
            {
                text
            });
            PerfCountersInstanceCache.GetInstance(this.Instance).TotalInvalidLogLineParseErrors.Increment();
            EventNotificationItem.Publish(ExchangeComponent.Name, component, null, text, ResultSeverityLevel.Error, false);
            ServiceLogger.LogError(ServiceLogger.Component.LogDataBatch, message, text, this.Instance, this.FullLogName);
            PerfCountersInstanceCache.GetInstance(this.Instance).TotalParseErrors.Increment();
        }
コード例 #26
0
ファイル: LogMonitor.cs プロジェクト: YHZX2013/exchange_diff
        private void ReportMissingLogs(List <LogFileInfo> missingLogs)
        {
            if (missingLogs.Count == 0)
            {
                return;
            }
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.AppendLine("The following logs are not found while being processed:");
            foreach (LogFileInfo logFileInfo in missingLogs)
            {
                ServiceLogger.LogError(ServiceLogger.Component.LogMonitor, (LogUploaderEventLogConstants.Message) 3221231489U, "CheckLogsAndMarkComplete", this.instance, logFileInfo.FullFileName);
                EventLogger.Logger.LogEvent(LogUploaderEventLogConstants.Tuple_FileDeleted, logFileInfo.FullFileName, new object[]
                {
                    logFileInfo.FullFileName
                });
                stringBuilder.AppendLine(logFileInfo.FullFileName);
            }
            EventNotificationItem.Publish(ExchangeComponent.Name, "LogFileNotFoundError", null, stringBuilder.ToString(), ResultSeverityLevel.Error, false);
        }
コード例 #27
0
ファイル: InputBuffer.cs プロジェクト: YHZX2013/exchange_diff
        public void EnqueueBatch(T batch)
        {
            if (ExTraceGlobals.ReaderTracer.IsTraceEnabled(TraceType.DebugTrace))
            {
                for (int i = 0; i < batch.LogRanges.Count; i++)
                {
                    string message = string.Format("InputBuffer: enqueueBatch range {0}: ({1}, {2}) for log {3}", new object[]
                    {
                        i,
                        batch.LogRanges[i].StartOffset,
                        batch.LogRanges[i].EndOffset,
                        this.fullLogName
                    });
                    ExTraceGlobals.ReaderTracer.TraceDebug((long)this.GetHashCode(), message);
                }
            }
            long size = batch.Size;
            long num  = (long)batch.NumberOfLinesInBatch;

            ServiceLogger.LogDebug(ServiceLogger.Component.LogReader, LogUploaderEventLogConstants.Message.LogBatchEnqueue, string.Format("before enqueue; batch size (in original log) {0}, lines {1} +++++++++ ", size, num), this.instance, this.fullLogName);
            this.watermarkFileRef.InMemoryCountIncrease();
            try
            {
                this.logDataBatchQueue.Enqueue(batch, this.cancellationContext);
            }
            catch
            {
                this.watermarkFileRef.InMemoryCountDecrease();
                throw;
            }
            if (this.cancellationContext.StopToken.IsCancellationRequested)
            {
                return;
            }
            ServiceLogger.LogDebug(ServiceLogger.Component.LogReader, LogUploaderEventLogConstants.Message.LogBatchEnqueue, string.Format("after enqueue; batch size (in original log) {0}, lines {1} +++++++++ ", size, num), this.instance, this.fullLogName);
            this.perfCounterInstance.InputBufferBatchCounts.Decrement();
            this.perfCounterInstance.BatchQueueLength.Increment();
            this.perfCounterInstance.InputBufferBackfilledLines.IncrementBy(this.newBackfilledLogLines);
            this.newBackfilledLogLines = 0L;
        }
コード例 #28
0
 public T Dequeue(CancellationContext cancellationContext)
 {
     if (cancellationContext == null)
     {
         this.consumerSemaphore.WaitOne();
     }
     else if (WaitHandle.WaitAny(new WaitHandle[]
     {
         cancellationContext.StopToken.WaitHandle,
         this.consumerSemaphore
     }) != 1)
     {
         ServiceLogger.LogDebug(ServiceLogger.Component.LogReader, LogUploaderEventLogConstants.Message.LogBatchEnqueue, string.Format("Enqueue: called : Type={0}, thread={1}, queueSize={2}, capacity={3} ?---InDequeueEmptySkip ", new object[]
         {
             typeof(T),
             Thread.CurrentThread.ManagedThreadId,
             this.queue.Count,
             this.Capacity
         }), "", "");
         return(default(T));
     }
     return(this.Dequeue());
 }
コード例 #29
0
        public void DoWork(object obj)
        {
            ArgumentValidator.ThrowIfNull("obj", obj);
            this.cancellationContext = (CancellationContext)obj;
            CancellationToken stopToken = this.cancellationContext.StopToken;

            if (string.IsNullOrEmpty(Thread.CurrentThread.Name))
            {
                Thread.CurrentThread.Name = string.Format("Reader {0} for log prefix {1}", this.id, this.instance);
            }
            string text = string.Format("Reader {0} for log prefix {1} started", this.id, this.instance);

            ExTraceGlobals.ReaderTracer.TraceInformation(0, (long)this.GetHashCode(), text);
            ServiceLogger.LogDebug(ServiceLogger.Component.LogReader, LogUploaderEventLogConstants.Message.LogBatchEnqueue, string.Format("DoWork: called : thread={0}, {1}  ?---LogReader", Thread.CurrentThread.ManagedThreadId, text), "", "");
            while (!this.CheckServiceStopRequest("DoWork"))
            {
                this.ReadLog();
            }
            string message = string.Format("Reader {0} for log prefix {1} stopped", this.id, this.instance);

            ExTraceGlobals.ReaderTracer.TraceInformation(0, (long)this.GetHashCode(), message);
            ServiceLogger.LogInfo(ServiceLogger.Component.LogReader, LogUploaderEventLogConstants.Message.LogMonitorRequestedStop, Thread.CurrentThread.Name, this.instance, "");
            this.stopped = true;
        }
コード例 #30
0
        internal void DequeueAndWriteOneItem()
        {
            string         text          = string.Empty;
            IWatermarkFile watermarkFile = null;

            try
            {
                T t = this.queue.Dequeue(this.cancellationContext);
                if (t != null)
                {
                    this.perfCounterInstance.BatchQueueLength.Decrement();
                    text          = t.FullLogName;
                    watermarkFile = this.logManager.FindWatermarkFileObject(text);
                    if (ExTraceGlobals.WriterTracer.IsTraceEnabled(TraceType.DebugTrace))
                    {
                        StringBuilder stringBuilder = new StringBuilder();
                        foreach (LogFileRange logFileRange in t.LogRanges)
                        {
                            string value = string.Format("({0}, {1}) ", logFileRange.StartOffset, logFileRange.EndOffset);
                            stringBuilder.Append(value);
                        }
                        string message = string.Format("For log {0}, writer {1} get batch that has {2} ranges: {3}", new object[]
                        {
                            text,
                            this.id,
                            t.LogRanges.Count,
                            stringBuilder.ToString()
                        });
                        ExTraceGlobals.WriterTracer.TraceDebug((long)this.GetHashCode(), message);
                    }
                    this.WriteBatch(t);
                }
                else if (!this.CheckServiceStopRequest("DequeueAndWriteOneItem()"))
                {
                    Tools.DebugAssert(this.cancellationContext.StopToken.IsCancellationRequested, "If Enqueue is not cancelled, it should always get a batch back");
                }
            }
            catch (FaultException ex)
            {
                ExTraceGlobals.WriterTracer.TraceError <string, string>((long)this.GetHashCode(), "Writer failed to write data through web service DAL when processing log {0}. Check the event log on the FFO web service role. The exception is: {1}.", text, ex.Message);
                EventLogger.Logger.LogEvent(LogUploaderEventLogConstants.Tuple_WebServiceWriteException, ex.Message, new object[]
                {
                    text,
                    ex.ToString()
                });
                ServiceLogger.LogError(ServiceLogger.Component.DatabaseWriter, (LogUploaderEventLogConstants.Message) 3221489634U, ex.Message, this.instance, text);
            }
            catch (CommunicationException ex2)
            {
                ExTraceGlobals.WriterTracer.TraceError <string, string>((long)this.GetHashCode(), "Writer failed to write data through web service DAL when processing log {0}. The exception is: {1}.", text, ex2.Message);
                EventLogger.Logger.LogEvent(LogUploaderEventLogConstants.Tuple_WebServiceWriteException, ex2.Message, new object[]
                {
                    text,
                    ex2.ToString()
                });
                ServiceLogger.LogError(ServiceLogger.Component.DatabaseWriter, (LogUploaderEventLogConstants.Message) 3221489633U, ex2.Message, this.instance, text);
            }
            catch (ADTopologyEndpointNotFoundException ex3)
            {
                ExTraceGlobals.WriterTracer.TraceError <string, string>((long)this.GetHashCode(), "Writer caught an ADTopologyEndpointNotFoundException when processing log {0}. Details is: {1}", text, ex3.Message);
                EventLogger.Logger.LogEvent(LogUploaderEventLogConstants.Tuple_ADTopologyEndpointNotFound, ex3.Message, new object[]
                {
                    text,
                    ex3.Message
                });
                ServiceLogger.LogError(ServiceLogger.Component.DatabaseWriter, (LogUploaderEventLogConstants.Message) 3221489629U, ex3.Message, this.instance, text);
            }
            catch (Exception ex4)
            {
                if (!(ex4 is ThreadAbortException) || !this.cancellationContext.StopToken.IsCancellationRequested)
                {
                    string text2 = string.Format("Writer caught an exception when processing log {0}: {1}", text, ex4);
                    ExTraceGlobals.WriterTracer.TraceError((long)this.GetHashCode(), text2);
                    EventLogger.Logger.LogEvent(LogUploaderEventLogConstants.Tuple_DatabaseWriterUnknownException, ex4.Message, new object[]
                    {
                        text,
                        ex4
                    });
                    EventNotificationItem.Publish(ExchangeComponent.Name, "UnexpectedWriterError", null, text2, ResultSeverityLevel.Error, false);
                    this.perfCounterInstance.TotalUnexpectedWriterErrors.Increment();
                    ServiceLogger.LogError(ServiceLogger.Component.DatabaseWriter, (LogUploaderEventLogConstants.Message) 3221489617U, text2, this.instance, text);
                    throw;
                }
                Thread.ResetAbort();
                ServiceLogger.LogInfo(ServiceLogger.Component.DatabaseWriter, LogUploaderEventLogConstants.Message.LogMonitorRequestedStop, Thread.CurrentThread.Name + " received thread abort event", this.instance, "");
            }
            finally
            {
                if (watermarkFile != null)
                {
                    watermarkFile.InMemoryCountDecrease();
                }
            }
        }