寻找.NET的自动化日志工具/库

时间:2010-04-02 00:45:38

标签: c# .net logging error-handling

我正在寻找一个用于.NET的库/工具,它几乎记录了我的C#应用​​程序(Windows窗体)中发生的所有事情。

问题是我正在向客户端(Windows XP)提供应用程序,在完成某项任务后,会出现经典的Microsoft错误窗口:

  

ApplicationName 遇到过   问题和需要关闭。我们是   很抱歉给您带来不便“

我正在处理我的应用程序异常,但这是外部的,我无法从该错误中得到任何结果,所以我希望任何自动化库可以帮助我。

如果记录执行的每一行代码,它会工作,orr只记录在出现错误之前正在执行的行,或者可以给我更多关于该错误的信息。

P.S :这是一个多线程应用程序,需要Timer控件(一个用于每隔5秒观看一个文件夹,另一个用于观看线程列表......)。我在这里使用Windows 7,一切似乎都运行正常。

7 个答案:

答案 0 :(得分:4)

我认为你不会找到你刚插入的日志记录工具,它会记录发生的每一件事。您将不得不插入任何日志框架所具有的钩子。 Here是一个受欢迎的,免费的。

答案 1 :(得分:2)

为什么不登录Windows事件查看器,这就是它的用途。从简单的配置设置,您可以将其切换为包括所有级别,例如,4-Verbose,3-信息,2-warning,1-Error,您只需将消息记录为这4种类型之一。您也可以将它与布尔跟踪开关结合起来进行调试跟踪,但这不是必需的。

Windows事件查看器还为您提供摘要,可以远程连接,系统管理员可以轻松使用它。

using System;

使用System.Diagnostics;

class MySample {

public static void Main(){

    // Create the source, if it does not already exist.
    if(!EventLog.SourceExists("MySource")){
        EventLog.CreateEventSource("MySource", "MyNewLog");
        Console.WriteLine("CreatingEventSource");
    }

    // Create an EventLog instance and assign its source.
    EventLog myLog = new EventLog();
    myLog.Source = "MySource";

    // Write an informational entry to the event log.    
    myLog.WriteEntry("Writing to event log.");

}

}

听起来你需要的是放置断点并逐步执行代码,如果它是线程化的,只需在步骤完成代码时打开visual studio中的线程窗口。如果许多线程难以调试,暂时会对您的计时器造成更长的延迟。

答案 2 :(得分:2)

来自的想法 C#: Try-catch every line of code without individual try-catch blocks

我创建了一个这样的类:

public delegate void VoidDelegate();
public static class L
{
    public static void g(VoidDelegate v)
    {
        DateTime now1, now2;
        StackTrace trace = new StackTrace(true);

        now1 = DateTime.Now;
        v();
        now2 = DateTime.Now;

        File.AppendAllText(@"C:\L.g", 
            now1.ToString("yyyy/MM/dd HH:mm:ss.fffffff") + "\t" +
            trace.GetFrame(1).GetFileName() + ":" + trace.GetFrame(1).GetFileLineNumber() + "\t" +
            (now2 - now1).Seconds.ToString() + ((now2 - now1).Milliseconds / 1000f).ToString().Substring(1) + 
            Environment.NewLine);
    }
}

要应用日志,您可以添加

L.g(() =>/**/

/**/);

到每一条可能的行,例如

string[] sAryArg = null;
L.g(() =>/**/sAryArg = Environment.GetCommandLineArgs()/**/);
L.g(() =>/**/this.lblUserName.Text = sAryArg[3]/**/);
L.g(() =>/**/this.lblDatabase.Text = DbUtil._sEnvID_/**/);
L.g(() =>/**/this.lblVersion.Text =
    Assembly.GetExecutingAssembly().GetName().Version.Major.ToString() + "." +
    Assembly.GetExecutingAssembly().GetName().Version.Minor.ToString() + "." +
    Assembly.GetExecutingAssembly().GetName().Version.Build.ToString()/**/);

生成的日志文件如下所示:

  

2012/02/29 10:41:18.1835418 D:\ xxx \ frmMain.cs:351 0.015

     

2012/02/29 10:41:18.1991666 D:\ xxx \ frmMain.cs:352 1.203

要禁用日志,只需批量删除周围的两个标记即可。

答案 3 :(得分:1)

关于您的要求(“几乎记录我的C#应用​​程序中发生的所有事情”),您将获得的最接近的是使用具有AOP支持和自动异常处理的日志记录框架。面向方面编程将允许您检测方法并跟踪方法执行。与SmartInspect等记录工具(免责声明:我是SmartInspect背后的开发人员)一起,您可以监控和分析方法执行并查看上下文中的异常(参见下面的屏幕截图)。

要记录您的应用程序数据和事件,您必须手动检测代码,实际上没有办法解决它。如果您有一个大型应用程序,一次手动检测所有代码将不起作用(这太耗时),所以我通常建议首先从最关键的例程和模块开始。

alt text http://www.gurock.com/images/feature/smartinspect-screenshot.png

答案 4 :(得分:0)

你试过ETW吗? ETW是Windows中速度最快,开销最小的日志记录系统。 ETW内置于内核中。 MS为他们构建的每个应用程序使用ETW,从Windows到VS.NET。

这不是自动日志记录工具。但是,无需修改代码,即可为应用程序中的每个调用提供堆栈跟踪。如果您需要添加自定义日志消息,那么您可以为此编写代码。

以下是ETW的部分链接,我在ETW in managed code上的帖子也很少

答案 5 :(得分:-2)

我过去曾使用log4net。您可以将其连接起来,以便在发生未捕获的异常时,将其记录到文件中或写入数据库。

答案 6 :(得分:-2)

尝试在具有不同入门级别的窗口事件查看器中记录您的异常。检查MSDN http://support.microsoft.com/kb/307024

中的示例代码