如何改进我的日志类

时间:2012-01-05 11:12:17

标签: c# java

我的应用程序有一个日志工具。我以分层方式登录XML(这意味着我可以嵌套日志项)。我的Log(string, bool)有两个参数,一个是要记录的字符串,另一个是bool值,用于确定此注释是否应嵌套在上一个日志注释之下。使用PopLog()方法转到父级,并继续登录父级别。

这意味着当我这样记录时:

Log("first", false);
...
Log("Second", true);
...
Log("Third", true);
PopLog();
PopLog();
PopLog();

这给出了以下结果:

<first>
  <second>
    <third>
  </second>
</first>

我对当前设计的问题是很难跟踪我的日志级别,我在日志记录树中的深度,以及是否需要弹出,使用true进行日志记录或使用false进行日志记录。

关于如何使这更简单,更易维护和更好的任何好主意(更改日志提供程序不是一种选择)?

5 个答案:

答案 0 :(得分:2)

我会添加以提高可读性AddLog()像孩子一样的可能性。例如:

Log("first").Log("second").Log("third")

这基本上意味着log()应该返回content log类型。

希望很清楚,对不起但是从移动设备上写下来写一些具体的代码示例是一团糟,但只是提示一下。

答案 1 :(得分:0)

也许你可以添加XPath表达式而不是bool值

Log("first", "/first");
Log("Second", "/first/second");

答案 2 :(得分:0)

我会说PopLog()应该是可选的,只有当你知道你需要提升一级时才会被调用。否则,在执行结束时应该调用CloseAllTags()来关闭所有打开的标记。如果没有打开的标签,PopLog()应该什么都不做。 这样您就不需要密切关注嵌套级别了。

答案 3 :(得分:0)

在您的日志类中,您可以拥有3个属性: 1. ID,对每个实例都是唯一的。 2. Level,这是一种int类型,用于描述日志的深度。 3. Parent,它将是xml中一级以上的日志ID。

然后,您可以编写一些方法,使您可以使用上述属性识别日志所在的位置以及深度。

答案 4 :(得分:0)

更好的设计是,IMO,将推/弹行为与日志记录本身分开。这是C#中的解决方案,使用IDisposable

 class IndentedLog : IDisposable
 {
    public IndentedLog() 
    {
       Log.IndentLevel++; 
    }
    public void Dispose() 
    {
       Log.IndentLevel--;
    }
 }

这样,您可以执行以下操作:

     Log("first");
     // ...
     using (new IndentedLog())
     {
         Log("second");
         // ...
         using (new IndentedLog()) 
         {
            Log("third");
         }
     }