外部ファイルのLog4Net構成が機能しない
-
22-07-2019 - |
質問
log4netを使用しており、外部構成ファイルでその構成を指定したい(他のセクションで行ったように)。これを行うために、App.configのlog4netセクションを次のように変更しました。
...
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
...
<log4net configSource="Log.config" />
...
そして、Log.Configファイル(App.configと同じディレクトリ)には次のものがあります:
<log4net>
<appender name="General" type="log4net.Appender.FileAppender">
<file value="myapp.log" />
<layout type="log4net.Layout.SimpleLayout" />
</appender>
<root>
<appender-ref ref="General" />
</root>
</log4net>
ただし、アプリを実行すると、ログファイルは作成されません(ログ記録も行われません)。コンソールに出力されるエラーメッセージはありません。
Log.configファイルの内容をApp.configに戻す(上記の最初のコード行を置き換える)場合、期待どおりに機能します。外部ファイルで機能しない理由は何ですか?
解決
AssemblyInfo.cs
ファイルに次の属性がありますか:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
およびロギング機能を必要とする各クラスの開始時に次のようなコード:
private static readonly ILog log =
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
これと他の情報を含むブログ投稿がありますこちら。
他のヒント
この問題には未解決の欠陥があります。 Log4Netは、構成要素のconfigSource属性をサポートしていません。純粋な構成ファイルソリューションを使用するには、appSettingsでlog4net.Configキーを使用します。
ステップ1:通常の構成セクション定義を含める:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
ステップ2:appSettingsでmagic log4net.Configキーを使用します。
<appSettings>
<add key="log4net.Config" value="log4net.simple.config" />
</appSettings>
ステップ3:configSourceの処理を修正するパッチを提供します。
見逃したステップは
log4net.Config.XmlConfigurator.Configure();
これにより、configSourceが使用されます。 GetLogger()を呼び出す前に必ず1回呼び出すようにしてください。
log4net.configファイルに次のプロパティが設定されていることを確認します。
ビルドアクション:コンテンツ
出力ディレクトリにコピー:常にコピー
どちらを使用するか
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<appSettings>
<add key="log4net.Config" value="Log4Net.config" />
</appSettings>
または単に
log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo("Log4Net.config"));
どちらの場合でも、Log4Net.configファイルは出力ディレクトリにあるはずです。 これを行うには、ソリューションエクスプローラーでLog4Net.configファイルのプロパティを設定します。 ビルドアクション-コンテンツおよび出力ディレクトリへのコピー-常にコピー
この問題に注意してください...
私の場合、すべてが正しく構成されました。問題は、Visual Studio 2013内でWeb配置を使用してサイトを WinHost.com にアップロードし、 ACL サーバー上。これにより、フォルダーとファイルに対するすべての権限が取り消されました-log4netはファイルに書き込むことができませんでした。
詳細についてはこちらをご覧ください:
Web Deploy / MSBuildを停止する方法サーバーのアクセス権の乱用から
ACLをリセットするようにサポートチームに依頼すると、log4netはログを吐き出しました。 :)
デプロイディレクトリにコピーされるlog4net.configという外部設定ファイルがあると仮定すると、次のように設定できます:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Reflection;
using log4net;
namespace MyAppNamespace {
static class Program {
//declare it as static and public so all classes in the project can access it
//like so: Program.log.Error("got an error");
public static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main() {
//configure it to use external file
log4net.Config.XmlConfigurator.Configure(new Uri(Application.StartupPath + "\\log4net.config"));
//use it
log.Debug("############# STARING APPLICATION #################");
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormMain());
}
}
}
私は同じ問題を抱えていましたが、
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net")]
実行中のプロジェクトでは、参照プロジェクトにも次の行がありました:
[assembly: log4net.Config.XmlConfigurator]
参照プロジェクトでこの行を削除すると、ログが表示され始めます。
log4net
のデバッグモードをオンにすることもできます。これをApp.configファイルに挿入します:
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings>
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add
name="textWriterTraceListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="link\to\your\file.log" />
</listeners>
</trace>
</system.diagnostics>
そして、少なくともエラーメッセージが表示され、そこから正確に何が間違っていたかを導き出すことができます。私の場合、出力ディレクトリにコピー
を常にコピー
に設定するのを忘れていました。
@Mitch、[assembly:...]宣言を持つファイルがありますが、ConfigFileプロパティがありませんでした。
一度追加してLog.configを指すと、動作し始めました。他のすべての構成セクション(AppSettingsなど)と同様に機能し、変更なしで外部構成ファイルを受け入れると考えていたでしょう。
グローバルな静的ログプロバイダーにラップしているため、2番目のステートメントはありません。
私の場合、次のエラーメッセージが表示されました。
log4net: config file [C:\........\bin\Debug\log4net.config] not found.
そして log4net.config
ファイルはVisual Studio 2017プロジェクトにありましたが、 bin \ Debug
でファイルをチェックしたときフォルダが見つかりませんでした。
元のアセンブリのセットアップは次のようなものでした:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
調査時間を経て、次のように変更すると動作します。
[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"..\..\log4net.config", Watch = true)]
- AssemblyInfo.cs にフォローを追加
[assembly:log4net.Config.XmlConfigurator(ConfigFile =&quot; Log4Net.config&quot;)]
- log4net.configがプロジェクトに含まれていることを確認します
- log4net.configのプロパティで
出力ディレクトリにコピーを新しい場合にコピーに変更します
- ログレベルの再確認 level value =&quot; ALL&quot;