示例#1
0
        private bool TryArchiveLogFile(FileLoggerOptions options, string logFilePath)
        {
            try
            {
                _FileSystem.MoveFile(logFilePath, Path.Combine(options.LogFileArchiveDirectory, Path.GetFileName(logFilePath)));
                return(true);
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch
#pragma warning restore CA1031 // Do not catch general exception types
            {
                return(false);
            }
        }
示例#2
0
        private void ApplyOptions(FileLoggerOptions options)
        {
            _ApplicationName = !string.IsNullOrWhiteSpace(options.ApplicationName)
                                ? options.ApplicationName.Trim()
                                : _HostEnvironment.ApplicationName;

            string LogFileDirectory        = PrepareLogFileDirectory("Log file directory", options.LogFileDirectory, FileLoggerOptions.DefaultLogFileDirectory);
            string LogFileArchiveDirectory = PrepareLogFileDirectory("Log file archive directory", options.LogFileArchiveDirectory, FileLoggerOptions.DefaultLogFileArchiveDirectory);

            string LogFileNamePattern = !string.IsNullOrWhiteSpace(options.LogFileNamePattern)
                                 ? options.LogFileNamePattern.Trim()
                                 : !options.IncludeGroupNameInFileName
                                         ? FileLoggerOptions.DefaultLogFileNamePattern
                                         : FileLoggerOptions.DefaultGroupLogFileNamePattern;

            string TestFileName = FileNameGenerator.GenerateFileName(
                _ApplicationName,
                s_DefaultSystemTime,
                "__OptionsTest__",
                LogFileNamePattern);

            if (TestFileName.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0)
            {
                throw new InvalidOperationException("Log file naming pattern cannot contain invalid characters.");
            }

            if (options.TestDiskOnStartup)
            {
                TestDiskPermissions(LogFileDirectory, LogFileArchiveDirectory, TestFileName + ".permtest");
            }

            options.LogFileDirectory        = LogFileDirectory;
            options.LogFileArchiveDirectory = LogFileArchiveDirectory;

            _LogFileNamePattern = LogFileNamePattern;

            _LogFileMaxSizeInKilobytes = options.LogFileMaxSizeInKilobytes > 0
                                ? options.LogFileMaxSizeInKilobytes
                                : (int?)null;

            _State = new State(options.JsonOptions ?? FileLoggerOptions.DefaultJsonOptions);

            _LoggerGroupCache = new LoggerGroupCache(options.GroupOptions ?? FileLoggerOptions.DefaultGroupOptions);

            _LogFileManager.ClearCache();
        }
        public static LogFileManagementSchedule Build(ISystemTime systemTime, FileLoggerOptions options)
        {
            DateTime NowUtc   = systemTime.UtcNow;
            DateTime NowLocal = systemTime.Now;

            (DateTime NextCutoverUtc, _) = CalculateSchedule(
                NowUtc,
                NowLocal,
                options.CutoverAndArchiveTimeZoneMode,
                options.LogFileCutoverTime,
                FileLoggerOptions.DefaultLogFileCutoverTime);

            (DateTime NextArchiveUtc, TimeSpan TimeUntilNextArchiveUtc) = CalculateSchedule(
                NowUtc,
                NowLocal,
                options.CutoverAndArchiveTimeZoneMode,
                options.LogFileArchiveTime,
                FileLoggerOptions.DefaultLogFileArchiveTime);

            return(new LogFileManagementSchedule(NextArchiveUtc, TimeUntilNextArchiveUtc, NextCutoverUtc));
        }
示例#4
0
        private void LogMessageProcessingThreadBody(object?state)
        {
            WaitHandle[] Handles = new WaitHandle[] { _StopHandle, _ArchiveNowHandle, _MessageReadyHandle };

            while (true)
            {
                int HandleIndex = WaitHandle.WaitAny(Handles);
                if (HandleIndex == 0)
                {
                    break;
                }
                if (HandleIndex == 1)
                {
                    _Timer?.Dispose();

                    FileLoggerOptions Options = _Options.CurrentValue;

                    if (_Timer != null || Options.ArchiveLogFilesOnStartup)
                    {
                        _LogFileManager.ArchiveLogFiles(_ApplicationName !, Options, _LogFileNamePattern !);
                    }

                    _ManagementSchedule = LogFileManagementSchedule.Build(s_DefaultSystemTime, Options);

                    _Timer = new Timer(
                        (s) => _ArchiveNowHandle.Set(),
                        state: null,
                        _ManagementSchedule.TimeUntilNextArchiveUtc,
                        TimeSpan.FromMilliseconds(-1));
                    _ArchiveNowHandle.Reset();
                    continue;
                }

                DrainMessages(archiveLogFiles: true);
            }

            // When exiting make sure anything remaining in the queue is pumped to files.
            DrainMessages(archiveLogFiles: false);
        }