我在.NET 3.5控制台应用程序中使用log4net,并希望在控制台标准输出和RollingFileAppender中看到我生成的日志消息。文件输出像魅力一样工作,但是当我执行时,我看到流向控制台标准的状态消息流。我想跳过所有状态信息,只看到我以编程方式生成日志文件的相同消息。
以下是我运行应用后看到的示例:
log4net: XmlHierarchyConfigurator: Configuration update mode [Merge].
log4net: XmlHierarchyConfigurator: Logger [root] Level string is [DEBUG].
log4net: XmlHierarchyConfigurator: Logger [root] level set to [name="DEBUG",value=30000].
log4net: XmlHierarchyConfigurator: Loading Appender [Console] type: [log4net.Appender.ConsoleAppender]
log4net: PatternParser: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
并且它一直持续到它描述记录器对象的整个实例化为止。
如何关闭此功能?我可以吗?我已经尝试了各种配置文件设置,但没有什么能让它们消失!哎呀...
答案 0 :(得分:17)
设置debug = false
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net debug="false">
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="your file name" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="RollingLogFileAppender" />
</root>
</log4net>
</configuration>
答案 1 :(得分:15)
我刚刚遇到了同样的问题(不出所料,这就是我发现这个问题的方法)。
无论如何,我的问题,也可能是你的问题,是由网页/应用配置文件设置“<
log4net debug = true >
”引起的。太明显了吧?我已经从web片段粘贴了我的app.config设置的骨架,并专注于appender,而不是真正给root log4net元素第二眼。但是你现在有了。这是在常见问题解答中,但其他一些事情引起了我的注意而不是这个属性。
答案 2 :(得分:3)
请尝试一步一步地使用新项目复制问题(首先引用没有appender的log4net,然后使用控制台appender,然后使用两个appender)。如果它显示相同的行为,请发布log4net的完整配置。
您也可以尝试使用log4net Config Examples page中的配置示例。
修改:这可能是这些消息的原因:How do I enable log4net internal debugging。
答案 3 :(得分:2)
如果您的代码中有此内容:
log4net.Config.BasicConfigurator.Configure();
将其更改为:
log4net.Config.XmlConfigurator.Configure();
答案 4 :(得分:1)
您能提供log4net配置部分的外观,或者至少如何配置它?我最好的猜测是this answer是正确的,因为你配置了log4net内部调试。要么你或者你在项目中拥有log4net的源代码,你要使用自己的代码进行编译。这将导致它获取您的配置并以相同的方式运行它。
答案 5 :(得分:1)
在我继承的应用程序中,有一行:
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
将其更改为false
解决了问题。
答案 6 :(得分:0)
嗯,确实说根记录器级别设置为DEBUG。如果无法访问配置文件或启动日志记录的代码,我猜你会隐式使用根记录器的默认值,
答案 7 :(得分:0)
请查看log4net faq。他们真的遇到了你可能遇到的所有常见陷阱。
答案 8 :(得分:0)
我遇到与OP相同的问题。在log4net.config中我设置了debug = false。我还有一个FileAppender集,定义了PatternLayout。当我使用log.Warn(“test”)时,我得到了预期的格式化结果写入预期的txt文件。但是,我还会将更详细的字符串写入控制台(stdout)。
编辑:我的修复是在我的代码中消除这一行 BasicConfigurator.Configure(); 请注意,在我的配置中没有明确告诉log4net写入控制台和声明的FileAppender。实际上,声明了log4net debug = false并且问题仍然存在。 log4net主页上的示例代码不小心调用BasicConfigurator.Configure();虽然我使用log4net,但是库存在许多雄心勃勃的开源项目的同样问题。存在冗长的XML驱动配置,为开发人员提供了数千个选项,这些选项应该具有更加简化的可用界面。程序员不倾向于重视彼此的时间。我们在用户界面中应用“不要让我思考”规则,但不在我们的机器界面中应用。就好像我们嘲笑了一个对优秀设计具有普遍性的核心原则。复杂性应该可供开发人员使用,但不应丢失几个小时来完成核心功能。考虑到这一点,我会说log4net的设计很差。与大多数软件一样,复杂性也有很多复杂性。如果指导项目的开发人员更有才能,那么库的最常见用例(引用然后使用它来登录app文件夹中的文本文件)可以在没有任何先前知识的情况下暴露5-10分钟来实现。情况并非如此,因为接口设计和配置方法。它突出了我讨厌大多数软件工程师思考方式的原因。对于最常见的用例,他们无法看到简单性的指数值,而是假设他们使界面更加令人费解,它将为其他开发人员增加更多价值。他们受到自我和无知的驱使。难怪大多数人都是社会弃儿。