插件 dll 中的 Log4Net 配置

本文关键字:配置 Log4Net 中的 dll 插件 | 更新日期: 2023-09-27 17:56:45

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

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

插件 dll 中的 Log4Net 配置

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

log4net 环境完全可以通过编程方式进行配置。

使用

     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>

虽然我总体上同意Mauricio Scheffer的回答,但在某些情况下,DLL需要在主应用程序之前记录。就我而言,我在 DLL 中实现了一个 SOAP 扩展类,以记录任何 ASMX Web 服务的 SOAP 请求和响应。由于 soap 扩展位于 Web 方法执行之前执行的 DLL 中,因此必须在 DLL 中以编程方式配置 log4net。但是每个 Web 服务都包含自己的 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);
}