web-dev-qa-db-ja.com

log4netが機能しない

こんにちは、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_ファイルが見つかりません。

117
Jakob

このタイプのことの1つの落とし穴は、XmlConfigurator属性をAssemblyInfo.cs

[Assembly: log4net.Config.XmlConfigurator]

そうしないと、log4netがアクティブになりません。

284
Kirk Woll

Log4netがまったくログを記録していないか、ファイルが期待した場所に達していないと思います。

まず、実際に電話しましたか

_XmlConfigurator.Configure()
_

コードのどこに?上記のxmlスニペットがアプリケーション構成ファイルにある場合、この呼び出しはトリックを行います。 xmlスニペットがそれ自身のファイルにある場合、ファイルへのパスを取る.Configure(string)オーバーロードを使用する必要があります。この呼び出し(または明らかにKirk Wollが言及したAssemblyレベルの属性)がなければ、log4netはまったくログを記録しません。

これがすべて完了し、log4netがログを記録する必要があると思われる場合は、さらにデバッグするときに、ログファイルの完全修飾パスを入力する必要があります。これにより、ファイルshouldの場所を確認できます。

48
Rob Levine

別の小さな落とし穴があります。ここを参照してください: http://logging.Apache.org/log4net/release/manual/configuration.html#dot-config

_[Assembly: log4net.Config.XmlConfigurator]_メソッドはapp.configでは機能しません。 app.configからlog4netを構成する場合、log4net.Config.XmlConfigurator.Configure()メソッドを使用する必要があります。

30
Amir Abiri

Log4netが手に負えないことを証明するときのチェックリストは次のとおりです。

  • ビルド時にlog4net.configファイルがbin \フォルダーにコピーされるようにします(コンパイラーで「新しい場合にコピー」に設定)
    • インストールされたコードを扱うとき、log4net.configがライドのために来たことを確認します(コンパイラーで 'Content'に設定)
  • プロセスを実行するユーザーに、ログが書き込まれるフォルダーへの書き込み権限があることを確認します
  • 疑わしい場合は、c:\ temp \に無差別な許可を与え、そこにすべてを記録します()
  • sysinternal/Dbgview.exeを起動して、何かがわかるかどうかを確認します
17
earthling42

これらは最終的に私のファイルのロギングを機能させるステップです:

  • -AssemblyInfo.csに次の属性が含まれていることを確認します。 [アセンブリ:log4net.Config.XmlConfigurator]。これにより、log4netがロードされます。
  • ログディレクトリに書き込み権限があることを確認してください。
  • ロガーの形式が指定されていることを確認してください。これは、構成内の各要素にlayout要素が指定されていることを確認することで実行されます。例えば:

<appender name="MainLogger"... <layout type="log4net.Layout.SimpleLayout"/>

  • 最後に、log4netの内部ログを有効にして、コンソールのログを有効にし、コンソールを確認してください。これを行うには、<add key="log4net.Internal.Debug" value="true"/>appSettingsに追加します。
7
Echilon

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();**
    }
}
7
Oladipo Olasemo

例外を発生させることなく、ロギングシステムが静かに失敗する経験がありました。ロガーがエラーをログに記録している場合、ログを実行できないエラーをログに記録するにはどうすればよいのでしょうか?

したがって、ファイルがディスク上に作成されていない場合は、ファイルシステムのアクセス許可を調べるから始めて、アプリケーションを実行しているユーザーがそのディスクの場所に新しいファイルを書き込めるようにします。

テストの目的で、書き込み先のファイルをディスク上に手動で作成し、すべてのユーザーが書き込みできるようにアクセス許可を開くことができます。ロガーが書き込みを開始すると、設定ベースではなく許可ベースであることがわかります。

5
John K

上記のすべてを試しましたが、何も機能しませんでした。 app.config'sconfigSectionsセクションにこの行を追加するとうまくいきました。

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" />

VersionおよびPublicKeyTokenが正しいことを確認してください

1
Reyan Chougle

残念ながら、上記のいずれも助けにはなりませんでした。以前の設定の提案に追加して記録されるクラスの明示的な構成は、私にとってはうまくいきませんでした。

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
log4net.Config.XmlConfigurator.Configure(new FileInfo(assemblyFolder + "/log4net.config"));
0
Petro Slyvko

私の場合、log4Net.configファイルのプロパティを「コンテンツ」として設定することを忘れているため、ファイルはデプロイに含まれませんでした。それで注意してください:

Compile action : Content
0
Marco
<param name="File" value="mylog.log" />

「mylog.logを実際のフォルダーに書き込む」と言っています。つまり、WebアプリケーションがIISの下にある場合、ログはC:\ inetpub\wwwroot\appname\mylog.logに書き込まれます。

ログファイルがない場合は、アプリを実行しているアカウントにフォルダーへの書き込み権限がない可能性があります。 SysInternalsからProcess Monitorを実行して、ファイルが書き込まれるかどうか、どこに書き込まれるかを確認できます。

また、VSをデバッグモードで実行して、例外がスローされているかどうかを確認します([デバッグ]> [例外]> [CLR例外]、[スロー]を確認します)。

0
Tomas Voracek