web-dev-qa-db-ja.com

アセンブリ属性からのLog4net構成が構成ファイルをロードしない

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からロードしたい。

30
Chris

また、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.");
}
37

最後に私は単純な解決策を見つけるだけです、あなたはそこで助けを得るかもしれません

  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>
    

それはすべてに役立ち、使いやすいかもしれません。ありがとう

6
adnan

Application_Start()内のGlobal.asax.csにlog4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config")));を保持します...したがって、コマンドをあちこちに運ぶ必要はありません。

4
rkmorgan

問題のあるアセンブリのAssemblyInfo.csファイルに RepositoryAttribute を追加して、これを修正しました。

[Assembly: AssemblyTrademark("")]
[Assembly: AssemblyCulture("")]
[Assembly: RepositoryAttribute("Your.Namespace.Here")]
2
NightShovel

Web.Configセクションを使用してLoggerを構成し、イベントを手動でログに記録します。global.asaxからLoggerをブートストラップします

static ILog logger = LogManager.GetLogger(<LoggerName>);

protected void Application_Start()
{
   log4net.Config.XmlConfigurator.Configure(); 
}

Global.asaxからブートストラップしてみてください

0
Rahul Jujarey

Windowsサービスでlog4Netを使用していました。私は他の回答で述べられているすべての可能なオプションを試しました。

私にとっては、サービスの別のインスタンスが残っていて、タスクマネージャーから強制終了する必要がありました。この後、問題は解決されました。

0
tech-y