【问题标题】:ServiceStack logging and SSE in a single interface?单个界面中的 ServiceStack 日志记录和 SSE?
【发布时间】:2018-01-30 19:27:04
【问题描述】:

所以,我们的项目最近开始使用 ServiceStack 中的服务器发送事件。我们的项目还使用 log4net 提供程序登录 log4net。现在我已经使用 SSE 完成了几个组件,我想知道是否其他人在想我在这里......

我通常使用 log4net 的“调试”级别来获得真正的“调试”体验。当我在开发服务器上,或者当我试图找出问题的根源时......我会将日志记录级别更改为“调试”并前往城镇。虽然我不会使用“调试”在更高的环境中运行 - 我发现相同级别的信息是我可能有兴趣发送给客户的信息。我在服务中有一些长期运行的进程,它通过 SSE 与 Web 仪表板通信以报告更新。我发现我通常会记录到“调试”的信息类型通常是我想发送到我的仪表板的。正如你可以想象的那样,我的代码开始看起来像这样,并且在许多方面:

var msg = $"Processed {count} records.";
MessageLog.Debug(msg);
ServerEvents.NotifyChannel(channelName, selector, msg);

看到这一点,我想创建一个瘦包装器,以便通过一次调用将消息发送到日志、SSE 或两者。目前 ServiceStack 中是否存在这种类型的设置?我意识到它是高级别的,并且有一些细节需要解决(日志级别、通道和选择器值),但我必须相信有一些方法可以简化它。

【问题讨论】:

  • 我一直在尝试为 SS 提供调试/管理仪表板的想法,我认为这将是完美的。选择日志记录级别并将其填充到插件的网页中。其他想法包括按请求进行流量分析、注册插件、活动会话(来自缓存提供者)等。
  • @jklemmack - 我应该在我的帖子中更清楚 - 我在这里询问的 ServiceStack 项目是一个正在运行的 Windows 服务。我提到的与之通信的 Web 仪表板是一个使用 TypeScript 的 node.js 项目。但我同意,我也玩过这个,使用 AutoQuery 查询请求和 log4net 日志......连接起来很容易,只是没有在专用页面或任何东西上。我们只是为此使用了标准的 AutoQuery 管理页面。

标签: asp.net-web-api servicestack log4net


【解决方案1】:

没有任何内置功能,有几种方法可以实现,我更喜欢使用采用ILog 的扩展方法,例如:

public static void NotifyChannel(this IServerEvents server, 
    string channel, string selector, object message, ILog log)
{
    if (log.IsDebugEnabled)
        log.Debug(message);

    server.NotifyChannel(channel, selector, message);
}

或者您可以创建一个适配器 IServerEvents 类,您可以将其注册为单独的依赖项,例如:

container.Register(c => 
    new LoggingServerEvents(c.Resolve<IServerEvents>()));

将 API 调用记录并委托给 IServerEvents 依赖项,例如:

class LoggingServerEvents : IServerEvents
{
    private static ILog Log = LogManager.GetLogger(typeof(LoggingServerEvents));

    private IServerEvents sse;
    public LoggingServerEvents(IServerEvents sse) => this.sse = sse;

    public void NotifyChannel(string channel, string selector, object message)
    {
        if (Log.IsDebugEnabled)
            Log.Debug(message);

        sse.NotifyChannel(channelName, selector, message);
    }

    //...
}

当您希望消息也被记录时,您可以像普通依赖项一样在服务中引用它而不是 ServerEvents,例如:

public class MyServices : Service
{
    public LoggingServerEvents LoggingServerEvents { get; set; }

    public object Any(MyRequest request)
    {
        //ServerEvents.NotifyChannel(channelName, selector, msg);
        LoggingServerEvents.NotifyChannel(channelName, selector, msg);
    }
}

【讨论】:

  • 这里有两个聪明的想法,我试一试。我不确定我是否在框架中遗漏了一些东西,在我开始在这里创建一些东西之前总是想问一下。感谢您的回复 - 谢谢!
猜你喜欢
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
相关资源
最近更新 更多