1

参照を追加し、App.config に構成を追加し、AssemblyInfo.cs にロード エントリを追加して、C# WinForms アプリケーションに log4net をセットアップしました。構成は、すべてのレベルをキャッチするように設定されています。

私の Program.cs では、すべてのエラーをキャッチできるようにしています。

私は現在これを持っています:

    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        private static readonly ILog log = LogManager.GetLogger(typeof(Program));
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            try
            {
                log.Info("this works");
                Application.Run(new Forms.Main());
            }
            catch (Exception e)
            {
                log.Info("nothing here", e);
            }
        }
    }

実際にログファイルに書き込めることをテストするために「これは機能します」を入れました。これはログに表示されます:

2012-09-30 23:00:53,959 [INFO ] - this works

私のlog4netもイミディエイトウィンドウに書き込むように設定されているため、意図的にいくつかのエラーを作成しました。これがウィンドウに表示されるものです。

ContractManagement.Program: 2012-09-30 23:08:09,177 [INFO ] - this works
A first chance exception of type 'System.Data.SqlServerCe.SqlCeException' occurred in System.Data.SqlServerCe.dll

ログにも 2 番目のエラーが表示されることを期待していましたが、その兆候はありません :(


キース・ニコラスのコメントに続いて、私はこれを行いました:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    log.Info("this works");
    throw new System.ArgumentException("Keith Nicholas Test");
    //Application.Run(new Forms.Main());

}

ログファイルには次のように表示されます。

2012-09-30 23:19:12,090 [INFO ] - this works
System.ArgumentException: Keith Nicholas Test
   at ContractManagement.Program.Main() in c:\ContractManagement\ContractManagement\Program.cs:line 25
4

3 に答える 3

1
A first chance exception of type 'System.Data.SqlServerCe.SqlCeException' occurred in System.Data.SqlServerCe.dll

log4net 構成の問題ではありません。内部ライブラリの 1 つが例外をスローし、それをキャッチしたため、catch 句に到達しませんでした。開発環境は、キャッチされた例外に関する情報を即時ウィンドウに直接書き出しました。

はい、log4netは即時ウィンドウに書き込みますが、即時ウィンドウのすべてがlog4netからのものではありません。

[更新 - 複数のスレッドのロギングに関するより一般的な問題を反映するため]

質問とは直接関係ありませんが、log4net ロギングでインストルメント化されたクラスが同時に異なるスレッドで実行されることがあります。同時に複数のスレッドから debug、info、および/または error メソッドを取得する場合があります。App.config のメッセージ パターンを更新してスレッドを含めることをお勧めします。これにより、どのメッセージがどのスレッドから来たかを追跡できます。例えば:

<conversionPattern value="%level %thread %logger - %message%newline" />

これは単なる例です。変換パターンが含まれていないため、%thread を追加した場合にどのようになるか正確にはわかりません。

于 2012-09-30T22:20:04.303 に答える
0

後でたくさんグーグルして、私は持っています:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    private static readonly ILog log = LogManager.GetLogger(typeof(Program));
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
        AppDomain.CurrentDomain.FirstChanceException += FirstChanceHandler;

        Application.Run(new Forms.Main());
    }

    private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
    {
        log.Info(e.Exception.Message);
    }

    private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        log.Info(e);
    }

    static void FirstChanceHandler(object source, FirstChanceExceptionEventArgs e)
    {
        log.Info(e.Exception.Message);
    }
}

これにより、キャプチャしたいと思っていた FirstChanceExceptions がキャッチされます。

2012-10-01 00:24:02,532 9 ContractManagement.Program [INFO ] - The database file cannot be found. Check the path to the database. [ Data Source = C:\ContractManagement\ContractManagement\bin\Debug\ContractManagement.sdf ]
于 2012-09-30T23:28:14.727 に答える
0

新しいスレッドから例外がスローされた場合、その catch ブロックによってキャッチされません....

ロギングが正常に機能していることを証明するためだけに:-

アプリケーションを実行する代わりに、最初の log.Info の直後に新しい Exception をスローして、例外ロギングが機能していることを証明します。

お気に入り :-

try
{
    log.Info("this works");
    throw new System.ArgumentException("Keith Nicholas Test");
}
catch (Exception e)
{
   log.Info("nothing here", e);
}
于 2012-09-30T22:14:17.167 に答える