2012-02-23 42 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