IIS 7.5托管的WCF中的log4net没有写日志文件

时间:2011-10-21 20:00:45

标签: wcf iis log4net

首先抱歉我的英语不好) 我已经阅读了很多关于log4net loggining的文章,但不幸的是我的问题还没有解决...... 我在IIS托管的WCF服务中通过log4net进行日志记录存在问题。

重要代码的某些部分

我的服务代码部分:

using System;
    [assembly: log4net.Config.XmlConfigurator(Watch = true)]
    namespace Service
    {
        [ServiceBehavior]
        public class MyService : IService
        {
            private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

服务方法的一部分

public string Name()
        {
            log.Info("return name ");
            return "NAME";
        }

这是我为log4net服务的配置文件

?xml version="1.0"?>
<configuration>
  <!-- Register a section handler for the log4net section -->
  <configSections>
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
  </configSections>
  <appSettings>
    <!-- To enable internal log4net logging specify the following appSettings key -->
    <!-- <add key="log4net.Internal.Debug" value="true"/> -->
  </appSettings>
  <!-- This section contains the log4net configuration settings -->
  <log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
      <file value="log-file.txt"/>
      <appendToFile value="true"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%ndc] ID=%property{EventID} - %message%newline" />
      </layout>
    </appender>
    <!-- Define some output appenders -->
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%ndc] ID=%property{EventID} - %message%newline" />
      </layout>
    </appender>
    <!-- Setup the root category, add the appenders and set the default level -->
    <root>
      <level value="ALL" />
      <appender-ref ref="LogFileAppender" />
      <appender-ref ref="ConsoleAppender" />
    </root>
  </log4net>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

crossdomain.xml
clientaccesspolicy.xml 
Service.svc

文件已配置并显示在目录中 C:\的Inetpub \ wwwroot文件 我的服务是成功的,但日志不写...

问题: 1)哪里必须找到配置文件Service.config和log4net配置? 2)我的Service.dll lib和Service.config位于C:\ inetpub \ wwwroot \ bin中。它正常吗?

请帮我解决这个问题。 我正在尝试超过10种其他变量的loggining。所有这些都在WindowsForms应用程序中工作,但不在IIS中托管的服务中工作。 附加信息:当我在服务中调用方法NAME时?我尝试通过File.Create在当前目录中写入文件并且它的工作,但是没有创建loggining文件,我不知道如何解决它。 感谢大家尝试理解我的英语并寻求帮助。)

或者如果您已经或者可以使用log4net创建原始的工作WCF服务,可以通过IIS发布,请在此答案示例中写入我的环境测试代码。

非常感谢。

您好。 谢谢你的回复。 现在我尝试详细描述我的情况以获取更多信息 第一步:我创建新项目。项目类型 - WCF服务库。 我的服务接口代码是

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace MyService
{
    [ServiceContract]
    public interface IMyService
    {
        [OperationContract]
        string ReturnName();
    }
}

我的服务课程是

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyService
{
    public class MyService:IMyService
    {
        public string ReturnName()
        {
            return "Return name";
        }
    }
}

然后我从visual studio我的服务发布到IIS 结果 - 站点目录(http://img854.imageshack.us/img854/456/62137541.png)

中的新服务文件
web.config file for this service is
<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true"/>
  </system.web>
  <system.serviceModel>
    <services>
      <service name="MyService.MyService">
        <endpoint address="" binding="wsHttpBinding" contract="MyService.IMyService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/Design_Time_Addresses/MyService/Service1/"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

现在我创建用于检查服务的测试控制台应用程序。我向控制台app添加服务引用并编写代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TestWCFLog.ServiceReference1;

namespace TestWCFLog
{
    class Program
    {
        static void Main(string[] args)
        {
            MyServiceClient service = new MyServiceClient();
            Console.WriteLine( service.ReturnName());
            Console.ReadLine();
        }
    }
}

这是有效的。 (http://img836.imageshack.us/img836/1718/52151311.png) 现在告诉我,我必须添加到我的服务代码和web.config文件中? 如何添加log4net登录服务? 我尝试了很多样品,但它不起作用。 谢谢你的答案。 谢谢。

1 个答案:

答案 0 :(得分:3)

您需要初始化log4net,因为您使用的是IIS,您可以在Global.asax文件中执行此操作(如果您还没有,请在项目中添加一个新文件。)

它应该是这样的:

public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        XmlConfigurator.Configure();

        var logger = LogManager.GetLogger(typeof(Global));

        logger.Info("Starting up services");
    }
}

我还可以在配置文件中看到您正在使用旧版IgnoreSectionHandler。 将配置文件更改为:

<configSections>
    <section name="log4net"
      type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>

您的配置文件需要被称为web.config,它需要位于您的服务主机文件夹而不是bin文件夹下,在您的情况下为c:\ inetpub \ wwwroot。

不确定service.config是什么意思。在IIS下托管服务时,所有配置都会进入web.config文件。