首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇怪的log4net初始化行为

奇怪的log4net初始化行为
EN

Stack Overflow用户
提问于 2013-05-09 15:15:14
回答 1查看 497关注 0票数 1

我在log4net上遇到了一些奇怪的行为,我想知道是否有人能向我解释这一点,我很想学到更多来理解它。

在我的WPF App.xaml.cs OnStartup重写方法中,我有以下代码,它设置用于日志记录的log4net属性:

代码语言:javascript
复制
// 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));

在创建任何其他记录器之前,我都会这样做(至少我是这么认为的)。

在我的配置文件中,我有以下行:

代码语言:javascript
复制
<file type="log4net.Util.PatternString" value="%property{LogLocation}" />

这可以用于指定日志文件位置。但是,我遇到了一种失败的情况--导致日志写入执行目录中的文件名"(null)“。

造成这种情况的原因似乎是下面的伪代码,它位于上述代码之后的同一个OnStartup方法中:

代码语言:javascript
复制
AnyClass ac = new AnyClass();
ac.NoOp();

其中,AnyClass有一个实例化的记录器:

代码语言:javascript
复制
private static ILog logger = LogManager.GetLogger(typeof(AnyClass));

我之所以使用伪代码,是因为我可以用实例化的任何类来复制这个行为,并调用一个方法。如果没有调用任何方法,则日志记录路径将按预期工作。

有几件事要注意:

  1. 当我在调试器中以调试或发布模式运行它时,这是可行的。此错误仅在我直接运行exe或通过“开始而不调试”时出现。
  2. 如果记录器不是静态定义的,那么问题就没有了。
  3. 如果我向AnyClass添加静态构造函数,那么问题就消失了,即: 静态AnyClass() {}
  4. 如果我将对ac.NoOp()的调用移动到一个由OnStartup调用的次要方法,那么错误就会消失。

因此,概括地说,错误只是通过使用静态记录器初始化实例化类并在OnStartup方法中调用该类上的方法而引起的。

我有几种方法来解决这个问题,但我想了解更多,以了解为什么会发生这种情况。

EN

回答 1

Stack Overflow用户

发布于 2013-05-09 15:48:17

我认为ac.NoOp();正在创建一个记录器的新实例,而新实例不知道PatternString的值是什么。因此,正在使用null值。

请参考此链接

代码语言:javascript
复制
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. 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16465201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档