Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为部分代码添加追加器_C#_Asp.net_Log4net - Fatal编程技术网

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
而不是依赖程序集属性(不可靠)。@jeroenmoster
ActivateOptions
成功了!它现在的工作情况和预期的一样。PS:为什么程序集属性不可靠?我觉得这是初始化log4net的首选方法,因为:“log4net将只查找一次程序集级配置属性。当使用log4net程序集级属性控制log4net的配置时,必须确保使用配置属性的程序集首次调用任何
LoggerManager
方法。“这在实践中很容易出错,尤其是在ASP.NET项目中。而且,显式初始化的故障排除要容易得多,因为你知道它是什么时候发生的。@Jeroenmoster好的,我明白了。谢谢你的信息(和答案)。