使用log4net并行记录来自多个请求的调试语句

时间:2014-09-09 05:56:40

标签: c# asp.net logging log4net error-logging

我需要在Asp.Net WebService中编写用于调试的日志语句。我已经使用了log4net。

如果我在IIS上并行执行8个请求,则日志语句将相互混合。我需要集中写一个请求的声明,然后是另一个请求。

我可以使用log4net执行此操作。如果没有,有人可以提出任何其他方法吗?

我是否可以拥有一个XML文件,其中每个请求都有一个节点,然后是针对特定请求转到该节点的调试语句。

2 个答案:

答案 0 :(得分:1)

根据线程ID,没有简单的方法来分派日志:如果使用文本记录器,则在写入日志时无法对日志元素进行分组。以下是回避此问题的一些可能性:

  • 使用LogParser之类的工具,根据线程ID重新组合条目,登录到单个日志文件并查询日志文件。这使您可以将原始视图保留在日志中,然后在其上创建报告。
  • 使用AdoNetAppender登录数据库,并查询线程ID上的数据库分组。这是一个可行的解决方案,但我非常喜欢第一个解决方案,因为您丢失了对日志的简单访问权。
  • 在配置中命名所有线程,然后创建与线程一样多的appender;使用PropertyFilter调度仅记录每个appender一个线程

答案 1 :(得分:1)

我找到了解决方法。我们可以继续登录内存(例如StringBuilder),然后在Request的末尾,立即将这些集合语句写入日志。

protected void Application_BeginRequest(object sender, EventArgs e)
{
    StringBuilder sb = new StringBuilder();
    HttpContext.Current.Items["DebugLog"] = sb;
    Logger.LogMemory("Timestamp::" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
}

protected void Application_EndRequest(object sender, EventArgs e)
{
    Logger.Log(((StringBuilder)HttpContext.Current.Items["DebugLog"]).ToString());
}

class Logger
{
    public static void Log(string message)
    {
        //Log here
    }

    public static void LogMemory(string message)
    {
        ((StringBuilder)HttpContext.Current.Items["DebugLog"]).Append(message);
    }
}

class A: Logger
{
    public void SomeMethod()
    {
        LogMemory("some message for logging");
    }
}