我的应用程序有一个日志工具。我以分层方式登录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进行日志记录。
关于如何使这更简单,更易维护和更好的任何好主意(更改日志提供程序不是一种选择)?
答案 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");
}
}