Log4netはログファイルを書き込みません


159

Log4netを使用して簡単なシナリオを作成しましたが、メッセージがログファイルに追加されないため、アペンダーが機能しないようです。

以下をweb.configファイルに追加しました:

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>        
</configSections>

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
            <file value="D:\MyData\Desktop\LogFile.txt" />
            <appendToFile value="true" />
            <encoding value="utf-8" />
            <layout type="log4net.Layout.SimpleLayout" />
    </appender>


    <root>
        <level value="INFO" />
        <appender-ref ref="LogFileAppender" />
    </root>
</log4net>

追加したグローバルASAXファイル内:

ILog logger = LogManager.GetLogger(typeof(MvcApplication));

Application_Startメソッド内:

logger.Info("Starting the application...");

何を間違えたのですか?

回答:


316

電話しますか

log4net.Config.XmlConfigurator.Configure();

log4netにあなたの設定を読み込ませるどこかに?たとえば、Global.asaxの場合:

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup

    // Initialize log4net.
    log4net.Config.XmlConfigurator.Configure();
}

4
たくさんありがとうございます。次の行がありました:log4net.Config.BasicConfigurator.Configure(); web.configの代わりにc#構成を使用してlog4netを構成する場合、これを呼び出しますか?多くのチュートリアルでこのコード行が見つからなかったため、この「構成」メソッド呼び出しはどのような方法でも必要ですか。
john84

9
参照、設定を探す場所をlog4netのを伝えるためにさまざまな方法がありますlogging.apache.org/log4net/release/manual/configuration.htmlは。XmlConfigurator.Configure()を呼び出すと、log4netは<app.exe> .configまたはweb.configで構成を探します。BasicConfigurator.Configureは(SDKドキュメントに従って)「Console.Outに書き込むConsoleAppenderを使用してlog4netロギングシステムを初期化します。」
Andreas Paulsson、2011年

参考までに-ファイルベースにしたくない場合は、log4net.Config.BasicConfiguratorを使用することもできます。出力はコンソールに送信されます。
silverArc 2012

1
AssemblyInfoファイルで設定を行っています。以下の回答として投稿。
LCJ 2013

うーん、これらの質問の多くを見つけ、どこにいても実際のログファイルの場所を言及することに失敗しました...誰もがすでに知っていることは明らかですか?
MrFox 2014年

50

このFAQページを使用してください: Apache log4netのよくある質問

下の約3/4は、アプリケーショントレースを使用してlog4netデバッグを有効にする方法を示しています。これにより、問題の場所がわかります。

基本は次のとおりです。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="log4net.Internal.Debug" value="true"/>
    </appSettings>
</configuration>

そして、あなたは標準出力にトレースを見る


1
ありがとうFAQを確認しましたが、問題を解決できませんでした。
john84

1
この回答のおかげで、私のrootセクションが間違ったロガーを参照していることがわかりました!!
ビスケット2014

素晴らしいヒント。asp.netユーザーのアクセスが拒否されたことがわかりました
Blue Clouds

それが誰かに機能しない場合は、これを使用する私の方法を試してください:<log4net> <internal> <Debug value = "true"> </ Debug> </ internal> </ log4net>
himanshupareek66

35

@AndreasPaulssonが示唆したように、構成する必要があります。AssemblyInfoファイルで設定を行っています。configuration file nameこちらを指定いたします。

// Log4Net Configuration.
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

9
これとlog4net.Config.XmlConfigurator.Configure();の両方がある場合はどうなりますか。ロード時?
n00b 2013年

1
@ n00b、次にこの行にコメントを付けることができますが、実際にはこの方法でのみ機能しました "log4net.Config.XmlConfigurator.Configure();"、そしてもう1つ:web.config設定にもこれを追加しました<キーを追加= "log4net.Internal.Debug" value = "true" />
himanshupareek66

33

また、[log4net] .configで[ 常にコピー ]オプションが選択されていることを確認してください

ここに画像の説明を入力してください


1
これは私にとっての修正でした。私はいつもこの設定を忘れています。
Ju66ernaut

25

サイトが実行されているプロセス(アカウント)に、出力ディレクトリへの書き込み権限があることを確認してください。

IIS 7以降では、これはアプリケーションプールで構成され、通常はAppPool Identityです。であり、通常はすべてのディレクトリへの書き込み権限がありません。

イベントログ(アプリケーションとセキュリティ)をチェックして、例外がスローされていないか確認してください。


あなたの助けをありがとう、また私は許可の問題について考えましたが、フォルダに読み取り、書き込み、変更、および実行の許可を設定した場合、それは機能しません。
john84

@ john84-例外が発生していますか?イベントログを見ましたか?
Oded

また、今発見したように、特定のアカウントでWindowsサービスが実行されていることも重要です。
Bob Mc

とても助かりました。
アッバス

20

インサート:

 [assembly: log4net.Config.XmlConfigurator(Watch = true)]

AssemblyInfo.csファイルの最後


これが私の救助でした。デスクトップフォームプロジェクトを実行し、log4net.Config.XmlConfigurator.Configure();を配置します。主に助けにはならなかった。ありがとう
トーマスヘッセ

これは私を助けました。web.configで構成を行いましたが、log4netは変更を反映していないようです。私はその属性に "Watch = true"を追加し、Anithingが機能し始めました
Albe

3

私にとってはログファイルの場所を移動しましたが、それはファイルの名前を別の名前に変更したときだけでした。

同じ名前のログファイルがすでに存在する場合は、何も起こりません。

その後、古いファイルの名前を変更し、configのログファイル名を元のファイル名に戻しました。


2

私の場合、プロジェクト名にスペースが含まれているため、log4netは適切にロギングしていませんでした。同じコードが別のプロジェクトでは問題なく機能したが、新しいプロジェクトでは機能しなかった理由を教えてください。スペース。シンプルな空間。

したがって、プロジェクト名のスペースには注意してください。私は自分の教訓を学びました。


1
この問題はどこにありましたか?Log4Netは1つのプロジェクトでうまく機能していますが、別のプロジェクトでは機能していません...理由がわかりません。Tks
Pascal

2

私の場合IIS_IUSRS、ログファイルに読み取り/書き込み権限を与える必要がありました。


1

AssemblyInfo.csファイルに次の行コードが含まれていることを確認してください。

[アセンブリ:log4net.Config.XmlConfigurator(ConfigFile = "Web.config"、Watch = true)]

また、Application_start()メソッドでこの行を確認します。

log4net.Config.XmlConfigurator.Configure();

0

設定ファイルは正しいようです。次に、Log4net構成ファイルをアプリケーションに登録する必要があります。したがって、以下のコードを使用できます:

var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config"));

プロセスを登録した後、以下の定義を呼び出してロガーを呼び出すことができます。

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

log.Error("Sample log");

0

ロガーをNugetパッケージに移動する必要がありました。以下のコードをNuGetパッケージプロジェクトに追加する必要があります。

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]

詳細については、https://gurunadhduvvuru.wordpress.com/2020/04/30/log4net-issues-when-moved-it-to-a-nuget-package/を参照してください。


回答としてのリンクは避けてください。彼らは常に動作するとは限りません。おそらく、回答を編集して、リンクに情報の概要を含めます。
デレクC.

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.