我们如何将elmah日志记录集成到servicestack中

时间:2013-04-14 04:22:58

标签: servicestack elmah

我是servicestack和elman logging的新手。

任何机构都可以建议我们如何将elmah集成到服务堆栈应用程序中。

谢谢...

4 个答案:

答案 0 :(得分:4)

如果您有现有的日志记录解决方案,那么您可以使用ServiceStack.Logging.Elmah项目。它可以通过NuGet获得。

除了原定的记录器之外,还会将异常,错误和致命的呼叫记录到Elmah。对于所有其他日志类型,仅使用原始记录器。

因此,如果您已经在使用Log4Net,那么您可以像这样配置Elmah

ElmahLogFactory factory = new ElmahLogFactory(new Log4NetFactory());

如果您不想包装现有日志,那么您可以研究将Elmah添加到任何ASP.NET网站。没有理由因为您正在使用ServiceStack而无法工作。

答案 1 :(得分:3)

using ServiceStack.Logging;
using ServiceStack.Logging.Elmah;
using ServiceStack.Logging.NLogger;

public AppHost()
        : base(
            "description", 
            typeof(MyService).Assembly)
    {
        LogManager.LogFactory = new ElmahLogFactory(new NLogFactory());
    }

    public override void Configure(Container container)
    {
        this.ServiceExceptionHandler += (request, exception) =>
            {
                // log your exceptions here
                HttpContext context = HttpContext.Current;
                ErrorLog.GetDefault(context).Log(new Error(exception, context));

                // call default exception handler or prepare your own custom response
                return DtoUtils.HandleException(this, request, exception);
            };

        // rest of your config
    }
}

现在你的ServiceStack错误出现在Elmah中(假设你已经设置了web.config等)。

答案 2 :(得分:2)

实际上kampsj的答案比Gavin更好,因为Gavins通过调用显式elmah logger然后默认的servicestack错误处理来导致双重记录到elmah ......它本身已经进行了日志记录。

所以你需要的就是这个(下面假设你想要用Elmah包裹NLog

public class YourAppHost : AppHostBase
{
    public YourAppHost() //Tell ServiceStack the name and where to find your web services
        : base("YourAppName", typeof(YourService).Assembly)
    {
        LogManager.LogFactory = new ElmahLogFactory(new NLogFactory());
    }

    //...just normal stuff...
}

你可以这样做:

ElmahLogFactory factory = new ElmahLogFactory();

...但是您可能应该为非错误日志记录包装另一种类型的记录器,例如Debug和Warn。

答案 3 :(得分:0)

本节介绍configuring ElmahLogging.Elmah UseCase,了解ServiceStack和Elmah的工作示例。

在初始化ServiceStack AppHost之前,可以在ElmahLogFactory中配置Global.asax,例如:

public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        var debugMessagesLog = new ConsoleLogFactory();
        LogManager.LogFactory = new ElmahLogFactory(debugMessagesLog, this);
        new AppHost().Init();
    }
}