Есть ли шаблон log4net для machineName

Мне трудно найти документацию по различным шаблонам "в коробке", таким как

%logger  
%level  
%timestamp  

Конечно, есть страница примера, но я не уверен, что это полный список опций.

Я также знаю, что можно передавать параметры MDC из приложения в регистратор, но это включает в себя изменение кода, которое отличается от изменения конфигурации.

Есть ли %machineName вариант или machineIP вариант? Проблема заключается в том, что все наши серверы в веб-ферме регистрируются в одном и том же журнале базы данных, и теперь мы думаем, что непропорциональное количество сообщений поступает с одного компьютера.

6 ответов

%property{log4net:HostName}

То, что я только что наткнулся на это

<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

Другие вопросы по тегам