繁体   English   中英

将 log4net 与 Visual Studio 调试器一起使用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM