【问题标题】:Log4net configuration from assembly attribute does not load configuration file来自程序集属性的 Log4net 配置不加载配置文件
【发布时间】:2010-10-19 18:02:41
【问题描述】:

我的 bin 目录中有以下文件 Log4net.config:

<?xml version="1.0" encoding="utf-8" ?>
<log4net xmlns="urn:log4net">
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
        <param name="file" value="MyLogFile.log"/>
        <param name="appendToFile" value="false"/>
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%date (%logger) [%5level] - %message" />
        </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%date (%logger) [%5level] - %message" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="FileAppender" />
        <appender-ref ref="ConsoleAppender"/>
    </root>
    <logger name="NHibernate" additivity="false">
        <level value="WARN"/>
    </logger>
</log4net>

以及我的 AssemblyInfo.cs 文件中的以下代码:

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyTitle("My Project")]
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4net.config", Watch = true)]

当我运行程序时,我得到以下 log4net 调试输出:

log4net: log4net assembly [log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821]. Loaded from [D:\Data\Projects\Active\Clients\MyProject\src\MyProject.Importer\bin\Debug\log4net.dll]. (.NET Runtime [4.0.30319.1] on Microsoft Windows NT 6.1.7600.0)
log4net: DefaultRepositorySelector: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy]
log4net: DefaultRepositorySelector: Creating repository for assembly [MyCompany.Framework, Version=2.1.72.0, Culture=neutral, PublicKeyToken=null]
log4net: DefaultRepositorySelector: Assembly [MyCompany.Framework, Version=2.1.72.0, Culture=neutral, PublicKeyToken=null] Loaded From [D:\Data\Projects\Active\Clients\MyProject\src\MyProject.Importer\bin\Debug\MyCompany.Framework.dll]
log4net: DefaultRepositorySelector: Assembly [MyCompany.Framework, Version=2.1.72.0, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified.
log4net: DefaultRepositorySelector: Assembly [MyCompany.Framework, Version=2.1.72.0, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: DefaultRepositorySelector: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy]
The thread 'vshost.RunParkingWindow' (0xd30) has exited with code 0 (0x0).
The thread '<No Name>' (0x15d0) has exited with code 0 (0x0).
log4net: Hierarchy: Shutdown called on Hierarchy [log4net-default-repository]

Log4net 加载,但似乎没有处理我的配置文件。当我在程序初始化期间注释掉 AssemblyInfo.cs 中的属性并运行以下代码时,它按预期工作:

var log4netConfig = "Log4net.config";
var log4netInfo = new FileInfo(log4netConfig);
log4net.Config.XmlConfigurator.ConfigureAndWatch(log4netInfo);

我做错了什么?我想从 AssemblyInfo.cs 加载。

【问题讨论】:

    标签: log4net log4net-configuration


    【解决方案1】:

    我对这种提升 log4net 的方法也有问题。 documentation 表示您必须在应用程序启动的早期进行调用

    如果您使用配置属性,您必须调用 log4net 以允许它读取属性。对 LogManager.GetLogger 的简单调用将导致调用程序集上的属性被读取和处理。 因此,必须在应用程序启动期间尽早进行日志记录调用,并且肯定是在加载和调用任何外部程序集之前。

    尝试将记录器放置在启动应用程序的同一类中(program.cs、app.xaml 等)。例如

    private static readonly ILog Log = LogManager.GetLogger(typeof(Program));
    

    并且对于踢,对日志进行任何调用(即使是从附加过程中过滤或评估的日志,它也应该强制 log4net 评估您的存储库/层次结构)。

    static Program()
    {
        Log.Debug("Application loaded.");
    }
    

    【讨论】:

    • 一如既往地检查内部log4net调试输出&lt;log4net debug="true" /&gt;
    • 对于一个 Web 服务应用程序,它应该在哪里?
    • @oliverdejohnson 检查logging.apache.org/log4net/release/faq.html 如何启用 log4net 内部调试?它显示了如何设置调试和跟踪侦听器。
    • 还有一个鲜为人知的问题,由于某种我无法理解的原因,他们决定 log4net 的 XmlConfiguratorAttribute 应该只在使用 Debug 构建时工作。如果您计划进行发布构建(您肯定会在某个时候这样做),您必须在应用程序启动期间使用 ConfigureAndWatch 方法。
    • @TomLint 刚刚使用发布版本测试了该属性的使用,它正在加载配置(2.0.6),但由于某种原因仅在本地加载。在我将代码部署到 Azure WebJob 后,它在发布时无法正常工作。你有这种行为的文档来源吗?
    【解决方案2】:

    我终于找到了简单的解决方案,你可以在那里得到帮助

    1. 启动函数中的 Global.asax

       protected void Application_Start()
       {
         log4net.Config.XmlConfigurator.Configure();
       }
      
    2. 在类级别使用日志记录的任何类中

    添加命名空间

    using log4net;
    

    在类级别添加此代码行

    private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    
    1. 在任何动作调用中使用日志功能

      log.Error("test error q111..");
      
    2. 配置

      <configuration>
      <configSections>
      <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net " />
      </configSection>
      <log4net debug="true">
      
      <!--AdoNet appender is use for write log file into sql server-->
      <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
        <bufferSize value="1" />
        <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <connectionString value="Data Source=DESKTOP-NLH31FH; Initial Catalog=SmallBizDb;Integrated Security=true" providerName="System.Data.SqlClient" />
        <commandText value="INSERT INTO [dbo].[Logs] ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@logdate,@thread, @loglevel, @logger, @message, @exception)" />
        <parameter>
          <parameterName value="@logdate" />
          <dbType value="DateTime" />
          <layout type="log4net.Layout.RawTimeStampLayout" />
        </parameter>
        <parameter>
          <parameterName value="@thread" />
          <dbType value="String" />
          <size value="255" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%thread" />
          </layout>
        </parameter>
        <parameter>
          <parameterName value="@loglevel" />
          <dbType value="String" />
          <size value="50" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%level" />
          </layout>
        </parameter>
        <parameter>
          <parameterName value="@logger" />
          <dbType value="String" />
          <size value="255" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%logger" />
          </layout>
        </parameter>
        <parameter>
          <parameterName value="@message" />
          <dbType value="String" />
          <size value="4000" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%message" />
          </layout>
        </parameter>
        <parameter>
          <parameterName value="@exception" />
          <dbType value="String" />
          <size value="2000" />
          <layout type="log4net.Layout.ExceptionLayout" />
        </parameter>
      </appender>
      <!--Add appender which you want to use, You can add more then one appender . Like if you want save log both plain text or sql server ,Add both appender.-->
      
      <root>
        <level value="Debug" />
        <!--<appender-ref ref="RollingLogFileAppender" />-->
        <!--Enable this line if you want write log file into plain text file-->
        <appender-ref ref="AdoNetAppender" />
        <!--Enable this line if you want write log file into sql server-->
      
      </root>
      
      </log4net>
      
      <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
      </appSettings>
      </configuration>
      

    它可以帮助所有人并且易于使用。谢谢

    【讨论】:

      【解决方案3】:

      我确实在 Application_Start() 内的 Global.asax.cs 中保留了 log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config"))); ...所以我不需要到处携带命令。

      【讨论】:

        【解决方案4】:

        我通过将RepositoryAttribute 添加到有问题的程序集的 AssemblyInfo.cs 文件来解决此问题。

        [assembly: AssemblyTrademark("")]
        [assembly: AssemblyCulture("")]
        [assembly: RepositoryAttribute("Your.Namespace.Here")]
        

        【讨论】:

        • 我在上面尝试过,现在 log4net 没有为创建程序集存储库提供错误,但它仍然没有写入日志文件。创建存储库后,它只是关闭程序集。有什么想法吗??
        【解决方案5】:

        我正在使用 Web.Config 部分来配置 Logger 并手动记录事件,从 global.asax 引导 Logger

        static ILog logger = LogManager.GetLogger(<LoggerName>);
        
        protected void Application_Start()
        {
           log4net.Config.XmlConfigurator.Configure(); 
        }
        

        尝试从 global.asax 引导它

        【讨论】:

          【解决方案6】:

          我正在使用带有 Windows 服务的 log4Net。我尝试了其他答案中提到的所有可能选项。

          对我来说,服务的另一个实例还活着,我不得不从任务管理器中杀死它。之后,问题就解决了。

          【讨论】:

            【解决方案7】:
            var log4NetPath = Server.MapPath("~/log4net.config");
            
            FileInfo fileInfo = new FileInfo(log4NetPath);
            
            XmlConfigurator.ConfigureAndWatch(fileInfo);
            

            【讨论】:

            • 您需要在这里添加一些散文来解释这段代码的作用。它已被标记并显示在低质量帖子审核队列中,因此它有被删除的风险。
            猜你喜欢
            • 2017-09-26
            • 1970-01-01
            • 1970-01-01
            • 2017-09-02
            • 2013-08-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多