Могу ли я параметризировать имя типа приложения log4net в app.config? - PullRequest
2 голосов
/ 26 октября 2011

Я использую log4net в консольном приложении.Мой файл конфигурации позволяет мне получить имя файла из ввода:

Файл конфигурации:

<appender name="CustomRollingFileAppender" type="MyApp.UTIL.CustomRollingFileAppender">
      <threshold value="ALL"/>
      <param name="file" value=""/>
      <param name="appendToFile" value="false"/>
      <param name="maximumFileSize" value="20000KB"/>
      <param name="maxSizeRollBackups" value="200"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%-5.5level] %logger - %message%newline"/>
      </layout>
</appender>

Параметр переопределения файла:

namespace ConsoleApplicationTemplate.UTIL
{
    public class CustomRollingFileAppender : log4net.Appender.RollingFileAppender
    {
        public override string File
        {
            get { return base.File; }
            set
            {
                //Filename string taken as Input
                base.File = Program.options.LogFile; 
            }
        }
    }    
}

Это работает как чудо,но мне нужно изменить параметр type внутри тега appender .Я искал вокруг и узнал, что я могу использовать свойства в файле конфигурации.Поэтому я изменил свой конфигурационный файл следующим образом:

<appender name="CustomRollingFileAppender" type="%property{ApplicationName}.UTIL.CustomRollingFileAppender">
      <threshold value="ALL"/>
      <param name="file" value=""/>
      <param name="appendToFile" value="false"/>
      <param name="maximumFileSize" value="20000KB"/>
      <param name="maxSizeRollBackups" value="200"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%-5.5level] %logger - %message%newline"/>
      </layout>
</appender>

И мне также нужно изменить значение свойства следующим образом:

log4net.GlobalContext.Properties["ApplicationName"] = Assembly.GetExecutingAssembly().GetName().Name;
private static log4net.ILog _logger = LogManager.GetLogger(typeof(Program));
log4net.Config.XmlConfigurator.Configure();

Когда log4net прочитает файл конфигурации, я получаю следующееошибка (которая не вызывает исключение):

log4net:ERROR Could not create Appender [CustomRollingFileAppender] of type [%property{ApplicationName}.UTIL.CustomRollingFileAppender]. Reported error follows.
System.TypeLoadException: Could not load type [%property{ApplicationName}.UTIL.CustomRollingFileAppender]. Tried assembly [log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a] and all loaded assemblies 
    at log4net.Util.SystemInfo.GetTypeFromString(Assembly relativeAssembly, String typeName, Boolean throwOnError, Boolean ignoreCase)
    at log4net.Util.SystemInfo.GetTypeFromString(String typeName, Boolean throwOnError, Boolean ignoreCase) 
    at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseAppender(XmlEle
    ment appenderElement)

1 Ответ

1 голос
/ 16 ноября 2011

Боюсь, что ответ отрицательный: в отличие от некоторых других элементов конфигурации log4net, атрибут type элемента appender не поддерживает параметры.

Как уже говорилось в комментариях к вашему вопросу, поскольку вы пытаетесь создать шаблон проекта Visual Studio, который предоставляет собственный тип приложения log4net, решением будет использование системы шаблонов Visual Studio для написания значение соответствующего атрибута в файле .config.

...