protected virtual LogFileInfo CreateLogFile(ILogFileSettings fileSettings, IFileLoggerSettings settings) { LogFileInfo logFile = CreateLogFile(); logFile.BasePath = settings.BasePath ?? string.Empty; logFile.PathFormat = fileSettings.Path; logFile.FileAppender = settings.FileAppender ?? _fallbackFileAppender.Value; logFile.AccessMode = fileSettings.FileAccessMode ?? settings.FileAccessMode ?? LogFileAccessMode.Default; logFile.Encoding = fileSettings.FileEncoding ?? settings.FileEncoding ?? Encoding.UTF8; logFile.DateFormat = fileSettings.DateFormat ?? settings.DateFormat ?? "yyyyMMdd"; logFile.CounterFormat = fileSettings.CounterFormat ?? settings.CounterFormat; logFile.MaxSize = fileSettings.MaxFileSize ?? settings.MaxFileSize ?? 0; var maxQueueSize = fileSettings.MaxQueueSize ?? settings.MaxQueueSize ?? 0; logFile.Queue = maxQueueSize > 0 ? Channel.CreateBounded <FileLogEntry>(ConfigureChannelOptions(new BoundedChannelOptions(maxQueueSize) { FullMode = BoundedChannelFullMode.DropWrite })) : Channel.CreateUnbounded <FileLogEntry>(ConfigureChannelOptions(new UnboundedChannelOptions())); // important: closure must pick up the current token! CancellationToken forcedCompleteToken = _forcedCompleteTokenSource.Token; logFile.WriteFileTask = Task.Run(() => WriteFileAsync(logFile, forcedCompleteToken)); return(logFile);
protected virtual LogFileInfo CreateLogFile(ILogFileSettings fileSettings, IFileLoggerSettings settings) { LogFileInfo logFile = CreateLogFile(); logFile.BasePath = settings.BasePath ?? string.Empty; logFile.PathFormat = fileSettings.Path; logFile.FileAppender = settings.FileAppender ?? _fallbackFileAppender.Value; logFile.AccessMode = fileSettings.FileAccessMode ?? settings.FileAccessMode ?? LogFileAccessMode.Default; logFile.Encoding = fileSettings.FileEncoding ?? settings.FileEncoding ?? Encoding.UTF8; logFile.DateFormat = fileSettings.DateFormat ?? settings.DateFormat ?? "yyyyMMdd"; logFile.CounterFormat = fileSettings.CounterFormat ?? settings.CounterFormat; logFile.MaxSize = fileSettings.MaxFileSize ?? settings.MaxFileSize ?? 0; // important: closure must pick up the current token! CancellationToken forcedCompleteToken = _forcedCompleteTokenSource.Token; logFile.Queue = new ActionBlock <FileLogEntry>( e => WriteEntryAsync(logFile, e, forcedCompleteToken), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 1, BoundedCapacity = fileSettings.MaxQueueSize ?? settings.MaxQueueSize ?? -1, }); return(logFile); }
protected virtual Channel <FileLogEntry> CreateLogFileQueue(ILogFileSettings fileSettings, IFileLoggerSettings settings) { var maxQueueSize = fileSettings.MaxQueueSize ?? settings.MaxQueueSize ?? 0; return (maxQueueSize > 0 ? Channel.CreateBounded <FileLogEntry>(ConfigureChannelOptions(new BoundedChannelOptions(maxQueueSize) { FullMode = BoundedChannelFullMode.DropWrite })) : Channel.CreateUnbounded <FileLogEntry>(ConfigureChannelOptions(new UnboundedChannelOptions())));
public LogFileInfo(FileLoggerProcessor processor, ILogFileSettings fileSettings, IFileLoggerSettings settings) { BasePath = settings.BasePath ?? string.Empty; PathFormat = fileSettings.Path; PathPlaceholderResolver = GetActualPathPlaceholderResolver(fileSettings.PathPlaceholderResolver ?? settings.PathPlaceholderResolver); FileAppender = settings.FileAppender ?? processor._fallbackFileAppender.Value; AccessMode = fileSettings.FileAccessMode ?? settings.FileAccessMode ?? LogFileAccessMode.Default; Encoding = fileSettings.FileEncoding ?? settings.FileEncoding ?? Encoding.UTF8; DateFormat = fileSettings.DateFormat ?? settings.DateFormat ?? "yyyyMMdd"; CounterFormat = fileSettings.CounterFormat ?? settings.CounterFormat; MaxSize = fileSettings.MaxFileSize ?? settings.MaxFileSize ?? 0; Queue = processor.CreateLogFileQueue(fileSettings, settings); // important: closure must pick up the current token! CancellationToken forcedCompleteToken = processor._forcedCompleteTokenSource.Token; WriteFileTask = Task.Run(() => processor.WriteFileAsync(this, forcedCompleteToken));
public void Enqueue(FileLogEntry entry, ILogFileSettings fileSettings, IFileLoggerSettings settings) { LogFileInfo logFile; lock (_logFiles) { if (_status == Status.Completed) { throw new ObjectDisposedException(nameof(FileLoggerProcessor)); } if (_status != Status.Running) { return; } if (!_logFiles.TryGetValue(fileSettings, out logFile)) { _logFiles.Add(fileSettings, logFile = CreateLogFile(fileSettings, settings)); } } logFile.Queue.Post(entry); }
public void ParsingOptions() { var configJson = $@"{{ ""{nameof(FileLoggerOptions.RootPath)}"": ""{Path.DirectorySeparatorChar.ToString().Replace(@"\", @"\\")}"", ""{nameof(FileLoggerOptions.BasePath)}"": ""Logs"", ""{nameof(FileLoggerOptions.FileAccessMode)}"": ""{LogFileAccessMode.OpenTemporarily}"", ""{nameof(FileLoggerOptions.FileEncodingName)}"": ""utf-8"", ""{nameof(FileLoggerOptions.Files)}"": [ {{ ""{nameof(LogFileOptions.Path)}"": ""logger.log"", ""{nameof(LogFileOptions.MinLevel)}"": {{ ""Karambolo.Extensions.Logging.File"": ""{LogLevel.Warning}"", ""{LogFileOptions.DefaultCategoryName}"": ""{LogLevel.None}"", }}, }}, {{ ""{nameof(LogFileOptions.Path)}"": ""test.log"", ""{nameof(LogFileOptions.MinLevel)}"": {{ ""Karambolo.Extensions.Logging.File.Test"": ""{LogLevel.Debug}"", ""{LogFileOptions.DefaultCategoryName}"": ""{LogLevel.None}"", }}, }}], ""{nameof(FileLoggerOptions.DateFormat)}"": ""yyyyMMdd"", ""{nameof(FileLoggerOptions.CounterFormat)}"": ""000"", ""{nameof(FileLoggerOptions.MaxFileSize)}"": 10, ""{nameof(FileLoggerOptions.TextBuilderType)}"": ""{typeof(CustomLogEntryTextBuilder).AssemblyQualifiedName}"", ""{nameof(FileLoggerOptions.IncludeScopes)}"": true, ""{nameof(FileLoggerOptions.MaxQueueSize)}"": 100, }}"; var fileProvider = new MemoryFileProvider(); fileProvider.CreateFile("config.json", configJson); var cb = new ConfigurationBuilder(); cb.AddJsonFile(fileProvider, "config.json", optional: false, reloadOnChange: false); IConfigurationRoot config = cb.Build(); var services = new ServiceCollection(); services.AddOptions(); services.Configure <FileLoggerOptions>(config); ServiceProvider serviceProvider = services.BuildServiceProvider(); IFileLoggerSettings settings = serviceProvider.GetService <IOptions <FileLoggerOptions> >().Value; Assert.True(settings.FileAppender is PhysicalFileAppender); Assert.Equal(Path.GetPathRoot(Environment.CurrentDirectory), ((PhysicalFileAppender)settings.FileAppender).FileProvider.Root); Assert.Equal("Logs", settings.BasePath); Assert.Equal(LogFileAccessMode.OpenTemporarily, settings.FileAccessMode); Assert.Equal(Encoding.UTF8, settings.FileEncoding); Assert.Equal(2, settings.Files.Length); ILogFileSettings fileSettings = Array.Find(settings.Files, f => f.Path == "logger.log"); Assert.NotNull(fileSettings); Assert.Equal(LogLevel.None, fileSettings.GetMinLevel(typeof(string).ToString())); Assert.Equal(LogLevel.Warning, fileSettings.GetMinLevel(typeof(FileLogger).ToString())); Assert.Equal(LogLevel.Warning, fileSettings.GetMinLevel(typeof(SettingsTest).ToString())); fileSettings = Array.Find(settings.Files, f => f.Path == "test.log"); Assert.NotNull(fileSettings); Assert.Equal(LogLevel.None, fileSettings.GetMinLevel(typeof(string).ToString())); Assert.Equal(LogLevel.None, fileSettings.GetMinLevel(typeof(FileLogger).ToString())); Assert.Equal(LogLevel.Debug, fileSettings.GetMinLevel(typeof(SettingsTest).ToString())); Assert.Equal("yyyyMMdd", settings.DateFormat); Assert.Equal("000", settings.CounterFormat); Assert.Equal(10, settings.MaxFileSize); Assert.Equal(typeof(CustomLogEntryTextBuilder), settings.TextBuilder.GetType()); Assert.True(settings.IncludeScopes); Assert.Equal(100, settings.MaxQueueSize); }
protected virtual LogFileInfo CreateLogFile(ILogFileSettings fileSettings, IFileLoggerSettings settings) { return(new LogFileInfo(this, fileSettings, settings)); }