log4netが機能しない


123

こんにちは、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ファイルが見つからないので、どこにありますか?


これも必ず確認してください:stackoverflow.com/a/24617269/114029
Leniel Maccaferri

回答:


298

この種の問題の1つはXmlConfigurator、次の行をに配置して、属性を必ずアセンブリに追加することですAssemblyInfo.cs

[assembly: log4net.Config.XmlConfigurator]

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


5
この方法は、使用私のプロジェクトで動作するように、それは何らかの形で働いて停止しました。このメソッドを再度使用するには、このメソッドstackoverflow.com/a/1479343/193634を使用する必要がありました。
Rosdi Kasim 2013

もう一度試したところ、うまくいきました。ほとんどの場合、思ったとおりに、を含むアセンブリを参照/ロードしていませんAssemblyInfo
Kirk Woll 2013

ELMAHアペンダーを使用している人にとって、これは進むべき道です。「log4net.Config.XmlConfigurator.Configure();」がありました global.asax.csにあり、ファイルアペンダーでは正常に機能していましたが、ELMAHアペンダーでは機能していませんでした。
user3885927 2015年

私はこの答えを確認しましたが、 `[assembly:log4net.Config.XmlConfigurator(Watch = true)]`で微調整する必要があることがわかりました
David Savage

49

log4netがまったくログを記録していないか、ファイルが期待どおりに終了していないようです。

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

XmlConfigurator.Configure()

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

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


33

別の小さな落とし穴があります。ここを参照してください: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.Config.XmlConfigurator.Configure();を呼び出す必要がありました。。app.configをする必要がlog4netの効果的な作業を使用する(私のコードで効率的に印刷されます行は、これらの設定の実行()メソッドの後にある。
ルイサROSI

19

以下は、log4netが扱いにくいことが証明されたときのチェックリストです。

  • ビルド時にlog4net.configファイルがbin \フォルダーにコピーされるようにします(コンパイラーで「新しい場合はコピーする」に設定)
    • インストールされたコードを処理するときは、log4net.configが適切に機能するようにしてください(コンパイラーで「コンテンツ」に設定)
  • プロセスを実行するユーザーに、ログを書き込むフォルダーへの書き込み権限があることを確認します
  • 疑わしい場合は、c:\ temp \に無差別アクセス許可を付与し、そこにすべてのログを記録します()
  • Sysinternal / Dbgview.exeを起動して、何かが通知されているかどうかを確認します

3
"ビルド時にlog4net.configファイルがbin \フォルダーにコピーされていることを確認してください(コンパイラーで[新しい場合はコピーする]に設定)->私の日を保存してください!どうもありがとう!
Hoang Nguyen Huu 2014

8

ASP.NET 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();
    }
}

1
これに関して非常に奇妙な問題がありました。実稼働中および上司のコンピューターでは、ロガーはこのように正常に機能しましたが、カークの回答が私のコンピューターで機能するまでは機能しませんでした。同様の問題が発生した場合に備えて、人々に知らせたいと思っていました(MVCプロジェクト)。
Shelby115 2015

@ Shelby115、ありがとうございました!ELMAHにlog4Netエントリを配置しようとしました。私はweb.configですべてが正しかった。私はすでに「log4net.Config.XmlConfigurator.Configure();」を持っていました 私のglobal.asax.csにありますが、機能しません。このSO投稿に来て、カークに基づいてassemblyInfo.csに行を追加しました。それでも動作しませんでした!。あなたのコメントを読んだ後、global.asax.csから前のエントリを削除し、動作し始めました。私はこれに数時間を費やしました、そしてあなたのコメントは大きな助けとなりました。再度、感謝します!
user3885927 2015年

global.asax.csのエントリは、ファイルアペンダーでは正常に機能していましたが、ELMAHアペンダーでは機能していませんでした。カークの方法はELMAHアペンダーで機能しました(具体的にはglobal.asax.csから削除する必要がありました)
user3885927

また、log4netに、ログファイル用に構成されたディレクトリへの書き込み権限があることを確認することもできます。
Oladipo Olasemo 2015年

@ Shelby115ダン、解決策を忘れてあなた自身のコメントが問題を解決するときに、それを気に入ってください。あなたがすでに賛成している回答のあるページにアクセスすることも良い指標です。
Shelby115 2017

7

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

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

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

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

<add key = "log4net.Internal.Debug" value = "true" />これは、問題のトラブルシューティングに役立ちました。ありがとう
Ravi Khambhati

ディレクトリのアクセス許可は私を獲得したものです
Omar

6

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

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

テストの目的で、書き込みが必要なファイルをディスク上に手動で作成し、誰もが書き込むためのアクセス許可を開くことができます。ロガーが書き込みを開始した場合、構成ベースではなく許可ベースであることがわかります。


2

私の側では、アプリのコンパイル中に設定ファイルをコピーするようにマークするのを忘れていました。

設定ファイルを出力ディレクトリにコピーします

log4net.configファイルを右クリックしてプロパティを選択し、[出力ディレクトリにコピー]を選択してXXXXをコピーします。


1

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

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

そのことを確認Versionし、PublicKeyToken正しいです


0
<param name="File" value="mylog.log" />

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

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

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


0

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

Compile action : Content

0

残念ながら、上記のどれも役に立ちませんでした。以前の設定の提案に加えてログに記録されるクラスの明示的な構成は、私にとってはトリックでした。

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

-7

また、数時間後、なぜそれがうまくいかないのか分かりました...

私が持っていた:

public static class Program
{

    private static CommunicationManager _bcScanner = new CommunicationManager();
    private static ILog _log = LogManager.GetLogger(typeof(Program));
    private static SocketServer socketListener;

しかしそれはする必要があります:

public static class Program
    {
        private static ILog _log = LogManager.GetLogger(typeof(Program));
        private static CommunicationManager _bcScanner = new CommunicationManager();
        private static SocketServer socketListener;

したがって、ILogが最初の行にあることを確認してください。


1
これは間違いなく原因ではありません。ILogオブジェクトを初期化するタイミングは、ロギングメソッド、つまり_log.Infoを呼び出す前に初期化する限り、問題ではありません。_log.errorなど
Oladipo Olasemo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.