使用备用appender记录日志

6
有没有.NET日志框架可以在当前记录器出现问题时切换记录器?实际上,我想要的是以下内容:
如果我正在使用数据库记录器,当数据库出现问题(例如服务器崩溃,停电...)时,我希望切换到第二个记录器(例如记录到文件中)。 log4net、NLog、Enterprise Library中是否有这种能力?我正在寻找这个功能但没有找到。

NLog允许你编写自己的目标(Target)。然后你可以添加你的需求。http://nlog-project.org/wiki/How_to_write_a_Target#Do_I_really_need_to_create_a_separate_DLL.3F(也许作为最后的办法) - robasta
我已经找到了解决方案,请查看下面的答案。 - zvjerka24
5个回答

3
为了完整性:Enterprise Library支持配置错误特殊源,您可以设置一个“appender”来记录出现错误的消息。一旦配置完成,它就可以在没有编程的情况下正常工作。
唯一的缺点是它实际上会记录发生的异常以及特定格式的日志条目详细信息,这个格式无法更改,因此不够灵活。这对故障排查很有帮助,但如果您想提取出出错的日志消息并将其导入到原始日志记录目的地中,则可能不理想(尽管该格式已知,因此可以解析)。

我已经找到了解决方案,请查看下面的答案。 - zvjerka24

2
据我所知,log4net目前不支持备份附加器,log4net的问题列表中有一个未解决的问题。但我认为名为FallbackAppender的项目正好满足您的需求。请访问FallbackAppender了解更多信息。

你说得对,这正是我需要的,但当我尝试并测试它时,似乎它并没有按预期工作。例如,如果您正在使用两个FileAppenders,其中一个失败了,下次恢复该文件时,它会再次尝试使用它,但仍然失败。数据库也存在同样的问题。也许我没有正确配置它,但肯定它不像预期的那样工作。感谢您的时间。 - zvjerka24
我已经找到了解决方案,请查看下面的答案。 - zvjerka24

2
由于log4net的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>

[code]

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

1

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

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

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


我知道,但如果我们在记录日志时遇到异常,有没有一种方法可以在运行时(从代码中)将 appender 从数据库切换到文件? - zvjerka24
不是通过Log4Net本身,而是可以在代码中轻松更新web.config。由于一个日志目标可能会出现问题,拥有两个始终是一个好主意。这意味着您无需担心编写更新web.config的代码。 - Joe Ratzer
我已经找到了解决方案,请查看下面的答案。 - zvjerka24

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>

请参见此页面以获取更多信息。


我知道,但如果我们在记录日志时遇到异常,有没有一种方法可以在运行时(从代码中)将 appender 从数据库切换到文件? - zvjerka24
我将创建一个自定义目标来实现这个目的。我现在会更新我的答案。 - Nick
我已经找到了解决方案,请查看下面的答案。 - zvjerka24

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接