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);
これと他の情報を含むブログ投稿があります here 。
この問題には 未解決の欠陥 があります。 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()を呼び出す前に、必ず一度呼び出してください。
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 にアップロードし、サーバー上の ACLs をリセットしたことです。これにより、フォルダーとファイルに対するすべての権限が取り消されました-log4netはファイルを書き込むことができませんでした。
詳細については、こちらをご覧ください。
Web Deploy/MSBuildがサーバーのアクセス許可を台無しにするのを停止する方法
そこでサポートチームにACLをリセットするように依頼すると、log4netはログを吐き出し始めました。 :)
私が持っていることに加えて、私は同じ問題を抱えていました
[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>
少なくともエラーメッセージが表示されるので、そこから正確に問題を導き出すことができます。私の場合、Copy to output directory
をCopy Always
に設定するのを忘れていました。
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());
}
}
}
私の場合、次のエラーメッセージが表示されました。
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)]
@Mitch、[Assembly:...]宣言を持つファイルがありますが、ConfigFileプロパティがありませんでした。
追加してLog.configをポイントすると、機能し始めました。他のすべての構成セクション(つまりAppSettings)と同じように機能し、外部構成ファイルを変更せずに受け入れると思います。
グローバル静的ログプロバイダーにラップしているため、2番目のステートメントはありません。
[アセンブリ:log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config")]
変更出力ディレクトリにコピーから新しい場合はコピー