From 7b4969ce0d7cf32a77e368da6f18010498e9f4d3 Mon Sep 17 00:00:00 2001 From: Alexander Kislitsyn <4lex.kislitsyn@gmail.com> Date: Fri, 22 May 2020 08:19:42 +0300 Subject: [PATCH] Removed string builder from logger. Added support of IOptions. --- .../LoggingBuilderExtensions.cs | 27 ++++++++++++++----- .../Notepad.Extensions.Logging.csproj | 1 + Notepad.Extensions.Logging/NotepadLogger.cs | 10 +++---- .../NotepadLoggerOptions.cs | 14 ++++++++++ .../NotepadLoggerProvider.cs | 27 +++++++++++++++---- .../NotepadProviderOptions.cs | 21 --------------- 6 files changed, 61 insertions(+), 39 deletions(-) create mode 100644 Notepad.Extensions.Logging/NotepadLoggerOptions.cs delete mode 100644 Notepad.Extensions.Logging/NotepadProviderOptions.cs diff --git a/Notepad.Extensions.Logging/LoggingBuilderExtensions.cs b/Notepad.Extensions.Logging/LoggingBuilderExtensions.cs index 6ec155c..54a242c 100644 --- a/Notepad.Extensions.Logging/LoggingBuilderExtensions.cs +++ b/Notepad.Extensions.Logging/LoggingBuilderExtensions.cs @@ -1,17 +1,30 @@ -using System; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Logging.Configuration; +using Microsoft.Extensions.Options; +using System; namespace Microsoft.Extensions.Logging { public static class LoggingBuilderExtensions { public static ILoggingBuilder AddNotepad(this ILoggingBuilder builder) - => AddNotepad(builder, null); - - public static ILoggingBuilder AddNotepad(this ILoggingBuilder builder, Action optionsConfiguration) { - var options = NotepadProviderOptions.Default; - optionsConfiguration?.Invoke(options); - builder.AddProvider(new NotepadLoggerProvider(options)); + builder.AddConfiguration(); + + builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton()); + LoggerProviderOptions.RegisterProviderOptions(builder.Services); + return builder; + } + + public static ILoggingBuilder AddNotepad(this ILoggingBuilder builder, Action configure) + { + if (configure == null) + { + throw new ArgumentNullException(nameof(configure)); + } + AddNotepad(builder); + builder.Services.Configure(configure); return builder; } } diff --git a/Notepad.Extensions.Logging/Notepad.Extensions.Logging.csproj b/Notepad.Extensions.Logging/Notepad.Extensions.Logging.csproj index 6249221..b7eefed 100644 --- a/Notepad.Extensions.Logging/Notepad.Extensions.Logging.csproj +++ b/Notepad.Extensions.Logging/Notepad.Extensions.Logging.csproj @@ -14,6 +14,7 @@ + diff --git a/Notepad.Extensions.Logging/NotepadLogger.cs b/Notepad.Extensions.Logging/NotepadLogger.cs index c0a0d6c..228046b 100644 --- a/Notepad.Extensions.Logging/NotepadLogger.cs +++ b/Notepad.Extensions.Logging/NotepadLogger.cs @@ -11,12 +11,14 @@ namespace Microsoft.Extensions.Logging { this.stringBuilderPool = stringBuilderPool; this.categoryName = categoryName; - this.windowName = windowName ?? throw new ArgumentNullException("Window name cannot be null."); + this.windowName = windowName ?? throw new ArgumentNullException(nameof(windowName)); + this.changedWindowName = $"*{windowName}"; } readonly ObjectPool stringBuilderPool; readonly string categoryName; readonly string windowName; + readonly string changedWindowName; public IDisposable BeginScope(TState state) => NullDisposable.Instance; @@ -104,11 +106,7 @@ namespace Microsoft.Extensions.Logging hwnd = NativeMethods.FindWindow(null, windowName); if (hwnd.Equals(IntPtr.Zero)) { - // when the file changes, notepad changes the name to "* Window Name", so later created loggers cannot find window - var builder = stringBuilderPool.Get(); - builder.Append("*").Append(windowName); - hwnd = NativeMethods.FindWindow(null, builder.ToString()); - stringBuilderPool.Return(builder); + hwnd = NativeMethods.FindWindow(null, changedWindowName); } return hwnd; } diff --git a/Notepad.Extensions.Logging/NotepadLoggerOptions.cs b/Notepad.Extensions.Logging/NotepadLoggerOptions.cs new file mode 100644 index 0000000..8894945 --- /dev/null +++ b/Notepad.Extensions.Logging/NotepadLoggerOptions.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Microsoft.Extensions.Logging +{ + public class NotepadLoggerOptions + { + /// + /// Name of window to search. + /// + public string WindowName { get; set; } = "Untitled - Notepad"; + } +} diff --git a/Notepad.Extensions.Logging/NotepadLoggerProvider.cs b/Notepad.Extensions.Logging/NotepadLoggerProvider.cs index b56734b..f291622 100644 --- a/Notepad.Extensions.Logging/NotepadLoggerProvider.cs +++ b/Notepad.Extensions.Logging/NotepadLoggerProvider.cs @@ -1,28 +1,45 @@ -using System.Text; +using System; +using System.Text; using Microsoft.Extensions.ObjectPool; +using Microsoft.Extensions.Options; namespace Microsoft.Extensions.Logging { + [ProviderAlias("Notepad")] class NotepadLoggerProvider : ILoggerProvider { + readonly ObjectPool stringBuilderPool; + readonly IDisposable optionsReloadToken; + NotepadLoggerOptions options; + NotepadLoggerProvider() { var poolProvider = new DefaultObjectPoolProvider(); stringBuilderPool = poolProvider.CreateStringBuilderPool(); } - internal NotepadLoggerProvider(NotepadProviderOptions options) : this() + public NotepadLoggerProvider(IOptionsMonitor options) : this() + { + // Filter would be applied on LoggerFactory level + optionsReloadToken = options.OnChange(ReloadLoggerOptions); + ReloadLoggerOptions(options.CurrentValue); + } + + public NotepadLoggerProvider(NotepadLoggerOptions options) : this() { this.options = options; } - readonly ObjectPool stringBuilderPool; - readonly NotepadProviderOptions options; - public ILogger CreateLogger(string categoryName) => new NotepadLogger(stringBuilderPool, categoryName, options.WindowName); public void Dispose() { + optionsReloadToken?.Dispose(); + } + + private void ReloadLoggerOptions(NotepadLoggerOptions options) + { + this.options = options; } } } diff --git a/Notepad.Extensions.Logging/NotepadProviderOptions.cs b/Notepad.Extensions.Logging/NotepadProviderOptions.cs deleted file mode 100644 index 8de59d5..0000000 --- a/Notepad.Extensions.Logging/NotepadProviderOptions.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Microsoft.Extensions.Logging -{ - public class NotepadProviderOptions - { - /// - /// Default options for . - /// - public static NotepadProviderOptions Default { get; } = new NotepadProviderOptions - { - WindowName = "Untitled - Notepad", - }; - /// - /// Name of window to search. - /// - public string WindowName { get; set; } - } -}