Log4NetProvider.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using log4net;
  2. using log4net.Config;
  3. using Microsoft.Extensions.Logging;
  4. using System.Collections.Concurrent;
  5. namespace Esim.SendMail.Logging;
  6. public class Log4NetProvider : ILoggerProvider
  7. {
  8. private readonly ConcurrentDictionary<string, Log4NetLogger> _loggers = new();
  9. public Log4NetProvider() { }
  10. public ILogger CreateLogger(string categoryName)
  11. {
  12. return _loggers.GetOrAdd(categoryName, name => new Log4NetLogger(name));
  13. }
  14. public void Dispose()
  15. {
  16. _loggers.Clear();
  17. }
  18. }
  19. public class Log4NetLogger : ILogger
  20. {
  21. private readonly ILog _log;
  22. public Log4NetLogger(string categoryName)
  23. {
  24. _log = LogManager.GetLogger(typeof(Log4NetProvider).Assembly, categoryName);
  25. }
  26. public IDisposable? BeginScope<TState>(TState state) where TState : notnull => null;
  27. public bool IsEnabled(LogLevel logLevel)
  28. {
  29. return logLevel switch
  30. {
  31. LogLevel.Critical => _log.IsFatalEnabled,
  32. LogLevel.Error => _log.IsErrorEnabled,
  33. LogLevel.Warning => _log.IsWarnEnabled,
  34. LogLevel.Information => _log.IsInfoEnabled,
  35. LogLevel.Debug => _log.IsDebugEnabled,
  36. LogLevel.Trace => _log.IsDebugEnabled,
  37. _ => false
  38. };
  39. }
  40. public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter)
  41. {
  42. if (!IsEnabled(logLevel)) return;
  43. var message = formatter(state, exception);
  44. if (string.IsNullOrEmpty(message) && exception == null) return;
  45. switch (logLevel)
  46. {
  47. case LogLevel.Critical: _log.Fatal(message, exception); break;
  48. case LogLevel.Error: _log.Error(message, exception); break;
  49. case LogLevel.Warning: _log.Warn(message, exception); break;
  50. case LogLevel.Information: _log.Info(message, exception); break;
  51. case LogLevel.Debug: _log.Debug(message, exception); break;
  52. case LogLevel.Trace: _log.Debug(message, exception); break;
  53. }
  54. }
  55. }
  56. public static class Log4NetExtensions
  57. {
  58. public static ILoggingBuilder AddLog4Net(this ILoggingBuilder builder, string configPath)
  59. {
  60. XmlConfigurator.Configure(new FileInfo(configPath));
  61. builder.AddProvider(new Log4NetProvider());
  62. return builder;
  63. }
  64. }