2011-01-13 2 views
0

Есть ли какая-либо переменная, которую я мог бы использовать, чтобы назвать мои файлы журналов?Как определить выходные файлы log4net с именем сборки?

<file value="${ALLUSERSPROFILE}\${AssemblyName}.log.xml" /> 

Где

  • ${ALLUSERSPROFILE} действительно работает
  • ${AssemblyName} не делает, это то, что я сделал просто для иллюстрации того, что я хочу.
+0

NLog имеет переменную похожа на то, что я хочу: '$ {}' ProcessName –

ответ

1

Не по умолчанию.

Этот синтаксис предназначен для расширения Windows Environment Variables. В то время как ALLUSERSPROFILE является стандартной переменной окружения, AssemblyName нет. Вам нужно будет установить AssemblyName самостоятельно, что будет нелегко \ возможно, как динамическое решение.

0

имя процесса в NLog сродни PatternLayout в log4net; они являются частью компоновки/рендеринга самих журналов.

Если вы хотите использовать переменную окружения в своем приложении, либо принудительно создать как часть установки, либо создать свой собственный код; пример C#: here.

Если эта опция не подходит для ваших нужд, вы можете динамически установить путь, как показано на рисунке here.

0

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

0

Другой вариант, чтобы определить глобальное свойство во время инициализации:

GlobalContext.Properties["pid"] = System.Diagnostics.Process.GetCurrentProcess().Id; 
this.logger = log4net.GetLogger("LoggerSample"); 

В вашей конфигурационный файл, вы можете использовать свойство «pid» следующим образом:

<param name="ConversionPattern" value="%d;%property{log4net:HostName};%property{pid};%t;%p;%c;%M;%L;%m%n" /> 

Надеюсь, я был чист!

уша ++ mabra

3

Как другие говорили, что нет встроенного заполнителя для AssemblyName и несколько способов ее достижения, так или иначе. Еще один - зарегистрировать собственный обработчик/конвертер с помощью системы Log4Net.

В принципе, вы делаете то же самое, что и класс log4net.Util.PatternString (и вы можете проверить соответствующий исходный код для более полного «примера», чем приведенные ниже фрагменты).

Пример:

<file value="[ASSEMBLYNAME].log" type="MyExpressionHandler, MyAssembly"/> 

Затем код:

введите код здесь

using log4net.Core; 

public sealed class MyExpressionHandler : IOptionHandler 
{ 
    private string m_str; 

    public MyExpressionHandler(string str) 
    { 
     m_str = str; 
    } 

    public void ActivateOptions() 
    { 
    } 

    public string Format() 
    { 
     return m_str.Replace("[ASSEMBLYNAME]", /* ... whatever ... */); 
    } 
} 

Затем обеспечивают соответствие "конвертер класса".

internal class MyExpressionHandlerConverter : IConvertTo, IConvertFrom 
    { 
     public bool CanConvertTo(Type targetType) 
     { 
      return (typeof(string).IsAssignableFrom(targetType)); 
     } 

     public object ConvertTo(object source, Type targetType) 
     { 
      MyExpression patternString = source as MyExpression; 
      if (patternString != null && CanConvertTo(targetType)) 
      { 
       return patternString.Format(); 
      } 
      throw ConversionNotSupportedException.Create(targetType, source); 
     } 

     public bool CanConvertFrom(System.Type sourceType) 
     { 
      return (sourceType == typeof(string)); 
     } 

     public object ConvertFrom(object source) 
     { 
      string str = source as string; 
      if (str != null) 
      { 
       return new MyExpression(str); 
      } 
      throw ConversionNotSupportedException.Create(typeof(MyExpression), source); 
     } 
} 

И, наконец, сделать ваш конвертер известно рамках Log4Net:

ConverterRegistry.AddConverter(typeof(MyExpression), typeof(MyExpressionConverter));