Есть ли шаблон log4net для machineName
Мне трудно найти документацию по различным шаблонам "в коробке", таким как
%logger
%level
%timestamp
Конечно, есть страница примера, но я не уверен, что это полный список опций.
Я также знаю, что можно передавать параметры MDC из приложения в регистратор, но это включает в себя изменение кода, которое отличается от изменения конфигурации.
Есть ли %machineName
вариант или machineIP
вариант? Проблема заключается в том, что все наши серверы в веб-ферме регистрируются в одном и том же журнале базы данных, и теперь мы думаем, что непропорциональное количество сообщений поступает с одного компьютера.
6 ответов
То, что я только что наткнулся на это
<layout type="log4net.Layout.PatternLayout" value="${COMPUTERNAME}"/>
и это, кажется, работает - интересно, какая разница между этим и другими предлагаемыми вариантами. лайк %property{log4net:HostName}
Создайте класс, который получает имя машины:
using System;
using System.IO;
using log4net.Layout.Pattern;
namespace YourNameSpace.Converters
{
public class MachinePatternConverter : PatternLayoutConverter
{
protected override void Convert(TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
{
writer.Write(Environment.MachineName);
}
}
}
затем настройте конфигурацию log4net следующим образом:
<layout type="log4net.Layout.PatternLayout">
<converter>
<name value="machine" />
<type value="YourNameSpace.MachinePatternConverter" />
</converter>
<conversionPattern value="%date [%thread] %level %logger %machine" />
</layout>
Мне нравится этот подход, так как его можно использовать повторно, и я могу управлять информацией так, как я хочу. Если вы хотите зарегистрировать IP-адрес, например, просто сделайте то же самое и создайте конвертер следующим образом:
public class IPPatternConverter : PatternLayoutConverter
{
protected override void Convert(TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
{
if (HttpContext.Current == null)
return;
writer.Write(HttpContext.Current.Request.UserHostAddress);
}
}
Более подробная информация по ссылке: http://devstuffs.wordpress.com/2012/01/12/creating-your-own-pattern-layout-converter-for-log4net/
Используя этот ответ /questions/31824384/informatsiya-ob-identifikatore-protsessa-log4net/31824397#31824397 о добавлении свойств GlobalContext, я смог заставить это работать.
Я добавил следующий код в мой файл класса:
log4net.GlobalContext.Properties["hostname"] = Environment.MachineName;
И тогда в файле конфигурации я могу сослаться на имя хоста, и оно появится
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{hostname}] - %message%newline" />
</layout>
Надеюсь это поможет.
Проверьте PatternString API, похоже, вам нужно будет использовать свойство% в вашем шаблоне. Также взгляните на эту статью, вам может понадобиться ввести имя компьютера в глобальный контекст при запуске приложения.
Интересно, я думаю, что это "Синтаксис компактных параметров", посмотрите последний раздел здесь http://logging.apache.org/log4net/release/manual/configuration.html