log4net不起作用
嘿,我有我的web.config这个configuration
<log4net> <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> <param name="File" value="mylog.log" /> <param name="AppendToFile" value="true" /> <layout type="log4net.Layout.PatternLayout"> <param name="Header" value="" /> <param name="Footer" value="" /> <param name="ConversionPattern" value="%d [%t] %-5p %m%n" /> </layout> </appender> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" > <layout type="log4net.Layout.PatternLayout"> <param name="Header" value="[Header]\r\n" /> <param name="Footer" value="[Footer]\r\n" /> <param name="ConversionPattern" value="%d [%t] %-5p %m%n" /> </layout> </appender> <root> <level value="DEBUG" /> <appender-ref ref="LogFileAppender" /> <appender-ref ref="ConsoleAppender" /> </root> </log4net>
但是log4net不工作。 我的项目编译好,我也没有得到任何错误debugging。 我告诉log.debug("somemessage")
可以正常运行,但是我找不到mylog.log
文件,那么它在哪里?
这种types的一个问题是确保通过在AssemblyInfo.cs
放置以下行来将XmlConfigurator
属性添加到程序集中:
[assembly: log4net.Config.XmlConfigurator]
否则,log4net永远不会激活。
我想,无论是log4net根本没有logging,或该文件没有结束在你期望的地方。
首先,你真的叫了吗?
XmlConfigurator.Configure()
你的代码在任何地方? 如果上面的xml代码片段在应用程序configuration文件中,这个调用就可以完成。 如果xml代码片段在它自己的文件中,则需要使用.Configure(string)
重载,该重载将文件的path作为参数。 没有这个调用(或者显然是Kirk Woll提到的程序集属性),那么log4net将不会被logging。
如果您认为这一切都已经完成,并且log4net应该正在logging,那么在进一步debugging的时候,也许应该为日志文件放置一个完全合格的path。 这将让你确定文件应该在哪里。
还有一个小问题,请看这里: http : //logging.apache.org/log4net/release/manual/configuration.html#dot-config
[assembly: log4net.Config.XmlConfigurator]
方法不适用于app.config。 如果从app.configconfigurationlog4net,则必须使用log4net.Config.XmlConfigurator.Configure()
方法。
这里是我的log4net被certificate是不可靠的清单:
- 确保在构build时将log4net.config文件复制到bin \文件夹(在编译器中设置为“Copy if newer”)
- 当处理已安装的代码时,确保log4net.config出现了(在编译器中设置为“Content”)
- 确保进程运行的用户具有要写入日志的文件夹的写权限
- 如果有疑问,给c:\ temp \的混杂权限,并得到一切logging到那里()
- 启动Sysinternal / Dbgview.exe,看看是否告诉你什么
为一个ASPNET MVC项目添加
log4net.Config.XmlConfigurator.Configure();
Global.asax.cs也有助于:
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); AuthConfig.RegisterAuth(); **log4net.Config.XmlConfigurator.Configure();** } }
我有过日志系统默默地失败而没有引发exception的经验。 我想这是有道理的,因为如果logging器logging错误,那么它如何logging错误,它无法执行日志?
因此,如果文件不是在磁盘上创build的,请先查看文件系统权限以确保您的应用程序正在运行的用户可以将新文件写入该磁盘位置。
出于testing目的,您可能需要在磁盘上手动创build应该写入的文件,并打开权限,以供所有人写入。 如果logging器开始写入,那么你知道它是基于权限而不是基于configuration的。
这些是最终让我的文件logging工作的步骤:
- – 检查AssemblyInfo.cs包含以下属性。 [程序集:log4net.Config.XmlConfigurator] 。 这加载log4net。
- 检查日志目录是否有写入权限。
- 检查logging器是否具有指定的格式。 这是通过检查您的configuration中的每个元素具有指定的布局元素来完成的。 例如:
<appender name="MainLogger"... <layout type="log4net.Layout.SimpleLayout"/>
- 最后,尝试打开log4net内部日志logging以启用控制台日志logging并检查控制台。 为此,请将
<add key="log4net.Internal.Debug" value="true"/>
到您的appSettings
。
<param name="File" value="mylog.log" />
正在说“写mylog.log到实际的文件夹”。 这意味着如果您的web应用程序在IIS下,则日志将被写入到C:\ inetpub \ wwwroot \ appname \ mylog.log。
如果日志文件不存在,那么也许应用程序运行的帐户没有文件夹的写入权限。 您可以从SysInternals运行进程监视器来查看是否以及在哪里写入文件。
在debugging模式下运行VS,查看是否有任何exception(Debug-> Exceptions-> CLR Exceptions,check Thrown)。
几个小时后,我想出了为什么它不适合我
我有:
public static class Program { private static CommunicationManager _bcScanner = new CommunicationManager(); private static ILog _log = LogManager.GetLogger(typeof(Program)); private static SocketServer socketListener;
但应该是:
public static class Program { private static ILog _log = LogManager.GetLogger(typeof(Program)); private static CommunicationManager _bcScanner = new CommunicationManager(); private static SocketServer socketListener;
所以确保ILog是在第一线….