使用备份appender进行日志记录

时间:2012-01-13 10:53:31

标签: .net logging log4net enterprise-library nlog

是否有任何.NET日志框架能够在当前问题出现问题时切换appender。其实我想要的是:

如果我正在使用数据库appender以及数据库出现问题(例如服务器出现故障,断电......)我想切换到第二个appender(例如登录到文件中)。

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

5 个答案:

答案 0 :(得分:2)

据我所知,log4net目前不支持备份appender,log4net功能积压中存在(或者是?)一个未解决的问题。但我认为名为FallbackAppender的项目完全符合您的需要。

答案 1 :(得分:2)

为了完整性:Enterprise Library支持可配置的错误特殊源,您可以在其中设置“appender”以记录出错的消息。配置完成后,无需任何编程即可正常工作。

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

答案 2 :(得分:2)

因为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");

答案 3 :(得分:1)

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

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

我总是建议默认使用两个日志目的地 - 以防其中一个出现问题。

答案 4 :(得分:1)

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