Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何改进我的日志类_C#_Java - Fatal编程技术网

C# 如何改进我的日志类

C# 如何改进我的日志类,c#,java,C#,Java,我有一个用于我的应用程序的日志工具。我以分层方式登录到XML(这意味着我可以嵌套日志项)。我的Log(string,bool)采用两个参数,一个是要记录的字符串,另一个是bool值,用于确定此注释是否应嵌套在前一个日志注释下面。使用PopLog()方法转到父级,并继续在父级进行日志记录 这意味着当我这样记录时: Log("first", false); ... Log("Second", true); ... Log("Third", true); PopLog(); PopLog(); Pop

我有一个用于我的应用程序的日志工具。我以分层方式登录到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记录

关于如何使它更简单、更易维护和更好(更改日志提供程序不是一个选项)有什么好主意吗?

为了可读性,我想添加一个可能性,像孩子一样
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?