Log4net один элемент FileAppender, программный вход в несколько файлов - PullRequest
4 голосов
/ 25 октября 2011

Мое веб-приложение поддерживает несколько экземпляров, например, 1, 2, каждый из которых записывает данные в свой собственный файл через log4net.То есть я хочу записывать данные в разные файлы на основе идентификатора экземпляра программно.Путь к файлу должен быть:

D: \ Projects \ Log \ 1 \ Reporting.log для экземпляра 1

D: \ Projects \ Log \ 2 \ Reporting.log для экземпляра 2

Мое веб-приложение поддерживает 3 экземпляра. Нужно ли иметь три регистратора в C #, которые ТОЛЬКО отличаются по пути к файлу журнала, как показано выше?

Ниже приведен Log4Net.config

 <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
      </configSections>
      <log4net>

        <appender name="ExceptionLogFileAppender" type="log4net.Appender.RollingFileAppender">

          <file value=????How to specify this????? />
          <appendToFile value="true" />
          <rollingStyle value="Date" />
          <datePattern value="-yyyy-MM-dd.lo\g" />
          <param name="StaticLogFileName" value="false" />
          <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="------------------------------------------&#13;&#10;" />
            <param name="Footer" value="------------------------------------------&#13;&#10;" />
            <conversionPattern value="%d|[%t]|%-5p|%c|%m%n"/>
          </layout>
        </appender>
        <!-- Setup the root category, add the appenders and set the default level -->
        <root>
          <level value="ERROR" />
          <appender-ref ref="ExceptionLogFileAppender" />
        </root>

      </log4net>
    </configuration>

ОБНОВЛЕНИЕ

Идентификатор экземпляра должен быть 1,2 и т. Д.

Идентификатор экземпляра будет иметь более 100 в будущем.

Любая идея будет высоко ценится!

Ответы [ 4 ]

2 голосов
/ 25 октября 2011

См. этот пример .По сути, если количество экземпляров является управляемым и конечным, вы можете создать приложение для журнала.Затем вы добавляете фильтр к каждому из них и присваиваете свойству StringToMatch для каждого идентификатора экземпляра.

Обратите внимание, что это не совсем динамично, так как вам нужно будет указать каждого из этих добавителей заранее.времени.

2 голосов
/ 25 октября 2011

Ну, я не могу придумать, как регистрировать каждый экземпляр (1, 2, 3), но вы можете легко зарегистрировать их по их PID.Я бы изменил элемент <file> на:

<file type="log4net.Util.PatternString">
    <conversionPattern value="log\%processid\yourFileName.%date{yyyyMMMdd}.log" />
</file>

Затем удалил элемент, который должен дать:

 <appender name="ExceptionLogFileAppender" type="log4net.Appender.RollingFileAppender">    
      <file type="log4net.Util.PatternString">
         <conversionPattern value="log\%processid\yourFileName.%date{yyyyMMMdd}.log" />
      </file>
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <param name="StaticLogFileName" value="false" />
      <layout type="log4net.Layout.PatternLayout">
          <param name="Header" value="------------------------------------------&#13;&#10;" />
          <param name="Footer" value="------------------------------------------&#13;&#10;" />
          <conversionPattern value="%d|[%t]|%-5p|%c|%m%n"/>
      </layout>
  </appender>

Затем каждый экземпляр должен регистрироваться в соответствии со своим PID:

c:\log\13242\yourFileName.20111025.log

Или вы можете сделать pid частью имени файла вместо другого каталога, который я, вероятно, рекомендую, чтобы вы не засоряли папку c: \ log \ несколькими каталогами:

<file type="log4net.Util.PatternString">
    <conversionPattern value="log\yourFileName.%processid.%date{yyyyMMMdd}.log" />
</file>

Это даст вам такие файлы, как:

c:\log\yourFileName.13142.20111025.log
c:\log\yourFileName.13152.20111025.log
1 голос
/ 25 октября 2011

Это должно сработать, это немного работы и основано на ответе от комплекта здесь .

Перед звонком XmlConfigurator.Configure(); добавить

ConverterRegistry.AddConverter(typeof(InstancePatternString), typeof(InstancePatternStringConverter));

Затем добавьте следующие классы к вашему решению:

public class InstancePatternString  : PatternString
{
    public InstancePatternString(string pattern): base(pattern)
    {
    }

    public override void ActivateOptions()
    {
        AddConverter("cs", typeof(InstancePatternConverter));
        base.ActivateOptions();
    }
}

public class InstancePatternConverter  : PatternConverter 
{
    override protected void Convert(TextWriter writer, object state) 
    {
        switch(Option)
        {
            case "instance":
                writer.Write(MyContext.Instance);
                break;
        }
    }
}

public class InstancePatternStringConverter : IConvertTo, IConvertFrom
{
    public bool CanConvertFrom(Type sourceType)
    {
        return sourceType == typeof(string);
    }

    public bool CanConvertTo(Type targetType)
    {
        return typeof(string).IsAssignableFrom(targetType);
    }

    public object ConvertFrom(object source)
    {
        var pattern = source as string;
        if (pattern == null)
            throw ConversionNotSupportedException.Create(typeof(InstancePatternString), source);
        return new InstancePatternString(pattern);
    }

    public object ConvertTo(object source, Type targetType)
    {
        var pattern = source as PatternString;
        if (pattern == null || !CanConvertTo(targetType))
            throw ConversionNotSupportedException.Create(targetType, source);
        return pattern.Format();
    }
}

Обязательно измените MyContext.Instance здесь на статически доступное свойство, представляющее ваш экземпляр.

Наконец, измените ваш web.config с:

<file value=????How to specify this????? />

до:

<file type="ConsoleApp.InstancePatternString, ConsoleApp" value="%cs{instance}\Reporting.log" />

Где ConsoleApp - это сборка, в которую вы добавили эти классы. Это приведет к созданию файлов журнала в отдельных каталогах экземпляров. т.е. 1 \ Reporting.log, 2 \ Reporting.log и т. д.

Преимущество этого подхода состоит в том, что добавление будущих свойств довольно просто и требует лишь добавления в оператор switch, чтобы его можно было использовать в любых будущих именах файлов / местах журналов.

0 голосов
/ 17 мая 2012

Не совсем решение журнала файловой системы, но как насчет регистрации в таблице БД и включения подробностей экземпляра? Это облегчило бы дифференциацию сообщений, специфичных для экземпляра, и практически не требует обслуживания и может быть легко масштабировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...