こんにちは、web.configにこの設定があります
_<log4net>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<param name="File" value="mylog.log" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="" />
<param name="Footer" value="" />
<param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
</layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="[Header]\r\n" />
<param name="Footer" value="[Footer]\r\n" />
<param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="LogFileAppender" />
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>
_
ただし、log4netは機能していません。私のプロジェクトは問題なくコンパイルされ、デバッグでもエラーは発生しません。 log.debug("somemessage")
に指定した行は正常に実行されますが、_mylog.log
_ファイルが見つかりません。
このタイプのことの1つの落とし穴は、XmlConfigurator
属性をAssemblyInfo.cs
:
[Assembly: log4net.Config.XmlConfigurator]
そうしないと、log4netがアクティブになりません。
Log4netがまったくログを記録していないか、ファイルが期待した場所に達していないと思います。
まず、実際に電話しましたか
_XmlConfigurator.Configure()
_
コードのどこに?上記のxmlスニペットがアプリケーション構成ファイルにある場合、この呼び出しはトリックを行います。 xmlスニペットがそれ自身のファイルにある場合、ファイルへのパスを取る.Configure(string)
オーバーロードを使用する必要があります。この呼び出し(または明らかにKirk Wollが言及したAssemblyレベルの属性)がなければ、log4netはまったくログを記録しません。
これがすべて完了し、log4netがログを記録する必要があると思われる場合は、さらにデバッグするときに、ログファイルの完全修飾パスを入力する必要があります。これにより、ファイルshouldの場所を確認できます。
別の小さな落とし穴があります。ここを参照してください: http://logging.Apache.org/log4net/release/manual/configuration.html#dot-config
_[Assembly: log4net.Config.XmlConfigurator]
_メソッドはapp.configでは機能しません。 app.configからlog4netを構成する場合、log4net.Config.XmlConfigurator.Configure()
メソッドを使用する必要があります。
Log4netが手に負えないことを証明するときのチェックリストは次のとおりです。
これらは最終的に私のファイルのロギングを機能させるステップです:
<appender name="MainLogger"... <layout type="log4net.Layout.SimpleLayout"/>
<add key="log4net.Internal.Debug" value="true"/>
をappSettings
に追加します。ASPNET MVCプロジェクトの追加の場合
log4net.Config.XmlConfigurator.Configure();
global.asax.csへの追加も役立ちます。
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
**log4net.Config.XmlConfigurator.Configure();**
}
}
例外を発生させることなく、ロギングシステムが静かに失敗する経験がありました。ロガーがエラーをログに記録している場合、ログを実行できないエラーをログに記録するにはどうすればよいのでしょうか?
したがって、ファイルがディスク上に作成されていない場合は、ファイルシステムのアクセス許可を調べるから始めて、アプリケーションを実行しているユーザーがそのディスクの場所に新しいファイルを書き込めるようにします。
テストの目的で、書き込み先のファイルをディスク上に手動で作成し、すべてのユーザーが書き込みできるようにアクセス許可を開くことができます。ロガーが書き込みを開始すると、設定ベースではなく許可ベースであることがわかります。
上記のすべてを試しましたが、何も機能しませんでした。 app.config'sconfigSections
セクションにこの行を追加するとうまくいきました。
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" />
Version
およびPublicKeyToken
が正しいことを確認してください
残念ながら、上記のいずれも助けにはなりませんでした。以前の設定の提案に追加して記録されるクラスの明示的な構成は、私にとってはうまくいきませんでした。
string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
log4net.Config.XmlConfigurator.Configure(new FileInfo(assemblyFolder + "/log4net.config"));
私の場合、log4Net.configファイルのプロパティを「コンテンツ」として設定することを忘れているため、ファイルはデプロイに含まれませんでした。それで注意してください:
Compile action : Content
<param name="File" value="mylog.log" />
「mylog.logを実際のフォルダーに書き込む」と言っています。つまり、WebアプリケーションがIISの下にある場合、ログはC:\ inetpub\wwwroot\appname\mylog.logに書き込まれます。
ログファイルがない場合は、アプリを実行しているアカウントにフォルダーへの書き込み権限がない可能性があります。 SysInternalsからProcess Monitorを実行して、ファイルが書き込まれるかどうか、どこに書き込まれるかを確認できます。
また、VSをデバッグモードで実行して、例外がスローされているかどうかを確認します([デバッグ]> [例外]> [CLR例外]、[スロー]を確認します)。