我在log4net上遇到了一些奇怪的行为,我想知道是否有人能向我解释这一点,我很想学到更多来理解它。
在我的WPF App.xaml.cs OnStartup重写方法中,我有以下代码,它设置用于日志记录的log4net属性:
// logLocation is a path to a subdir in the users' appdata roaming dir
log4net.GlobalContext.Properties["LogLocation"] = logLocation;
logger = LogManager.GetLogger(typeof(App));
logger.Info("OnStartup: " + string.Join(" ", e.Args));在创建任何其他记录器之前,我都会这样做(至少我是这么认为的)。
在我的配置文件中,我有以下行:
<file type="log4net.Util.PatternString" value="%property{LogLocation}" />这可以用于指定日志文件位置。但是,我遇到了一种失败的情况--导致日志写入执行目录中的文件名"(null)“。
造成这种情况的原因似乎是下面的伪代码,它位于上述代码之后的同一个OnStartup方法中:
AnyClass ac = new AnyClass();
ac.NoOp();其中,AnyClass有一个实例化的记录器:
private static ILog logger = LogManager.GetLogger(typeof(AnyClass));我之所以使用伪代码,是因为我可以用实例化的任何类来复制这个行为,并调用一个方法。如果没有调用任何方法,则日志记录路径将按预期工作。
有几件事要注意:
因此,概括地说,错误只是通过使用静态记录器初始化实例化类并在OnStartup方法中调用该类上的方法而引起的。
我有几种方法来解决这个问题,但我想了解更多,以了解为什么会发生这种情况。
发布于 2013-05-09 15:48:17
我认为ac.NoOp();正在创建一个记录器的新实例,而新实例不知道PatternString的值是什么。因此,正在使用null值。
public static Logger getLogger(String name)
Retrieve a logger named according to the value of the name parameter.
If the named logger already exists, then the existing instance will be returned.
Otherwise, **a new instance** is created. https://stackoverflow.com/questions/16465201
复制相似问题