[英]Using log4net With Visual Studio Debugger
在 Excel VSTO 插件的调试模式下使用 Visual Studio 时,我无法加载我的 log4net.config 文件。 配置文件位于我的项目的顶级目录中。 我将属性“复制到输出目录”设置为“始终复制”。 这确保文件被复制到 bin/Debug/log4net.config。 我可以在构建时验证这种情况。
但是,当我在调试模式下运行时,文件不会加载。 我放弃了让文件自动加载的尝试,并决定按照这个问题底部的 OP 代码通过代码来完成。
但是,我意识到我需要使用配置文件的绝对路径,因为相对路径没有被选中。 在进一步调查中,我意识到正在执行的 DLL 实际上并不是 debug/bin 文件夹中的 DLL。 它位于以下位置:
C:\Users\cbhandal\AppData\Local\assembly\dl3\MO52QQWP.9ZL\K36XZHGN.1PB\230751e6\d09b7fb2_19f6d401
也是当前工作目录,由System.IO.Directory.GetCurrentDirectory();
找到System.IO.Directory.GetCurrentDirectory();
被设置为"C:\\\\Users\\\\cbhandal\\\\Documents"
。
将路径硬编码为绝对路径的工作方式如下:
var log4netConfig = "C:\\" + path + "\\Log4net.config";
var log4netInfo = new FileInfo(log4netConfig);
log4net.Config.XmlConfigurator.ConfigureAndWatch(log4netInfo);
但这不是我可以部署的解决方案。 我被困在这里。 想知道是否有办法强制 Visual Studio 将 .config 文件复制到该 appdata/temp 位置,或者是否有办法以编程方式引用原始 DLL 所在的文件夹 - 构建的文件夹。 或者如果有人有任何其他解决方案?
对我来说,最简单的解决方案是使用这个: https : //stackoverflow.com/a/6963420/4754981
但是对于不同的方法,该链接上还有其他几种解决方案,每个解决方案都有各自的注意事项。
所以我的看起来像这样:
using System.Reflection;
using System.IO;
using System;
public static class Extensions {
private static string GetDirectory(this Assembly a) {
string codeBase = a.CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
return Path.GetDirectoryName(path);
}
private static void AlterLogPath(this log4net.Repository.ILoggerRepository repo, string newPath, string directory="") {
log4net.Repository.Hierarchy.Hierarchy h = (log4net.Repository.Hierarchy.Hierarchy) repo;
foreach (log4net.Appender.IAppender a in h.Root.Appenders) {
if (a is log4net.Appender.FileAppender) {
var fa = (log4net.Appender.FileAppender)a;
var fileName = Path.GetFileName(fa.File);
fa.File = newPath + (String.IsNullOrEmpty(directory)?"":(directory + Path.DirectorySeparatorChar.ToString())); // edit: filename is attached after next line automatically.
fa.ActivateOptions();
break;
}
}
}
}
并在启动中(通过[assembly: System.Web.PreApplicationStartMethod]
或其他方式用于 asp),或主应用程序..
static void Main() {
var PATH = Assembly.GetExecutingAssembly().GetDirectory() + Path.DirectorySeparatorChar.ToString();
log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(PATH + "log4net.config"));
log4net.LogManager.GetRepository().AlterLogPath(PATH, "Logs");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.