我刚刚在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
答案 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 ]