我们有一个插件可以与第三方软件一起发布(也可以使用我们自己的软件)我们的插件是用C#编写的,包含一些log4net日志记录。在我们自己的软件中,我们有一个.exe.config包含我们的log4net部分并允许配置。但是在第三方方面,我们无法做到这一点。
有关如何在代码中配置它的任何建议? (假设它尚未配置,在我们自己的软件的情况下)?
答案 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);
}