2

我们将 log4net 用于我们当前的应用程序日志记录,但我不喜欢我们目前围绕它构建的日志记录框架的方式。例如,它目前有一个单点故障,如果由于某种原因它无法连接到日志服务器,那么您将没有日志记录。我想将它构建为一个灵活但简单的框架,允许我指定一个或多个“备份”附加程序以在主附加程序失败时使用(例如,如果日志服务器关闭,则写入文件反而)。

你们有没有人偶然发现过这样的东西,你喜欢并且觉得写得很好?我不介意自己动手​​,但我非常喜欢不要重新发明轮子

谢谢

4

3 回答 3

5

SeqSerilog的组合支持这一点:记录器将所有事件缓冲到一组滚动文件中,然后异步读取这些文件并使用 HTTP/S 将它们发送到服务器。

配置如下:

var log = new LoggerConfiguration()
    .WriteTo.Seq("http://my-seq-server", bufferBaseFilename: "C:\\Logs\\myapp")
    .CreateLogger();

我在这两个项目上工作——渴望得到一些关于这种方法如何符合要求的反馈(如果你足够幸运能够切换到 Serilog ;))

于 2014-03-22T10:37:13.700 回答
2

我没有遇到任何已经建成的东西。我建议您制作自己的 appender,它使用现有的 appender,但添加属性以在发生故障时做什么。您可以使用AppenderSkeleton作为新附加程序的基类,然后从那里调用您要使用的附加程序的附加函数。

因此,当 log4 使用您的记录器时,它将是这样的(注意:这不完整,但应该给您一个起点):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net.Appender;
using log4net.Core;

namespace logger {
    class FailoverAppender : AppenderSkeleton {

        protected override void Append(LoggingEvent loggingEvent) {
            // Send the log message to the web service.
            try {
                FirstAppender.Append(loggingEvent);
            }
            catch (Exception e) {
                try{
                    SecondAppender.Append(loggingEvent);
                }
                catch (Exception e2){
                    ErrorHandler.Error("An error occurred while connecting to the logging service.", e);
                }
            }
        }
    }
}

我希望这可以帮助您入门,也许如果您完成了它,您也可以在这里发布解决方案。

于 2012-04-05T20:12:16.693 回答
0

我实际上决定改用 NLog,因为 log4net 设置起来很痛苦。NLog 更易于使用,更易于设置,并且代码库保持最新(log4net 几乎被废弃)

于 2012-04-13T16:01:25.417 回答