我正在使用visual studio 2008,.net framework 3.5,windows 7上的解决方案。我已经创建了一个log4net库,可以写入txt文件并想在我的几个项目中使用它解决方案以及在Visual Studio本地运行的同一解决方案中的wcf服务。
我从解决方案的控制台应用程序启动程序。控制台应用程序调用其他项目,这些项目使用log4net。在工作流程的这个级别,日志写得很好。调用wcf服务时出现问题。 wcf服务使用日志,但log4net不会写入文件。
在控制台项目中,我有这个:
在AssemblyInfo.cs上:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
在App.config上我有log4net配置。
在Program.cs上,我有Main方法:
LogManager.GetLogger("Initialise log4net from the current assembly attributes");
在WCF服务上我有:
与Assembly项目相同的AssemblyInfo.cs。
在Web.config上与控制台项目上的App.config相同。
在Service1.svc的构造函数上,我有:
LogManager.GetLogger("Initialise log4net from the current assembly attributes");
这就是我的App.config和Web.Config之类的结果:
在configSections标记内:
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
并在主配置标记内:
<log4net>
<root>
<level value="DEBUG"/>
<appender-ref ref="LogFileAppender" />
</root>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
<file value="C:\test3.txt"/>
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d [%t] %-5p %c %m%n" />
</layout>
</appender>
</log4net>
我该如何解决这个问题?
答案 0 :(得分:3)
您是否有XmlConfigurator的示例,以便我可以配置日志记录?
var logpath = HostingEnvironment.MapPath("~/web.config");
var fileInfo = new FileInfo(logpath);
if (fileInfo.Exists == false)
{
throw new InvalidOperationException("Can't locate the web.config file");
}
log4net.Config.XmlConfigurator.ConfigureAndWatch(fileInfo);
请注意,只有带有FileInfo的ConfigureAndWatch方法的重载才能观看app.config或web.config,因为它直接读取.config文件而不是使用System.Configuration(一旦它读取文件就无法重新读它)。
文档解释了这个here。
由@pyram编辑:因为两个项目都记录到同一个文件,所以必须将这一行添加到两个项目的appender配置中:
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
答案 1 :(得分:0)
WCF中的Log4Net配置应如下所示:
这会将log4net软件包添加到引用中,仔细检查。
在AssemblyInfo.cs中添加以下行
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.xml", Watch = true)]
在服务中添加日志属性以在每种方法中使用它:
private static readonly log4net.ILog _log = log4net.LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
按以下方式使用_log:
catch (System.Exception ex) _log.Error(ex);