C# 如何改进我的日志类
我有一个用于我的应用程序的日志工具。我以分层方式登录到XML(这意味着我可以嵌套日志项)。我的C# 如何改进我的日志类,c#,java,C#,Java,我有一个用于我的应用程序的日志工具。我以分层方式登录到XML(这意味着我可以嵌套日志项)。我的Log(string,bool)采用两个参数,一个是要记录的字符串,另一个是bool值,用于确定此注释是否应嵌套在前一个日志注释下面。使用PopLog()方法转到父级,并继续在父级进行日志记录 这意味着当我这样记录时: Log("first", false); ... Log("Second", true); ... Log("Third", true); PopLog(); PopLog(); Pop
Log(string,bool)
采用两个参数,一个是要记录的字符串,另一个是bool值,用于确定此注释是否应嵌套在前一个日志注释下面。使用PopLog()
方法转到父级,并继续在父级进行日志记录
这意味着当我这样记录时:
Log("first", false);
...
Log("Second", true);
...
Log("Third", true);
PopLog();
PopLog();
PopLog();
这将产生以下结果:
<first>
<second>
<third>
</second>
</first>
当前设计的问题是很难跟踪日志级别、我在日志树中的深度以及我是否需要弹出、使用true记录还是使用false记录
关于如何使它更简单、更易维护和更好(更改日志提供程序不是一个选项)有什么好主意吗?为了可读性,我想添加一个可能性,像孩子一样AddLog()
。例如:
Log(“第一”).Log(“第二”).Log(“第三”)
这基本上意味着log()
应该返回内容日志类型
希望很明确,很抱歉,但是从mobile编写一些具体的代码示例是一个混乱的过程,但只是为了给出一个提示。也许您可以添加XPath表达式而不是bool值
Log("first", "/first");
Log("Second", "/first/second");
我认为PopLog()
应该是可选的,并且只有在您知道需要升级一级时才调用它。否则,在执行结束时,应调用CloseAllTags()
,以关闭所有打开的标记。如果没有打开的标记,PopLog()。
这样,您就不需要在嵌套级别上保留选项卡。在日志类中,您可以有3个属性:
1.ID,它对每个实例都是唯一的。
2.级别,这是一种int类型,用于描述日志的深度。
3.父级,这将是日志的ID,它在xml中高于一级
然后,您可以编写一些方法,允许您使用上述属性识别日志所在的位置以及日志的深度。更好的设计是,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");
}
}
为什么不使用log4net或log4j?