【问题标题】:Logging with backup appender使用备份附加程序进行日志记录
【发布时间】:2012-02-09 14:09:07
【问题描述】:

如果当前的有问题,是否有任何 .NET 日志框架能够切换附加程序。其实我想要的是:

如果我正在使用数据库附加程序并且当数据库出现问题时(例如服务器停机、断电...)我想切换到第二个附加程序(例如哪个登录到文件)。

此功能是否具有以下功能之一:log4net、NLog、企业库?我一直在寻找这个,但没有运气。

【问题讨论】:

  • Nlog 允许您编写自己的目标。然后,您可以添加您的要求。 nlog-project.org/wiki/…(可能是最后的手段:)
  • 我找到了解决办法,请看下面我的回答。

标签: .net logging log4net enterprise-library nlog


【解决方案1】:

是的,Log4Net 允许您拥有多个日志目的地,例如:日志文件、电子邮件、数据库和事件查看器。

您可以在应用程序的配置文件中更改目标。您也可以同时运行多个 - 例如登录到事件查看器和数据库。

我总是建议默认设置两个日志目标 - 以防其中一个出现问题。

【讨论】:

  • 我知道,但是如果我们在登录数据库时遇到异常,有没有办法在运行时(从代码)将 appender 从数据库切换到文件?
  • 不是通过 Log4Net 本身,但您可以轻松地在代码中更新 web.config。由于一个日志目标可能有问题,因此拥有两个总是一个好主意。这意味着您无需担心编写更新 web.config 的代码。
  • 我找到了解决办法,请看下面我的回答。
【解决方案2】:

NLog 允许您通过配置文件记录到多个目标。不要忘记将 ignoreFailures 设置为 true 以确保忽略任何安装/卸载失败:

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <targets>
        <target name="logfile" xsi:type="File" />
        <target name="db" xsi:type="Database" />
    </targets>

    <rules>
        <logger name="*" levels="Info" writeTo="logfile,db" />
    </rules>
</nlog> 

有关详细信息,请参阅 NLog 文档中的 database target

编辑:您还可以创建自定义目标以在代码中实现此目的:

using NLog; 
using NLog.Targets; 

namespace MyNamespace 
{ 
    [Target("MyFirst")] 
    public sealed class MyFirstTarget: TargetWithLayout 
    { 
        public MyFirstTarget()
        {
            this.Host = "localhost";
        }

        [Required] 
        public string Host { get; set; }

        protected override void Write(LogEventInfo logEvent) 
        { 
            string logMessage = this.Layout.Render(logEvent); 

            SendTheMessageToRemoteHost(this.Host, logMessage); 
        } 

        private void SendTheMessageToRemoteHost(string host, string message) 
        { 
            // Detect your database state here or do something else with the error.
        } 
    } 
}

并将其用于:

<nlog> 
  <extensions> 
    <add assembly="MyAssembly"/> 
  </extensions> 
  <targets> 
    <target name="a1" type="MyFirst" host="localhost"/> 
  </targets> 
  <rules> 
    <logger name="*" minLevel="Info" appendTo="a1"/> 
  </rules> 
</nlog>

更多信息请参见this page

【讨论】:

  • 我知道,但是如果我们在登录数据库时遇到异常,有没有办法在运行时(从代码)将 appender 从数据库切换到文件?
  • 我会创建一个自定义目标来实现这一点。我现在将更新我的答案。
  • 我找到了解决办法,请看下面我的回答。
【解决方案3】:

据我所知 log4net 目前不支持备份附加程序,在 log4net 功能积压中存在(或曾经?)一个未解决的问题。但我认为名为@9​​87654321@ 的项目正是您所需要的。

【讨论】:

  • 你说得对,这正是我需要的,但是当我尝试并测试时,它似乎没有按预期工作。例如如果您正在使用两个 FileAppenders 并且一个失败,那么下次恢复该文件时,它会尝试再次使用它,但失败了。数据库也发生了同样的问题。也许我没有正确配置它,但肯定它没有按预期工作。谢谢你的齿。
  • 我找到了解决办法,请看下面我的回答。
【解决方案4】:

为了完整性:企业库支持可配置的错误特殊源,您可以在其中设置“附加器”来记录错误消息。配置完成后,无需任何编程即可工作。

唯一的缺点是它实际上会以无法更改的特定格式记录发生的异常以及日志条目详细信息,因此不灵活。这有利于故障排除,但如果您想提取错误的日志消息并将其导入原始日志记录目标(尽管格式已知,因此可以解析),它可能并不理想。

【讨论】:

  • 我找到了解决办法,请看下面我的回答。
【解决方案5】:

因为 log4netContribute FallbackAppender 没有按预期工作,我做了深入研究,发现这个能力有 nLog。我对其进行了测试,它就像一个魅力;)这是一个例子:

[app.config]

<?xml version="1.0"?>
<configuration>
<configSections>
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
</configSections>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<variable name="appTitle" value="My Application"/>
<targets>
<target name="file" xsi:type="FallbackGroup" returnToFirstOnSuccess="true">
<target xsi:type="File" fileName="x:\vladimir.txt" />
<target xsi:type="File" fileName="w:\pavlovic.txt" />
<target xsi:type="File" fileName="w:\zvjerka24.txt" />
</target>
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="file" />
</rules>
</nlog>
</configuration>

[代码]

Logger _logger = LogManager.GetCurrentClassLogger();
_logger.Info("Neki Info");
_logger.Debug("Neki debug");
_logger.Error("Neki  ERROR");
_logger.Error("Pa jos neki");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2017-04-09
    相关资源
    最近更新 更多