对于我的代码的某一部分,我需要将所有消息记录到第二个文件,特定于两个类中完成的每个动作实例。
这些类(Parser
和Importer
)都具有以下记录器定义:
private static ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
两者都有这种方法:
public void AddAppender(IAppender appender)
{
((Logger)_logger.Logger).AddAppender(appender);
}
整个项目(ASP.NET WebForms)日志记录在AssemblyInfo.cs中初始化:
[assembly: XmlConfigurator]
现在,当用户触发某个操作时,会发生以下情况:
var logFile = new FileInfo(ConfigurationManager.AppSettings["uploadDir"] + "/" + importId + "_log.txt");
var appender = new FileAppender() {
Threshold = Level.Info,
Layout = new PatternLayout("%message%newline"),
File = logFile.FullName
};
var parser = new Parser(...);
parser.AddAppender(appender);
var candidates = parser.Parse(File.ReadAllLines(uploadFile.FullName));
var importer = new Importer(...);
importer.AddAppender(appender);
importer.Import(candidates, false, ignoreWarnings.Checked);
我的期望是,将在logFile
位置创建一个文件,该文件将包含来自两个类别之一的所有INFO
及以上消息。
但事实并非如此 - 根本没有创建文件。
我做错了什么,如何才能做到这一点?
答案 0 :(得分:1)
根据documentation of FileAppender
:
此appender将首先尝试打开文件进行写入 调用
ActivateOptions
。这通常是在期间 组态。如果无法打开文件来写入appender 每次记录消息时都会尝试再次打开该文件 appender。如果在发送消息时无法打开文件进行写入 记录然后该appender将丢弃该消息。
这个文档有点含糊不清,因为它似乎意味着当你尝试在所有情况下都尝试记录消息时会打开文件,但这不是真的 - 除非你打电话给ActivateOptions
, appender永远不会被认为是可以追加的。