C# .NET 中有用跟踪消息的注意事项

本文关键字:消息 注意事项 跟踪 有用 NET | 更新日期: 2023-09-27 17:56:05

我正在尝试开发一个错误和日志记录框架,虽然我认为此时我已经掌握了错误,但由于以前从未解决过这个问题,我对其他一些事情有点粗略。 我现在最麻烦的部分是跟踪消息,这显然与直接错误不同,不应以相同的方式处理。 当然,当我试图思考应该如何处理它们时,我画了一个空白。

你发现跟踪消息中有哪些有用的内容,无论是用于调试还是稍后筛选内容? 显然,有一些东西,如级别(信息、警报、警告、严重)、消息、AppDomain,但还有什么?

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

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

C# .NET 中有用跟踪消息的注意事项

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

我喜欢

使用对"属于"这些级别中的事物使用不同跟踪级别的模式。 例如,对于处理请求并将其他请求联合到其他服务器的 Web 服务,我可能会将我收到请求的事实记录为"信息",而我可能会将完整请求的内容打印为"详细"。

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

根据

其严重性,明显错误的事件(收到的非正常状态代码)应为"警告"或"错误"。 我喜欢认为导致进程中止的事情(例如,所有外部服务器都关闭,我不可能满足您的请求)作为"错误"值,以及值得注意但不中断工作流程的事情(例如,外部服务器的 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 );
    }

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