2012-02-23 90 views
1

我正在尝试使用Log4Net将日志记录到ASP.Net站点中的文件,但我的实现只是不创建文件。我在代码上看了上千次,并将其与我发现的一些解决方案进行了比较,但无法排除错误,所以也许你们可以帮助我。 这里,我们去:Log4Net Webservice没有创建文件,我做错了什么?

我的web.config看起来像这样:

<?xml version="1.0"?> 
<configuration> 


    <configSections> 
    <sectionGroup name="system.serviceModel"> 
     <section name="domainServices" type="System.ServiceModel.DomainServices.Hosting.DomainServicesSection, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" allowDefinition="MachineToApplication" requirePermission="false" /> 
    </sectionGroup> 
    <section name="log4net" 
    type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 

    <log4net> 
    <root> 
     <level value="ALL"/> 
     <appender name="RollingFileAppender"/> 
    </root> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender, log4net"> 
     <file value="mylogfile.txt" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="5" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout, log4net"> 
     <conversionPattern value="%date [%thread] %level %logger - %message%newline" /> 
     </layout> 
    </appender> 
    </log4net> 
    <connectionStrings> 
    <add name="ApplicationServices" 
     connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" 
     providerName="System.Data.SqlClient" /> 
    </connectionStrings> 

    <system.web> 
    <httpModules> 
     <add name="DomainServiceModule" type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    </httpModules> 
    <compilation debug="true" targetFramework="4.0" /> 
    <globalization culture="auto" uiCulture="auto" /> 

    <authentication mode="Forms"> 
     <forms name=".Log4NetDemoApplication_ASPXAUTH" timeout="2880" /> 
    </authentication> 

    <membership> 
     <providers> 
     <clear/> 
     <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" 
      enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" 
      maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" 
      applicationName="/" /> 
     </providers> 
    </membership> 

    <roleManager enabled="true"> 
     <providers> 
     <clear/> 
     <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> 
     <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" /> 
     </providers> 
    </roleManager> 

    <profile> 
     <providers> 
     <clear/> 
     <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/> 
     </providers> 
     <properties> 
     <add name="FriendlyName"/> 
     </properties> 
    </profile> 

    </system.web> 

    <system.webServer> 
    <validation validateIntegratedModeConfiguration="false"/> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <add name="DomainServiceModule" preCondition="managedHandler" 
      type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    </modules> 
    </system.webServer> 

    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
</configuration> 

在我的AssemblyInfo.cs它看起来像这样:

 #region Assembly mscorlib.dll, v4.0.30319 
    // C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll 
    #endregion 

    using System; 
    using System.Runtime.InteropServices; 

    namespace System.Reflection 
    { 
     // Summary: 
     //  Defines a company name custom attribute for an assembly manifest. 
     [AttributeUsage(AttributeTargets.Assembly, Inherited = false)] 
     [ComVisible(true)] 
     public sealed class AssemblyCompanyAttribute : Attribute 
     { 
      // Summary: 
      //  Initializes a new instance of the System.Reflection.AssemblyCompanyAttribute 
      //  class. 
      // 
      // Parameters: 
      // company: 
      //  The company name information. 
      public AssemblyCompanyAttribute(string company); 

      // Summary: 
      //  Gets company name information. 
      // 
      // Returns: 
      //  A string containing the company name. 
      public string Company { get; } 
     } 
    } 

和最后但并非最不重要实际代码如下所示:

 using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using System.Web.Services; 

    namespace Log4NetDemoApplication.Web.Services 
    { 
     /// <summary> 
     /// Summary description for POWSTestLog 
     /// </summary> 
     [WebService(Namespace = "http://tempuri.org/")] 
     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
     [System.ComponentModel.ToolboxItem(false)] 
     // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
     // [System.Web.Script.Services.ScriptService] 
      public class POWSTestLog : System.Web.Services.WebService 
     { 
      private static readonly log4net.ILog log = log4net.LogManager.GetLogger 
     (System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

      [WebMethod] 
      public string TestService() 
      { 
       log4net.ILog logger = log4net.LogManager.GetLogger(typeof(POWSTestLog)); 


       // log4net.Config.XmlConfigurator.Configure(); 
       logger.Debug("adsölkaölskd"); 
       log.Debug("Debug logging"); 
       log.Info("Info logging"); 
       log.Warn("Warn logging"); 
       log.Error("Error logging"); 
       log.Fatal("Fatal logging"); 
       return "Hello World"; 
      } 
     } 
    } 

Can't look at this stuff no more =) 
Thanks for all your help! 

回答

0

在请求记录器之前,应对其进行配置。试试看:

log4net.Config.XmlConfigurator.ConfigureAndWatch(log4netConfigPath); 
ILog log4netLogger = LogManager.GetLogger(typeof(MyType)); 

编辑:我怎么做的

的web.config:

log4net的配置地处/Config/log4net.config.xml

全球。 asax

private void Application_Start(object sender, EventArgs e) 
{ 
    try 
    { 
     var log4netConfigPath = Server.MapPath(
        ConfigurationManager.AppSettings["log4netConfigFilePath"]); 
     if (!String.IsNullOrEmpty(log4netConfigPath) && File.Exists(log4netConfigPath)) 
     { 
      FileInfo log4netConfig = new FileInfo(log4netConfigPath); 
      if (log4netConfig != null) 
      { 
       log4net.Config.XmlConfigurator.ConfigureAndWatch(log4netConfig);        
       ILog log4netLogger = LogManager.GetLogger(typeof(Global)); 

       // Then register in IoC container so it would be accessible for dependency injection, etc 
       // ... 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     // log error, etc 
    } 
} 

log4net.config.xml,文件附加器

<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender,log4net"> 
    <lockingModel type="log4net.Appender.FileAppender+InterProcessLock" /> 
    <param name="Threshold" value="WARN" /> 
    <file type="log4net.Util.PatternString"> 
    <conversionPattern value="logs\lf-%date{yyyy.MM.dd.HH.mm.ss}-[%processid].log" /> 
    </file> 
    <appendToFile value="true"/> 
    <rollingStyle value="Composite"/> 
    <maxSizeRollBackups value="-1"/> 
    <maximumFileSize value="5MB"/> 
    <countDirection value="1"/> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
     <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %C{1}-%M - %m%n"/> 
    </layout> 
</appender> 
+0

所以,如果我的Web.config文件在我的根目录下,log4netConfigPath是:新System.IO.FileInfo( “Web.config文件”),对? – Matze 2012-02-23 13:04:35

+0

尝试'“〜/ web.config”' – sll 2012-02-23 13:29:56

+0

如果这是正确的用法,我不得不说它不起作用:log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(“〜/的web.config“)); – Matze 2012-02-23 13:45:41

1

为什么配置()方法注释掉?应该调用它以在web.config中使用您的配置。

log4net.Config.XmlConfigurator.Configure(); 

您的代码应该如下阅读

 [WebMethod] 
     public string TestService() 
     { 
      log4net.Config.XmlConfigurator.Configure(); 

      var logger = log4net.LogManager.GetLogger(typeof(POWSTestLog)); 

      logger.Debug("Test log entry.");     
      return "Hello World"; 
     } 
+0

由于我认为这行代码在我的AssembyInfo.cs中,我做了同样的事情,我不想在应用程序中调整两次,我是对的吗?:[assembly:log4net.Config.XmlConfigurator(ConfigFile =“Web.config”,Watch = true)] – Matze 2012-02-23 13:10:17