我使用wcf编写了一个c#client-server应用程序。 客户端和服务器工作正常。我使用log4net将日志记录添加到我的wcf服务中。
当我在visual studio中开始我的服务时,日志记录工作正常。但是,当我使用我的控制台应用程序来托管我的wcfservice时,没有记录任何内容。 wcfservice正确运行并且可以访问。
这是我在wcfservice项目的app.config中的配置部分:
<log4net xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:log4net">
<root>
<level value="INFO"/>
<appender-ref ref="name="FileAppender"/>
</root>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="d:\\_serverLib.log" />
<appendToFile value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="INFO" />
<levelMax value="FATAL" />
</filter>
</appender>
以下行被添加到我的wcfservice的assambyinfo.cs中:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
每个使用log4net的类都有对logger的引用:
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
我的错在哪里?
答案 0 :(得分:0)
假设您的配置设置正确且可供应用访问,则可能this as stated in the documentation:
使用属性可以是一种更清晰的方法来定义 应用程序的配置将从中加载。不过值得 注意到属性纯粹是被动的。它们仅供参考。 因此,如果使用配置属性,则必须调用log4net 允许它读取属性。一个简单的电话 LogManager.GetLogger将导致调用程序集上的属性 被阅读和处理。 因此必须进行日志记录 在应用程序启动期间尽早调用,以及 当然,在加载和调用任何外部程序集之前。
因此,在加载WCF服务之前,您需要在控制台应用程序的主程序中调用LogManager.GetLogger
(您实际上不必记录任何内容)
答案 1 :(得分:0)
如果有人遇到此问题并且无法找到解决方案,那么我的问题是当我的项目设置为.NET 4.5.1时我从nuget添加了log4net。我不得不将我的项目支持到.NET 4.5 - 但是log4net仍然试图使用4.5.1。我不得不更改packages.config中的值:
<package id="log4net" version="2.0.3" targetFramework="net45" />
这解决了我的问题。