Skip to content

Instantly share code, notes, and snippets.

@mattwcole
Created June 28, 2019 20:26
Show Gist options
  • Save mattwcole/895f5a4b6ad3abace77ff23ab826d135 to your computer and use it in GitHub Desktop.
Save mattwcole/895f5a4b6ad3abace77ff23ab826d135 to your computer and use it in GitHub Desktop.
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Configuration;
using Microsoft.Extensions.Options;
namespace Gelf.Extensions.Logging.Samples.AspNetCore2
{
public class LoggerDecorator : ILogger
{
private readonly ILogger _logger;
public LoggerDecorator(ILogger logger)
{
_logger = logger;
}
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
var additionalFields = new Dictionary<string, object>(2)
{
["log_level"] = logLevel.ToString()
};
if (state is IEnumerable<KeyValuePair<string, object>> logValues)
{
additionalFields["message_template"] = logValues.Last().Value;
}
using (_logger.BeginScope(additionalFields))
{
_logger.Log(logLevel, eventId, state, exception, formatter);
}
}
public bool IsEnabled(LogLevel logLevel)
{
return _logger.IsEnabled(logLevel);
}
public IDisposable BeginScope<TState>(TState state)
{
return _logger.BeginScope(state);
}
}
[ProviderAlias("GELF")]
public class GelfLoggerProviderDecorator : ILoggerProvider
{
private readonly GelfLoggerProvider _loggerProvider;
public GelfLoggerProviderDecorator(GelfLoggerProvider loggerProvider)
{
_loggerProvider = loggerProvider;
}
public ILogger CreateLogger(string categoryName)
{
var logger = _loggerProvider.CreateLogger(categoryName);
return new LoggerDecorator(logger);
}
public void Dispose()
{
_loggerProvider.Dispose();
}
}
public static class LoggerBuilderExtensions
{
public static ILoggingBuilder AddDecoratedGelf(this ILoggingBuilder builder, Action<GelfLoggerOptions> configure)
{
builder.AddConfiguration();
builder.Services.AddSingleton<GelfLoggerProvider>();
builder.Services.AddSingleton<ILoggerProvider, GelfLoggerProviderDecorator>();
builder.Services.TryAddSingleton<IConfigureOptions<GelfLoggerOptions>, GelfLoggerOptionsSetup>();
builder.Services.Configure(configure);
return builder;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment