在插件dll中使用Log4Net配置?

时间:2011-05-18 19:32:19

标签: c# .net log4net

我们有一个插件可以与第三方软件一起发布(也可以使用我们自己的软件)我们的插件是用C#编写的,包含一些log4net日志记录。在我们自己的软件中,我们有一个.exe.config包含我们的log4net部分并允许配置。但是在第三方方面,我们无法做到这一点。

有关如何在代码中配置它的任何建议? (假设它尚未配置,在我们自己的软件的情况下)?

4 个答案:

答案 0 :(得分:10)

这是可能的,但恕我直言,这不是一个好主意。它是应用程序,而不是,它决定是否/如何/何时/何地/记录什么。库只应提供日志记录支持(您已经这样做了)。

答案 1 :(得分:4)

答案 2 :(得分:1)

使用

     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>

答案 3 :(得分:1)

虽然我一般同意Mauricio Scheffer的answer,但可能存在DLL需要在主应用程序之前登录的情况。在我的例子中,我在DLL中实现了一个SOAP extension class来记录任何ASMX Web服务的SOAP请求和响应。因为soap扩展位于在Web方法执行之前执行的DLL中,所以必须在DLL中以编程方式配置log4net。但是每个Web服务都包含自己的log4net.config文件,DLL需要通过该文件进行定位和加载以便以编程方式配置log4net。

我的解决方案是添加method to determine to location of the running 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);
}