Ejemplo n.º 1
0
        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);
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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));
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
 protected virtual LogFileInfo CreateLogFile(ILogFileSettings fileSettings, IFileLoggerSettings settings)
 {
     return(new LogFileInfo(this, fileSettings, settings));
 }