代码之家  ›  专栏  ›  技术社区  ›  Oscar Mederos soandos

正在查找.NET的自动日志记录工具/库[已关闭]

  •  2
  • Oscar Mederos soandos  · 技术社区  · 15 年前

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

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

    应用程序名 遇到了一个 问题需要解决。我们是 抱歉给您带来不便”

    我目前正在处理我的应用程序异常,但这是一个外部的问题,我无法从该错误中获得任何信息,所以我想要任何自动库来帮助我解决这个问题。

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

    附笔 :这是一个多线程应用程序,必须定时控制(一个用于每5秒监视一个文件夹,另一个用于监视线程列表…)。我在这里使用的是Windows7,一切都正常。

    7 回复  |  直到 13 年前
        1
  •  2
  •   GenEric35    15 年前

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

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

    using System;
    

    使用System.Diagnostics;

    类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
  •  4
  •   Jaxidian    15 年前

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

        3
  •  2
  •   Community CDub    8 年前

    有来自 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

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

        4
  •  1
  •   Dennis G.    15 年前

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

    要记录您的应用程序数据和事件,您必须手动插入代码,这真的是没有办法解决的。如果您有一个大型应用程序,那么一次手动检测所有代码将无法工作(这太耗时了),因此我通常建议首先从最关键的例程和模块开始。

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

        5
  •  0
  •   Naveen    15 年前

    你试过ETW吗?ETW是Windows中速度最快、开销最小的日志记录系统。ETW内置于内核中。微软将ETW用于他们构建的每一个应用程序,从Windows到vs.net。

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

    以下是一些链接 ETW 我也有一些帖子 ETW in managed code

        6
  •  -2
  •   Shawn    15 年前

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

        7
  •  -2
  •   wonde    15 年前

    尝试在具有不同入口级别的窗口事件查看器中记录异常。检查来自msdn的样本代码 http://support.microsoft.com/kb/307024