使用多个版本的nlog

时间:2012-09-18 08:27:54

标签: asp.net iis-7 web-config gac nlog

我是nlog的新手,如果我错过了一些微不足道的事情,请原谅我的无知。

我使用IIS7托管多个应用程序,有些使用nlog 1.0.0.505,有些使用NLog 2.0。我不知道如何创建一个web.config来容纳这两个版本。

是否可以将多个版本的nlog.dll放入GAC中,以便每个应用程序都有一个可供选择的版本列表?

从GAC中删除nlog并让应用程序使用部署的nlog可能更好吗?在这种情况下,如何在web.config中引用nlog(设置目标等)

非常感谢任何有关我可以阅读的内容的帮助或指示。

提前致谢。

3 个答案:

答案 0 :(得分:3)

您需要为每个应用程序或至少为使用不同版本的从属dll的每个应用程序创建单独的应用程序域。单个App Domain无法加载同一dll的多个版本。

答案 1 :(得分:1)

我们最终让应用程序提供了nlog.dll文件,但未在全局web.config中指定版本号。

答案 2 :(得分:0)

经过一番战斗......(如果你不想要故事只是复制下面的代码)

让我们首先说明GAC(Global Assymbly Cache)发明的原因之一是在同一个地方使用多个版本的dll。

所以......我有一个带有NLog 2.0的Sharepoint项目,我需要添加一个依赖于NLog 3.2的dll的第二个解决方案,问题是,在将所有内容推送到GAC之后(ans到SafeControls - 对于sp devs)是记录器从未登录过新的解决方案。

当我再次看着我的web.config

时,铃声响了起来
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog, Version=2.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c" />

请注意版本= 2.0.0.0

所以我得到了NLog只是加载旧项目的配置,并在开始使用3.2 dll时以某种方式不传递它。

我也尝试重新加载配置,做DeepCopy,无法理解为什么它不起作用。

然后我在代码中重新定义LoggingConfiguration以重新启动记录器,同时保存旧的配置,登录该类,然后在析构函数中重新启动以使用旧配置重新初始化。

我想结果是记录器现在在2.0配置中使用3.2。

但后来我讨厌两件事:1 - 有一个析构函数,2 - 没有来自web.config的配置,并试图做所有那个海峡没有工作,并观察有时与日志有一些延迟我我认为可能有一些队列或其他东西我最终找到了正确的方法来制作一个能够适当地重新启动NLog的CTOR:

    public EncryptEventReceiver()
    {
        oldConfig = LogManager.Configuration;

        Task t = new Task(() =>
        {
            FileTarget target = new FileTarget();
            target.FileName = "c:\\Data\\Logs\\MyProj\\EncryptEventReceiver.txt";
            target.Layout = "${message}";
            target.Encoding = Encoding.UTF8;

            LoggingRule rule = new LoggingRule("*", LogLevel.Trace, target);

            LoggingConfiguration config = new LoggingConfiguration();
            config.AddTarget("FileLog", target);
            config.LoggingRules.Add(rule);

            LogManager.Configuration = config;

            var _logger = LogManager.GetCurrentClassLogger();
            _logger.Trace("EncryptEventReceiver CTOR initialized Logger");
        });

        t.Start();
        t.Wait();

        LogManager.GetCurrentClassLogger().Trace("EncryptEventReceiver MIDDLE");
        LogManager.Configuration = oldConfig;
        nlog3 = LogManager.GetCurrentClassLogger();
        nlog3.Trace("EncryptEventReceiver CTOR done, nlog3 ready");
    }

编辑: 最后导致一些日志遗漏,所以我回到了CTOR-Destrucor,因为建议使用web-config更重要的用途

    public static Logger nlog3;
    private static LoggingConfiguration oldConfig;

    public EncryptEventReceiver()
    {
        oldConfig = LogManager.Configuration;

        FileTarget target = new FileTarget();
        target.FileName = "c:\\Data\\Logs\\MyProj\\EncryptEventReceiver.txt";
        target.Layout = "${date:format=yyyy-MM-dd HH\\:mm\\:ss}   ${level}   ${message}   ${exception:format=tostring}";
        target.ArchiveAboveSize = 5242880;
        target.ArchiveFileName = "c:\\Data\\Logs\\MyProj\\Archive_EncryptEventReceiver\\EncryptEventReceiver_${shortdate}_{#}.txt";
        target.Encoding = Encoding.UTF8;

        LoggingRule rule = new LoggingRule("*", LogLevel.Trace, target);

        LoggingConfiguration config = new LoggingConfiguration();
        config.AddTarget("FileLog", target);
        config.LoggingRules.Add(rule);

        LogManager.Configuration = config;

        nlog3 = LogManager.GetCurrentClassLogger();
        nlog3.Trace("EncryptEventReceiver CTOR done, nlog3 ready");
    }

    ~EncryptEventReceiver()
    {
        nlog3.Trace("EncryptEventReceiver Destructor");
        LogManager.Configuration = oldConfig;
        LogManager.GetCurrentClassLogger().Trace("EncryptEventReceiver Destructor done");
    }