【问题标题】:Logging debug statements from multiple requests in parallel using log4net使用 log4net 并行记录来自多个请求的调试语句
【发布时间】:2014-11-02 10:57:27
【问题描述】:

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

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

我可以使用 log4net.如果没有,有人可以建议任何其他方法吗?

我能否为每个请求创建一个包含一个节点的 XML 文件,然后针对特定请求将调试语句发送到该节点。

【问题讨论】:

  • 使用互斥锁来同步它——但是你失去了并行执行.....

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我已经找到了解决方案。我们可以继续登录到内存(例如 StringBuilder),然后在请求结束时,立即将集合语句写入日志。

    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");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-21
      • 2019-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      相关资源
      最近更新 更多