【问题标题】:Log4Net Webservice not creating file, what am I doing wrong?Log4Net Webservice 没有创建文件,我做错了什么?
【发布时间】:2012-03-13 20:21:51
【问题描述】:

我正在尝试使用 Log4Net,它记录到 ASP.Net 站点中的文件,但我的实现只是不创建文件。我查看了代码一千次,并将其与我找到的一些解决方案进行了比较,但无法找出错误,所以也许你们可以帮助我。 我们开始:

我的 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!

【问题讨论】:

    标签: asp.net web-services logging log4net


    【解决方案1】:

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

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

    编辑:我是怎么做到的

    web.config:

    Log4net 配置位于/Config/log4net.config.xml

    global.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>
    

    【讨论】:

    • 所以如果我的 Web.config 文件在我的根目录中,log4netConfigPath 将是:new System.IO.FileInfo ("Web.config"),对吧?
    • 如果这是正确的用法,我很遗憾地不得不说它不起作用:log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo("~/Web.config") );
    • 在调试器中查看var file = new System.IO.FileInfo("~/Web.config")是否不为空,如果为空,请尝试不同的方法,如new FileInfo(Server.MapPath("web.config"));
    • 我添加了一个示例,基本上我在我的网络应用程序中使用它并且一切正常
    • 好吧,也许我只是更接近于识别问题!通过按照您的建议使用 log4net.Config.XmlConfigurator.ConfigureAndWatch(log4netConfig) ,返回一个错误集合,其中包含两个元素,第一个元素如下: {log4net:ERROR XmlHierarchyConfigurator: Object type not specified。无法创建 [log4net.Appender.IAppender] 类型的对象。缺少值或类型。}
    【解决方案2】:

    为什么 Configure() 方法被注释掉了?应该调用它以使用您在 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";
            }
    

    【讨论】:

    • 我把它注释掉了,因为我认为我的 AssembyInfo.cs 中的这一行我做同样的事情,我不想在我的应用程序中调整它两次,我说得对吗?:[程序集:log4net.Config.XmlConfigurator(ConfigFile="Web.config", Watch=true)]
    猜你喜欢
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 2013-08-10
    • 1970-01-01
    • 2018-04-10
    相关资源
    最近更新 更多