예제 #1
0
        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);
        }
예제 #2
0
        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();
        }
예제 #3
0
        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>();
        }
예제 #4
0
        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);
        }