C# 为部分代码添加追加器
对于代码的某一部分,我需要将所有消息记录到第二个文件中,具体到两个类中完成的操作的每个实例 这些类(C# 为部分代码添加追加器,c#,asp.net,log4net,C#,Asp.net,Log4net,对于代码的某一部分,我需要将所有消息记录到第二个文件中,具体到两个类中完成的操作的每个实例 这些类(Parser和Importer)都具有以下记录器定义: private static ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 两者都有这种方法: public void AddAppender(IAppender appender) { ((Logger)_logg
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
及以上消息
然而,事实并非如此——根本没有创建任何文件
我做错了什么?我如何才能做到这一点
此追加器将首先尝试打开文件进行写入
调用激活选项。这通常是在
配置如果无法打开文件以写入追加器
将在每次登录消息时再次尝试打开该文件
追加者。如果无法打开文件进行写入,则
则此追加器将丢弃该消息
此文档有点模棱两可,因为它似乎暗示在所有情况下尝试记录消息时都会打开文件,但事实并非如此——除非调用
ActivateOptions
,否则永远不会认为追加器已准备好追加。调用appender.ActivateOptions()
施工帮助后立即执行?另外,这是您使用log4net的唯一部分,还是您可以从其他地方看到它的工作情况?否则,初始化可能根本就不会发生。尝试显式使用XmlConfiguration.ConfigureAndWatch
而不是依赖程序集属性(不可靠)。@jeroenmosterActivateOptions
成功了!它现在的工作情况和预期的一样。PS:为什么程序集属性不可靠?我觉得这是初始化log4net的首选方法,因为:“log4net将只查找一次程序集级配置属性。当使用log4net程序集级属性控制log4net的配置时,必须确保使用配置属性的程序集首次调用任何LoggerManager
方法。“这在实践中很容易出错,尤其是在ASP.NET项目中。而且,显式初始化的故障排除要容易得多,因为你知道它是什么时候发生的。@Jeroenmoster好的,我明白了。谢谢你的信息(和答案)。