mirror of
https://github.com/yaakov-h/Notepad.Extensions.Logging.git
synced 2024-11-22 11:14:50 +00:00
Removed string builder from logger. Added support of IOptions.
This commit is contained in:
parent
ed95e98a27
commit
7b4969ce0d
6 changed files with 61 additions and 39 deletions
|
@ -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
|
namespace Microsoft.Extensions.Logging
|
||||||
{
|
{
|
||||||
public static class LoggingBuilderExtensions
|
public static class LoggingBuilderExtensions
|
||||||
{
|
{
|
||||||
public static ILoggingBuilder AddNotepad(this ILoggingBuilder builder)
|
public static ILoggingBuilder AddNotepad(this ILoggingBuilder builder)
|
||||||
=> AddNotepad(builder, null);
|
|
||||||
|
|
||||||
public static ILoggingBuilder AddNotepad(this ILoggingBuilder builder, Action<NotepadProviderOptions> optionsConfiguration)
|
|
||||||
{
|
{
|
||||||
var options = NotepadProviderOptions.Default;
|
builder.AddConfiguration();
|
||||||
optionsConfiguration?.Invoke(options);
|
|
||||||
builder.AddProvider(new NotepadLoggerProvider(options));
|
builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<ILoggerProvider, NotepadLoggerProvider>());
|
||||||
|
LoggerProviderOptions.RegisterProviderOptions<NotepadLoggerOptions, NotepadLoggerProvider>(builder.Services);
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ILoggingBuilder AddNotepad(this ILoggingBuilder builder, Action<NotepadLoggerOptions> configure)
|
||||||
|
{
|
||||||
|
if (configure == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(configure));
|
||||||
|
}
|
||||||
|
AddNotepad(builder);
|
||||||
|
builder.Services.Configure(configure);
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.4" />
|
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.4" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Logging.Configuration" Version="3.1.4" />
|
||||||
<PackageReference Include="Microsoft.Extensions.ObjectPool" Version="3.1.4" />
|
<PackageReference Include="Microsoft.Extensions.ObjectPool" Version="3.1.4" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
|
@ -11,12 +11,14 @@ namespace Microsoft.Extensions.Logging
|
||||||
{
|
{
|
||||||
this.stringBuilderPool = stringBuilderPool;
|
this.stringBuilderPool = stringBuilderPool;
|
||||||
this.categoryName = categoryName;
|
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<StringBuilder> stringBuilderPool;
|
readonly ObjectPool<StringBuilder> stringBuilderPool;
|
||||||
readonly string categoryName;
|
readonly string categoryName;
|
||||||
readonly string windowName;
|
readonly string windowName;
|
||||||
|
readonly string changedWindowName;
|
||||||
|
|
||||||
public IDisposable BeginScope<TState>(TState state) => NullDisposable.Instance;
|
public IDisposable BeginScope<TState>(TState state) => NullDisposable.Instance;
|
||||||
|
|
||||||
|
@ -104,11 +106,7 @@ namespace Microsoft.Extensions.Logging
|
||||||
hwnd = NativeMethods.FindWindow(null, windowName);
|
hwnd = NativeMethods.FindWindow(null, windowName);
|
||||||
if (hwnd.Equals(IntPtr.Zero))
|
if (hwnd.Equals(IntPtr.Zero))
|
||||||
{
|
{
|
||||||
// when the file changes, notepad changes the name to "* Window Name", so later created loggers cannot find window
|
hwnd = NativeMethods.FindWindow(null, changedWindowName);
|
||||||
var builder = stringBuilderPool.Get();
|
|
||||||
builder.Append("*").Append(windowName);
|
|
||||||
hwnd = NativeMethods.FindWindow(null, builder.ToString());
|
|
||||||
stringBuilderPool.Return(builder);
|
|
||||||
}
|
}
|
||||||
return hwnd;
|
return hwnd;
|
||||||
}
|
}
|
||||||
|
|
14
Notepad.Extensions.Logging/NotepadLoggerOptions.cs
Normal file
14
Notepad.Extensions.Logging/NotepadLoggerOptions.cs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Microsoft.Extensions.Logging
|
||||||
|
{
|
||||||
|
public class NotepadLoggerOptions
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Name of window to search.
|
||||||
|
/// </summary>
|
||||||
|
public string WindowName { get; set; } = "Untitled - Notepad";
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,28 +1,45 @@
|
||||||
using System.Text;
|
using System;
|
||||||
|
using System.Text;
|
||||||
using Microsoft.Extensions.ObjectPool;
|
using Microsoft.Extensions.ObjectPool;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
|
||||||
namespace Microsoft.Extensions.Logging
|
namespace Microsoft.Extensions.Logging
|
||||||
{
|
{
|
||||||
|
[ProviderAlias("Notepad")]
|
||||||
class NotepadLoggerProvider : ILoggerProvider
|
class NotepadLoggerProvider : ILoggerProvider
|
||||||
{
|
{
|
||||||
|
readonly ObjectPool<StringBuilder> stringBuilderPool;
|
||||||
|
readonly IDisposable optionsReloadToken;
|
||||||
|
NotepadLoggerOptions options;
|
||||||
|
|
||||||
NotepadLoggerProvider()
|
NotepadLoggerProvider()
|
||||||
{
|
{
|
||||||
var poolProvider = new DefaultObjectPoolProvider();
|
var poolProvider = new DefaultObjectPoolProvider();
|
||||||
stringBuilderPool = poolProvider.CreateStringBuilderPool();
|
stringBuilderPool = poolProvider.CreateStringBuilderPool();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal NotepadLoggerProvider(NotepadProviderOptions options) : this()
|
public NotepadLoggerProvider(IOptionsMonitor<NotepadLoggerOptions> options) : this()
|
||||||
|
{
|
||||||
|
// Filter would be applied on LoggerFactory level
|
||||||
|
optionsReloadToken = options.OnChange(ReloadLoggerOptions);
|
||||||
|
ReloadLoggerOptions(options.CurrentValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public NotepadLoggerProvider(NotepadLoggerOptions options) : this()
|
||||||
{
|
{
|
||||||
this.options = options;
|
this.options = options;
|
||||||
}
|
}
|
||||||
|
|
||||||
readonly ObjectPool<StringBuilder> stringBuilderPool;
|
|
||||||
readonly NotepadProviderOptions options;
|
|
||||||
|
|
||||||
public ILogger CreateLogger(string categoryName) => new NotepadLogger(stringBuilderPool, categoryName, options.WindowName);
|
public ILogger CreateLogger(string categoryName) => new NotepadLogger(stringBuilderPool, categoryName, options.WindowName);
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
optionsReloadToken?.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ReloadLoggerOptions(NotepadLoggerOptions options)
|
||||||
|
{
|
||||||
|
this.options = options;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace Microsoft.Extensions.Logging
|
|
||||||
{
|
|
||||||
public class NotepadProviderOptions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Default options for <see cref="NotepadLoggerProvider"/>.
|
|
||||||
/// </summary>
|
|
||||||
public static NotepadProviderOptions Default { get; } = new NotepadProviderOptions
|
|
||||||
{
|
|
||||||
WindowName = "Untitled - Notepad",
|
|
||||||
};
|
|
||||||
/// <summary>
|
|
||||||
/// Name of window to search.
|
|
||||||
/// </summary>
|
|
||||||
public string WindowName { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue