public FileLoggerProcessor(IFileLoggerContext context, IFileLoggerSettingsBase settings) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (settings == null) { throw new ArgumentNullException(nameof(settings)); } #pragma warning disable CS0618 // Type or member is obsolete var physicalFileProvider = context.FileProvider == null ? null : context.FileProvider as PhysicalFileProvider ?? #pragma warning restore CS0618 // Type or member is obsolete throw new ArgumentException($"File provider must be {nameof(PhysicalFileProvider)}", nameof(context)); _fallbackFileAppender = physicalFileProvider != null ? new Lazy <PhysicalFileAppender>(() => new PhysicalFileAppender(physicalFileProvider)) : new Lazy <PhysicalFileAppender>(() => new PhysicalFileAppender(Environment.CurrentDirectory)); Context = context; Settings = settings.Freeze(); _logFiles = new Dictionary <string, LogFileInfo>(); _shutdownTokenSource = new CancellationTokenSource(); _completeTokenRegistration = context.CompleteToken.Register(Complete, useSynchronizationContext: false); }
async Task CompleteCoreAsync(IFileLoggerSettingsBase newSettings) { CancellationTokenSource shutdownTokenSource; Task[] completionTasks; lock (_logFiles) { if (_isDisposed) { throw new ObjectDisposedException(nameof(FileLoggerProcessor)); } shutdownTokenSource = _shutdownTokenSource; _shutdownTokenSource = new CancellationTokenSource(); completionTasks = _logFiles.Values.Select(lf => { lf.Queue.Complete(); return(lf.Queue.Completion); }).ToArray(); _logFiles.Clear(); if (newSettings != null) { Settings = newSettings.Freeze(); } } await Task.WhenAny(Task.WhenAll(completionTasks), Task.Delay(Context.CompletionTimeout)).ConfigureAwait(false); shutdownTokenSource.Cancel(); shutdownTokenSource.Dispose(); }
protected FileLoggerProvider(IFileLoggerContext context, IFileLoggerSettingsBase settings) { if (settings == null) { throw new ArgumentNullException(nameof(settings)); } Context = context ?? FileLoggerContext.Default; Settings = settings.Freeze(); Processor = CreateProcessor(Settings); _loggers = new Dictionary <string, FileLogger>(); }
bool HandleSettingsChangedCore(IFileLoggerSettingsBase settings) { lock (_loggers) { if (_isDisposed) { return(false); } Settings = settings.Freeze(); var scopeProvider = GetScopeProvider(); foreach (var logger in _loggers.Values) { logger.Update(GetFallbackFileName(logger.CategoryName), Settings, scopeProvider); } // we must try to wait for the current queues to complete to avoid concurrent file I/O ResetProcessor(Settings); } return(true); }