我们正试图配置一个服务器进程,以便每次收到请求时,它都会将该请求记录到一个新的文件名中。
该进程通常是单线程的,但我们不能保证代码中的任何其他线程有时都不会尝试向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分配日志文件名——其他进程不可能尝试记录到相同的文件。..但另一个线程?我们不能排除这种可能性。