Конфигурация Log4Net в плагине DLL? - PullRequest
6 голосов
/ 18 мая 2011

У нас есть плагин, который распространяется со сторонним программным обеспечением (также с нашим собственным программным обеспечением). Наш плагин написан на C # и содержит некоторые записи в log4net.В нашем собственном программном обеспечении у нас есть файл .exe.config, который содержит наш раздел log4net и позволяет выполнять настройку.Однако, со стороны, мы не можем этого сделать.

Какие-либо предложения о том, как я могу настроить его из кода?(Предполагая, что это еще не было настроено, в случае нашего собственного программного обеспечения)?

Ответы [ 4 ]

10 голосов
/ 18 мая 2011

Можно это сделать, но ИМХО, это не очень хорошая идея.Это приложение , а не библиотеки , которое решает, если / как / когда / где / что регистрировать.Библиотеки должны только предлагать поддержку журналирования (вы уже делаете это).

4 голосов
/ 18 мая 2011
1 голос
/ 30 мая 2014

Хотя я согласен с ответом Маурисио Шеффера в целом, могут быть случаи, когда DLL должна войти в систему перед основным приложением. В моем случае я реализовал класс расширения SOAP в DLL для регистрации SOAP-запросов и ответов для любой веб-службы ASMX. Поскольку расширение soap находится в DLL, которая выполняется до выполнения веб-метода, log4net должен быть настроен программно в DLL. Но каждый веб-сервис содержит свой собственный файл log4net.config, который DLL должна найти и загрузить для программной настройки log4net.

Мое решение состояло в том, чтобы добавить метод для определения местоположения работающей DLL

static public string AssemblyDirectory
{
    get
    {
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        string path = Uri.UnescapeDataString(uri.Path);
        return Path.GetDirectoryName(path);
    }
}

и затем в конструкторе моей DLL для загрузки конфигурации программно

if (!log4net.LogManager.GetRepository().Configured)
{
    // assume that log4net.config is located in the root web service folder
    var configFileDirectory = (new DirectoryInfo(TraceExtension.AssemblyDirectory)).Parent;
    var configFile = new FileInfo(configFileDirectory.FullName + "\\log4net.config");

    if (!configFile.Exists)
    {
        throw new FileLoadException(String.Format("The configuration file {0} does not exist", configFile));
    }

    log4net.Config.XmlConfigurator.Configure(configFile);
}
1 голос
/ 04 апреля 2012

использование

     private static void LoadLoggerConfig(string filename)
    {

        FileInfo file = new FileInfo(filename);
        if (!file.Exists)
        {
            throw new FileLoadException(string.Format("The configuration file {1} for the logger cannot be found in {0}", file.Directory.FullName, LOG4NET_CONFIG_FILE), LOG4NET_CONFIG_FILE);
        }
        log4net.Config.XmlConfigurator.Configure(file);
    }

и создайте внешний файл конфигурации log4net

например

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