首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在日志记录时更改log4net FileAppender

在日志记录时更改log4net FileAppender
EN

Stack Overflow用户
提问于 2009-09-24 10:30:28
回答 2查看 1.9K关注 0票数 0

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

这个进程通常是单线程的,但我们不能保证代码中没有其他线程有时不会尝试向log4net写一些东西。

似乎正在起作用的是:

第一次收到请求时,我们将"PerRequest“FileAppender配置为:

代码语言:javascript
复制
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);

然后,每次我们得到一个新请求时,我们执行以下操作:

代码语言:javascript
复制
fileAppender.File = makeNewRequestLogName();
log.InfoFormat("Configured PerRequest logger to log to '{0}'", fileAppender.File);
fileAppender.ActivateOptions();

在请求结束时,我们将PerRequest记录器“配置”为登录到单个文件名,因为我们无法找到一种令人满意的方法来关闭它。

效果很好..。但是在沉重的负载下,我们开始注意到"PerRequest“日志文件通常会有大量的”缺失“日志行。例如,类似这样的事情:

代码语言:javascript
复制
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

对于我们在日志文件中看到的内容,没有很好的解释--没有代码路径(即使抛出异常)来解释“缺失”日志行--在19:17:36和19:17:37之间的线程上应该记录了一些东西(实际上相当多的东西)。

诚然,整个技术都有点不可靠,但我们想不出另一种方法来做到这一点。

因此,第一个问题是:是否有更好的方法来实现我们想要的?

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

不存在另一个进程试图登录到同一个文件的风险,因为正如代码中的注释所指出的,我们使用GUID分配日志文件名--没有可能有另一个进程试图登录到同一个文件.但另一条线索呢?我们不能排除这种可能性。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-25 00:21:43

来自log4net常见问题

许多开发人员面临着如何区分来自同一类但不同客户端请求的日志输出的问题。他们想出了巧妙的机制来将日志输出输出到不同的文件中。在大多数情况下,这不是正确的方法。 使用上下文属性或堆栈(ThreadContext)更简单。通常,在开始处理客户端请求时,可以使用ThreadContext.Properties" ID“= "XXX”客户端特定信息,例如客户端的主机名、ID或任何其他区别信息。此后,日志输出将自动包含上下文数据,这样即使日志被输出到同一个文件,您也可以将日志与不同的客户端请求区分开来。 有关更多信息,请参见ThreadContext和PatternLayout类。

票数 2
EN

Stack Overflow用户

发布于 2009-09-24 10:45:53

因此,第一个问题是:是否有更好的方法来实现我们想要的?

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

如果不是,那么创建您自己的自定义模式布局并将请求详细信息作为日志模式的一部分如何呢?一个例子 Google发现。

如果是这样的话,如何扩展RollingFileAppender并更改新的文件条件,使其不与文件大小(或其他什么)相关,而是基于请求?

我猜你已经用LockingModel做了实验

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1470851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档