Program.cs中的log4net

时间:2012-09-30 22:10:24

标签: c# winforms log4net

我刚刚在C#WinForms应用程序中设置了log4net,添加了引用,将配置添加到App.config和AssemblyInfo.cs中的加载条目。配置设置为捕获所有级别。

在我的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

我原本希望在日志中看到第二个错误,但没有任何迹象:(


根据Keith Nicholas的评论,我做到了这一点:

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

3 个答案:

答案 0 :(得分:1)

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

这不是log4net配置的问题。其中一个内部库引发了一个异常然后捕获它,所以它从未进入你的catch子句。开发环境将有关捕获的异常的信息直接写到了即时窗口。

是的,log4net正在写入即时窗口,但不是即时窗口中的所有内容都来自log4net。

[更新 - 反映记录多个线程的更多常见问题]

虽然与您的问题没有直接关系,但有时一个已经使用log4net日志记录进行检测的类可以同时在不同的线程中执行。您可以同时从多个线程获取调试,信息和/或错误方法。建议您更新App.config中的消息模式以包含该线程,以便您可以跟踪哪个消息来自哪个线程。例如:

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

这只是一个例子 - 你没有包含你的转换模式,所以如果你要添加%thread,我不确定你会是什么样子。

答案 1 :(得分: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);
}

答案 2 :(得分: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 ]