代码之家  ›  专栏  ›  技术社区  ›  Paul Hollingsworth

在记录时更改log4net FileAppender

  •  0
  • Paul Hollingsworth  · 技术社区  · 16 年前

    我们正试图配置一个服务器进程,以便每次收到请求时,它都会将该请求记录到一个新的文件名中。

    该进程通常是单线程的,但我们不能保证代码中的任何其他线程有时都不会尝试向log4net写入内容。

    似乎奏效的是:

    第一次收到请求时,我们按如下方式配置“PerRequest”FileAppender:

    fileAppender = new FileAppender();
    log.InfoFormat("Initializing log4net per request logging");
    log4net.Layout.PatternLayout layout = new Layout.PatternLayout("%date %property{processid} %property{username} %-5level %logger - %message%newline");
    fileAppender.Layout = layout;
    layout.ActivateOptions();
    fileAppender.AppendToFile = true;
    fileAppender.Name = "PerRunLogger";
    fileAppender.File = makeNewRequestLogName(); // Returns a unique filename (uses a Guid)
    log.InfoFormat("Configured PerRequest logger to log to '{0}'", fileAppender.File);
    fileAppender.ActivateOptions();
    log4net.Config.BasicConfigurator.Configure(fileAppender);
    

    然后,每次收到新请求时,我们都会执行以下操作:

    fileAppender.File = makeNewRequestLogName();
    log.InfoFormat("Configured PerRequest logger to log to '{0}'", fileAppender.File);
    fileAppender.ActivateOptions();
    

    2009-09-23 19:17:17,133 4332 hollingp DEBUG PostProcessInfrastructure.PostProcessRunner - Started post processing
    * normal log lines here, omitted for brevity *
    2009-09-23 19:17:36,414 4332 hollingp DEBUG PluginRegistry.PostProcessVersions.PostProcessPluginCacheVersion - About to run pub_GetPostProcessingVersion stored proc
    
    *Normally lots of log lines here, but every now and then, NOTHING *
    
    2009-09-23 19:17:37,742 4332 hollingp DEBUG PostProcessInfrastructure.PostProcessRunner - Finished post processing
    

    所以第一个问题是:是否有更好的方法来实现我们想要的东西?

    第二个问题是:有人能解释一下可能会发生什么吗?怀疑是需要执行一些线程安全/锁定,但在哪里?如果是这样的话,需要锁什么?

    没有再次发生的风险 尝试记录到同一文件,因为正如代码中的注释所示,我们使用GUID分配日志文件名——其他进程不可能尝试记录到相同的文件。..但另一个线程?我们不能排除这种可能性。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Zack Elan    16 年前

    log4net FAQ :

    许多开发人员面临着区分来自同一类但不同客户端请求的日志输出的问题。他们想出了巧妙的机制,将日志输出扇出到不同的文件中。在大多数情况下,这不是正确的方法。

    使用上下文属性或堆栈(ThreadContext)更简单。通常,会有ThreadContext。属性[“ID”]=“XXX”客户端特定信息,例如客户端的主机名、ID或开始处理客户端请求时的任何其他区分信息。此后,日志输出将自动包含上下文数据,这样即使日志输出到同一文件,您也可以将其与不同的客户端请求区分开来。

    有关更多信息,请参阅ThreadContext和PatternLayout类。

        2
  •  2
  •   si618    16 年前

    所以第一个问题是:是否有 实现我们想要的更好的方法?

    每个请求都必须是单独的文件吗?

    如果没有,那么创建自己的自定义模式布局并将请求详细信息作为日志模式的一部分怎么样? An example 谷歌发现。

    如果是的话,扩展一下怎么样 RollingFileAppender 并更改新的文件条件,使其与文件大小(或其他任何内容)无关,而是基于请求?

    我想你已经尝试过 LockingModel ?

    推荐文章