在C#.NET中考虑有用的跟踪消息

时间:2011-05-10 18:07:59

标签: c# .net logging trace

我正在尝试编写一个错误和记录框架,虽然我认为我现在手头上有错误,但是由于之前从未解决过这个问题,我会更加粗略一些。我现在最麻烦的部分是跟踪消息,这显然与完全错误不同,不应该以相同的方式处理。当然,当我试着考虑应该如何处理时,我画了一个空白。

您在跟踪消息中发现了哪些有用的东西,无论是稍后调试还是过滤?显然,有一些事情,如级别(信息,警报,警告,严重),消息,AppDomain,还有什么?

对于设置的一些背景,我正在处理的日志框架将存在于我们的应用程序类库中,并将信息放入数据库表,MSMQ行或平面日志文件(应用程序可配置)。

请不要建议现成的产品,如log4net,企业库,ELMAH或类似的东西作为这个问题的答案。我们已经考虑了每个流行的添加并将它们丢弃,因为它们对我们的需求没用。如果您想建议这些产品中的数据很好,但很多地方我都要求输入挂了推荐我们花了几周时间审查和丢弃而不是回答问题的事情。我希望Stack能够展示更多的课程。

3 个答案:

答案 0 :(得分:2)

出于记录目的,我会考虑包括登录的用户,时间戳和特定于域的信息(您必须自己决定)。对于用于调试的跟踪消息,我将包含可能很麻烦的变量和参数的类/方法和值。

答案 1 :(得分:1)

我喜欢使用不同跟踪级别的模式来处理那些“属于”这些级别的事物。例如,在处理请求并将其他请求联合到其他服务器的Web服务的情况下,我可能会记录我收到请求为“信息”的事实,而我可能会将完整请求的内容打印为'冗长”。

我基本上将不同类型的事件分类为不同级别,在整个代码库中撒上各种级别,然后框架/产品的消费者可以选择“详细”模式来查看每个请求和响应对象的每个最后一个参数,而不是'信息'只是能够看到请求/响应的流程。

根据严重程度,偶然发生的错误事件(收到非OK状态代码)应该是“警告”或“错误”。我喜欢考虑导致进程中止的事情(例如,所有外部服务器都已关闭,我无法满足您的请求)作为“错误”价值,以及值得注意但不会中断工作流程的事情(例如1外部服务器的副本不可用或它的往返响应超过一些延迟阈值)为'警告'值得。

我所做的一些其他很酷的事情是在Logger实现中添加一个方法,该方法自动知道Logger.WriteLine(...)的调用者是谁并相应地打印它:

    /// <summary>
    /// Any additional layers between this log class and calling classes will cause 
    /// this stack trace to return incorrect 'calling' method name
    /// </summary>
    /// <returns></returns>
    private static string GetCallingMethod()
    {
        var stack = new StackTrace();
        var className = string.Empty;
        var methodName = string.Empty;
        foreach ( var frame in stack.GetFrames() )
        {
            className = frame.GetMethod().DeclaringType.FullName;
            methodName = frame.GetMethod().Name;
            if ( className != typeof( Logger ).FullName )
            {
                break;
            }
        }
        return string.Format( "{0}.{1}", className, methodName );
    }

答案 2 :(得分:0)

我认为其中一些取决于您的应用程序的功能。例如,如果您的应用程序是数据库密集型的,我认为您肯定想要记录您的sql语句。来自用户的任何动态输入也可以作为调试日志记录。查看日志时,日期戳总是有用的。堆栈跟踪其他人提到的错误。还有其他情况,但这些是一对。我很好奇为什么你排除了log4net等现成的产品。如果你在网上问过这个问题,我很想看到链接。