Как программно обновить файл конфигурации log4net? - PullRequest
2 голосов
/ 07 марта 2012

В настоящее время у меня есть конфигурация log4net в файле app.config приложений, как таковая:

...
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="logs\Service.log"/>
      <appendToFile value="true"/>
      <rollingStyle value="Date"/>
      <datePattern value="yyyyMMdd"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
      </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
      </layout>
    </appender>
    <logger name="Data.WebService">
      <level value="ALL"/>
      <appender-ref ref="ConsoleAppender"/>
      <appender-ref ref="RollingLogFileAppender"/>
    </logger>
    <logger name="Data.Host.HostService">
      <level value="ALL"/>
      <appender-ref ref="ConsoleAppender"/>
      <appender-ref ref="RollingLogFileAppender"/>
    </logger>
  </log4net>

Я знаю, что могу прочитать это через log4net.Config.XmlConfigurator.Configure();, однако я хотел бы иметь возможностьчтобы обновить его через какой-то вызов.Я приму конфигурацию из веб-службы и, как только я установлю новую конфигурацию (в настоящее время только уровень журнала, но я не исключаю, что другие параметры будут настраиваться в будущем), мне нужнообновить то, что находится в файле конфигурации.

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

Ответы [ 2 ]

5 голосов
/ 09 марта 2012

Поскольку официального метода для этого не существует, я написал метод, который использует xpath для определения местоположения элемента (ов) для изменения и последующего обновления.Работает достаточно хорошо для того, что мне нужно сделать, и является более изящным, чем грубая попытка «прочесть в файл, затем заменить текст в файл».

    public enum Log4NetConfigItem
    {
        LOGLEVEL
    }

    public const string LOG4NET_CONFIGFILE = "log4net.config";

    public void UpdateConfiguration(Log4NetConfigItem which, object value)
    {
        // Load the config file.
        XmlDocument doc = new XmlDocument();
        doc.Load(LOG4NET_CONFIGFILE);
        // Create an XPath navigator for the document.
        XPathNavigator nav = doc.CreateNavigator();

        try
        {
            XPathExpression expr;

            // Compile the correct XPath expression for the element we want to configure.
            switch (which)
            {
                default:
                case Log4NetConfigItem.LOGLEVEL:
                    // Compile a standard XPath expression
                    expr = nav.Compile("/configuration/log4net/logger/level");
                    break;
            }

            // Locate the node(s) defined by the XPath expression.
            XPathNodeIterator iterator = nav.Select(expr);

            // Iterate on the node set
            while (iterator.MoveNext())
            {
                XPathNavigator nav2 = iterator.Current.Clone();

                // Update the element as required.
                switch (which)
                {
                    default:
                    case Log4NetConfigItem.LOGLEVEL:
                        // Update the 'value' attribute for the log level.
                        SetAttribute(nav2, String.Empty, "value", nav.NamespaceURI, value.ToString());
                        break;
                }
            }

            // Save the modified config file.
            doc.Save(LOG4NET_CONFIGFILE);
        }
        catch (Exception ex) 
        {
            Console.WriteLine(ex.Message);
        }
    }

    void SetAttribute(System.Xml.XPath.XPathNavigator navigator, String prefix, String localName, String namespaceURI, String value)
    {
        if (navigator.CanEdit == true)
        {
            // Check if given localName exist
            if (navigator.MoveToAttribute(localName, namespaceURI))
            {
                // Exist, so set current attribute with new value.
                navigator.SetValue(value);
                // Move navigator back to beginning of node
                navigator.MoveToParent();
            }
            else
            {
                // Does not exist, create the new attribute
                navigator.CreateAttribute(prefix, localName, namespaceURI, value);
            }
        }
    }

Примечание. Код атрибута Set, который я получил от здесь .

0 голосов
/ 07 марта 2012

Это в основном это открытый вопрос для log4net - к сожалению, он еще не решен.

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