Skip to content

Instantly share code, notes, and snippets.

@Platonenkov
Created May 25, 2022 08:03
Show Gist options
  • Save Platonenkov/9851f3a80b3ddb140e25ea26e626c492 to your computer and use it in GitHub Desktop.
Save Platonenkov/9851f3a80b3ddb140e25ea26e626c492 to your computer and use it in GitHub Desktop.
Log4Net -элементарная настройка
<?xml version="1.0" encoding="utf-8"?>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d [%t] - %m%n%n" />
<!--<conversionPattern value="%d [%t] %-5l - %m%n%n" />-->
</layout>
</appender>
<appender name="RollingFileAppender"
type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString"
value="Logs/%date{yyyy}/%date{MM}/%date{dd}/LogInfo.log" />
<appendToFile value="true" />
<maximumFileSize value="50MB" />
<maxSizeRollBackups value="-1" />
<RollingStyle value="Composite" />
<StaticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5p [%d] [%F] [%C.%M] %m%n"/>
</layout>
</appender>
<root>
<!-- Value of priority may be ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF -->
<priority value="ALL" />
<!--OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL-->
<!--<level value="INFO"/>-->
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>
using System.IO;
using System.Reflection;
using Microsoft.Extensions.Logging;
namespace RRJ_Express.Utilities.Logger
{
public static class Log4NetExtensions
{
//Тут указываем путь куда положили файл настроек логгера
public static ILoggerFactory AddLog4Net(this ILoggerFactory Factory, string ConfigurationFile = "Logger\\log4net.config")
{
if (!Path.IsPathRooted(ConfigurationFile))
{
var assembly = Assembly.GetEntryAssembly();
var dir = Path.GetDirectoryName(assembly.Location);
ConfigurationFile = Path.Combine(dir, ConfigurationFile);
}
Factory.AddProvider(new Log4NetLoggerProvider(ConfigurationFile));
return Factory;
}
}
}
using System;
using System.Reflection;
using System.Xml;
using log4net;
using Microsoft.Extensions.Logging;
namespace RRJ_Express.Utilities.Logger
{
public class Log4NetLogger : ILogger
{
private readonly ILog _log;
public Log4NetLogger(string categoryName, XmlElement xml)
{
var repository = LogManager.CreateRepository(
Assembly.GetEntryAssembly(),
typeof(log4net.Repository.Hierarchy.Hierarchy));
_log = LogManager.GetLogger(repository.Name, categoryName);
log4net.Config.XmlConfigurator.Configure(repository, xml);
}
#region Implementation of ILogger
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
if (!IsEnabled(logLevel)) return;
if (formatter is null) throw new ArgumentNullException(nameof(formatter));
var msg = formatter(state, exception);
if (string.IsNullOrWhiteSpace(msg) && exception is null) return;
switch (logLevel)
{
default: throw new ArgumentOutOfRangeException(nameof(logLevel), logLevel, null);
case LogLevel.Trace:
case LogLevel.Debug:
_log.Debug(msg);
break;
case LogLevel.Information:
_log.Info(msg);
break;
case LogLevel.Warning:
_log.Warn(msg);
break;
case LogLevel.Error:
_log.Error(msg ?? exception.ToString());
break;
case LogLevel.Critical:
_log.Debug(msg ?? exception.ToString());
break;
case LogLevel.None: break;
}
}
public bool IsEnabled(LogLevel logLevel)
{
switch (logLevel)
{
default: throw new ArgumentOutOfRangeException(nameof(logLevel), logLevel, null);
case LogLevel.Trace:
case LogLevel.Debug:
return _log.IsDebugEnabled;
case LogLevel.Information: return _log.IsInfoEnabled;
case LogLevel.Warning: return _log.IsWarnEnabled;
case LogLevel.Error: return _log.IsErrorEnabled;
case LogLevel.Critical: return _log.IsFatalEnabled;
case LogLevel.None: return false;
}
}
public IDisposable BeginScope<TState>(TState state) => null;
#endregion
}
}
using System.Collections.Concurrent;
using System.Xml;
using Microsoft.Extensions.Logging;
namespace RRJ_Express.Utilities.Logger;
public class Log4NetLoggerProvider : ILoggerProvider
{
private readonly string _ConfigurationFile;
private readonly ConcurrentDictionary<string, Log4NetLogger> _Logger = new ConcurrentDictionary<string, Log4NetLogger>();
public Log4NetLoggerProvider(string ConfigurationFile) { _ConfigurationFile = ConfigurationFile; }
#region Implementation of IDisposable
public void Dispose() => _Logger.Clear();
public ILogger CreateLogger(string categoryName)
{
return _Logger.GetOrAdd(
categoryName, category =>
{
var xml = new XmlDocument();
var file_name = _ConfigurationFile;
xml.Load(file_name);
return new Log4NetLogger(category, xml["log4net"]);
});
}
#endregion
}

Пакеты:

  <ItemGroup>
    <PackageReference Include="log4net" Version="2.0.14" />
    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.1" />
  </ItemGroup>

Объявление:

  public static ILog Logger;

Инициализация:

  var logger = Services.GetRequiredService<ILoggerFactory>();
  logger.AddLog4Net();
  Logger = LogManager.GetLogger(typeof(App));

Вызов:

  Logger.Info("Test Info");
  Logger.Error("Test Error");
  Logger.Warn("Test Warn");

Настройка вида строки в записи:

  <conversionPattern value="%-5p [%d] [%F] [%C.%M] %m%n"/>

где:

%p — Тип события лога (DEBUG, ERROR и т.д.)
%d — Дата и время, когда логгирующая функция была вызвана. Можно задавать различные форматы вывода даты и времени. К примеру, %d{HH:mm:ss,SSS} отображает только время
%C — Имя класса, в котором была вызвана какая-либо функция лога
%M — Имя метода
%m — Собственно, сообщение в лог
%F — Имя файла
%l — Номер строки
%r — Количество миллисекунд, прошедших с начала работы программы
%t — Имя потока
%n — Переход на новую строку
%% — Символ "%"

больше инфы по ссылке: https://ru.wikipedia.org/wiki/Apache_log4net http://megadarja.blogspot.com/2008/04/log4net.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment