1

我有一个使用 log4net 的 Web 应用程序。我的 Web 应用程序已部署到 Azure,并且可以在那里完美运行。但是,当我通过 VS2013(更新 4)在本地运行它时,log4net 不会实例化AdoNetAppender.

我通过中断所有抛出的异常来检查异常,没有抛出任何异常,我激活了内部 log4net 调试,调试输出中没有显示任何异常。

我也添加<trust level="Full"/>到我的web.config,什么都没有...

我再次难住了,它可以在 Azure 上运行,但不能在本地运行。有任何想法吗?谢谢!

编辑这是我的web.config(仅相关行)

<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=**********;Integrated Security=SSPI" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <log4net debug="true">
    <appender name="ADONetAppender" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="1" />
      <connectionStringName value="DefaultConnection" />
      <commandText value="INSERT INTO Log ([StoreId],[Date],[Thread],[Level],[Logger],[Message],[Exception],[User]) VALUES (@store, @log_date, @thread, @log_level, @logger, @message, @exception, @user)" />
      <parameter>...</parameter>
      ...
    </appender>
    <appender name="DebugAppender" type="log4net.Appender.DebugAppender">
      <immediateFlush value="true" />
      <layout type="log4net.Layout.SimpleLayout" />
    </appender>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="ADONetAppender" />
      <appender-ref ref="DebugAppender" />
    </root>
  </log4net>
  <appSettings>
    <add key="log4net.Internal.Debug" value="true" />
    <add key="log4net.Config" value="log4net.simple.config"/>
    <add key="log4net.Config.Watch" value="True"/>
  </appSettings>
  <system.web>
    <authentication mode="None" />
    <compilation debug="true" targetFramework="4.5.1" />
    <httpRuntime targetFramework="4.5.1" maxRequestLength="1048576" />
    <customErrors mode="Off" />
    <trust level="Full"/>
  </system.web>
</configuration>

更新 2

我发现虽然log4net配置正确,但调用会LogManager.GetLogger("...")返回一个没有附加程序的记录器。但是,如果我进一步检查层次结构,我可以AdoNetAppender在那里看到我,并且在XmlConfigurator.Configure()运行时它也会输出以下内容log4net: Adding appender named [ADONetAppender] to logger [root].......

所以问题归结为(这仅在本地发生,而不是在生产中)从返回的对象LogManager.GetLogger(...)不包含任何附加程序。

解决了

请参阅下面接受的答案。事实证明,我真正缺少的只是XmlConfigurator.Configure()在我的Application_Start方法中调用。我提供的所有其他“证据”都是正常行为,而我在本地没有看到任何日志消息的原因是我的本地数据库和生产数据库之间的日志表架构之间存在细微的无意差异。

4

1 回答 1

2

您可以在 Global.asax 中配置 log4net:

public class WebApiApplication : HttpApplication
{
    protected void Application_Start()
    {
        XmlConfigurator.Configure();

这适用于天蓝色和本地。

于 2015-05-01T15:42:24.257 回答