我在asp.net mvc里用quartz.Net运行一些任务,在执行的任务代码里用log4net记录日志,但却无法产生日志。但同样的记录日志的代码在action里却可以产生日志。 调试了一下,发现在任务代码里 log对象是一个Common.Logging.Simple.NoOpLogger类型的对象(如下图)。所以无法产生日志,但不知为何得到的是Common.Logging.Simple.NoOpLogger类型的对象
ILog 用的是Common.Logging的ILog 改成log4net的ILog就可以了
吊
没用过log4net,看语句 LogManager.GetLogger("System") 的含义应该是获取一个命名 Logger 对象。这可能是通过代码创建添加进去的,也可能是在配置文件中配置的。所以,你应该检查你的代码中是否有先添加,或者检查你的配置文件中是否有配置名称为 System 的 Logger。
谢谢,你的回答,log4net里,如上,System不一定是要事先添加的,它可以现创建这么个对象
@何塞穆里尼奥: 你是说不需要这么配置:http://www.cnblogs.com/chencidi/archive/2010/01/12/1645291.html
或者通过代码实现同上述配置文件相同的功能,只要调用 LogManager.GetLogger("System"),它就会创建一个命名的 Logger 实例,对吗?如果是的话,请你看下 LogManager.GetLogger 的源码,它里面会告诉你,它在什么条件下会返回 NoOpLogger 对象。
@Launcher: 恩,好的,我也尝试看过,但没看出个所以然来
@何塞穆里尼奥: 不是有源代码吗?启用下调是,一步一步就跟进去了。
@Launcher: Ok 好的
@何塞穆里尼奥: 你是用了 Ibatis.net 吧!
http://www.cnblogs.com/xiaogangqq123/archive/2011/07/01/2095431.html
我从 Apache 下载了 log4net.dll ,随便写一句:ILog log = LogManager.GetLogger("System") ,运行返回给我 “log4net.Core.LogImpl” 对象。然后翻遍了 log4net.dll 也没找到你说的 “Common.Logging.Simple.NoOpLogger” 对象,甚至连“Common” 命名空间都没有,就算是用运行时代码编译,那也没必要把命名空间从 log4net 修改到 Common 这种毫无联系的空间中去吧!所以我一搜,才发现,原来你这是 Ibatis.net 的。所以,你问错问题了。
@Launcher: 貌似是Common.Logging这个程序集的 它跟Log4Net什么关系我也没看 当初没想到log4net会出这奇怪的问题
@Launcher: log4net.Core.LogImpl这个对象,我在action里是得到的这个对象 但不知为何在任务代码里得到的是Common.Logging.Simple.NoOpLogger
@何塞穆里尼奥: 已经跟你说过了,这跟 log4net 没关系,是你的 IBatis.Net 的问题,http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html,这跟前面的文章都一样,log4net 从 http://logging.apache.org/log4net/ 下载。IBatis.Net 我不用,我用 EF。
@Launcher: 你啥QQ号?
@何塞穆里尼奥: XXXXXXXX,你要问 IBatis.Net 的问题就别加了,我只用 EF。
@Launcher: ILog 用的是Common.Logging的ILog 改成log4net的ILog就可以了
@何塞穆里尼奥: 请问,我引用了 log4net.dll 后,按照你说的不用做什么配置(通过代码配置或者配置文件,因为我使用 log4c 和 log4cpp 时,确实需要先配置),然后写入如下语句:
ILog log = LogManager.GetLogger("System");
log.Error("asp.net mvc里用log4net无法产生日志.");
我的日志写到哪儿去了?我咋什么都没找到呢?
@Launcher: 我没说不需要配置啊,你查查log4net的用法吧,配置还是挺繁琐的
@何塞穆里尼奥: 我就说嘛,log4c、log4cpp 都要配置(代码或者配置文件),log4net 怎么就不需要了。你这一句话不说清楚,害得我绕了一个大圈,然后又没说使用的 IBatis.Net ,害得我又绕了一大圈。
@Launcher: so sorry