对于一个应用程序而言,Log 必不可少.

在.net 里面,最简单的方式就是用Console 来输出 信息了,例如下面的例子:

    public class Program
{
public static void Main(string[] args)
{
One();
Two();
RecursiveTest(0, 5);
Console.ReadLine();
}
private static void One()
{
Console.WriteLine("One");
}
private static int Two()
{
Console.WriteLine("Return 2");
return 2;
}
private static void RecursiveTest(int from, int to)
{
if (from < to)
{
Console.WriteLine(string.Format("{0} Enter Recursive Test:{1}", string.Join("", Enumerable.Repeat(" ", from)), from));
RecursiveTest(from + 1, to);
Console.WriteLine(string.Format("{0} Exit Recursive Test:{1}", string.Join("", Enumerable.Repeat(" ", from)), from));
}
}
}

这种方式的有点是简单,快捷,很容易的就可以输出你所感兴趣的内容,可是缺点也很明显,就是当内容多的时候,看不清:

为了能够更方便的看清楚记录的Log 内容,有一种简单的方式: 把Console 替换成 Debug。

public class Program
{ public static void Main(string[] args)
{
One();
Two();
RecursiveTest(0, 500);
Console.ReadLine();
}
private static void One()
{
Debug.WriteLine("One");
}
private static int Two()
{
Debug.WriteLine("Return 2");
return 2;
}
private static void RecursiveTest(int from,int to)
{
if (from < to)
{
Debug.WriteLine(string.Format("{0} Enter Recursive Test:{1}", string.Join("", Enumerable.Repeat(" ", from)), from));
RecursiveTest(from + 1, to);
Debug.WriteLine(string.Format("{0} Exit Recursive Test:{1}", string.Join("", Enumerable.Repeat(" ", from)), from));
}
}
}

然后就可以在Output窗口下看到内容了。

Debug 的代码在release 模式下并不会真正的执行,这得益于条件编译,如果要在release 模式下也记录日志的话,那么可以使用Trace。

Trace 还提供了多种方法,可以记录Information,Error 等。

可能你已经注意到了把 Console 切换到Debug 后,控制台反而没有输出消息了。

这是因为Debug 的默认输出是Output 窗口,如果想要在控制台上显示的话,应该把 控制台添加到Debug 的输出中去,例如:

 public static void Main(string[] args)
{
Debug.Listeners.Add(new ConsoleTraceListener(true));
One();
Two();
RecursiveTest(0, 5);
Console.ReadLine();
}

事实上,你除了添加ConsoleTraceListener,你还可以添加下面几种Listener。

例如,我想要把日志输出到EventLog 里面去:

Debug.Listeners.Add(new EventLogTraceListener("DebugAndTrace"));

除了在代码中Hard code 代码之外,还可以使用Config 文件。

<?xml version="1.0" encoding="utf-8" ?>

<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.diagnostics>
<trace autoflush="true" indentsize="4"> <listeners>
<add name="console" type="System.Diagnostics.ConsoleTraceListener" />
<add name="fileListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="TextWriterOutput.log" />
</listeners>
</trace>
</system.diagnostics>
</configuration>

输出如下:

Logging with Debug And Trace (一)的更多相关文章

  1. java.lang.Exception: DEBUG STACK TRACE for PoolBackedDataSource.close().

    java.lang.Exception: DEBUG STACK TRACE for PoolBackedDataSource.close(). java.lang.Exception: DEBUG ...

  2. 8个日志级别(OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL)

    log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),优先级从高到低依次为:OFF.FATAL.ERROR.WARN.INFO.DEBUG.TRACE. ALL. ALL 最低等 ...

  3. C# Debug和Trace:输出调试信息

    在 C# 语言中允许在程序运行时输出程序的调试信息,类似于使用 Console.WriteLine 的方式向控制台输出信息.所谓调试信息是程序员在程序运行时需要获取的程序运行的过程,以便程序员更好地解 ...

  4. Debug与Trace工具类的应用

    在写Console程序的时候,能够使用Console.WriteLine()来时时的输出程序的执行状态和各种參数此刻的信息.可是假设是Windows Form程序,我们要怎样实时的观測程序的执行状况呢 ...

  5. DEBUG STACK TRACE for PoolBackedDataSource.close().

    我使用generator生成的代码,xml里面的内容没有覆盖重写,而是在下面直接追加,所以需要把以前的全部删除,然后在用generator生成.如果这个不能解决问题,就查查别人的问题.

  6. debug,trace,release项目配置区别

    Debug模式是用来调试用的,它生成的执行文件中含有大量调试信息,所以很大: Release模式生成的执行文件消除了这些调试信息,可用来作为成品发布 Debug只在debug状态下会输出,Trace在 ...

  7. Trace、Debug和TraceSource的使用以及日志设计 .

    [-] Trace 和 Debug区别 什么是Listeners 跟踪开关 使用BooleanSwitch开关 使用TraceSwitch开关 使用TraceSource代替Trace和Debug 设 ...

  8. C#学习笔记14——TRACE、DEBUG和TRACESOURCE的使用以及日志设计

    Trace.Debug和TraceSource的使用以及日志设计   .NET Framework 命名空间 System.Diagnostics 包含用于跟踪执行流程的 Trace.Debug 和 ...

  9. C# 调试之 Debug.WriteLine()、Trace.WriteLine()

    Trace 类 和 Debug 类的区别在于,Trace 类会同时在 Debug.Release 模式下起作用,而 Debug 只作用在 Debug 模式下. 区别: 1. 输出跟踪信息 Trace. ...

随机推荐

  1. 四、线程同步之Lock和Condition

    Lock同步锁 Lock 在jdk1.5  提供了Lock以便执行同步操作,和synchronized不同的是Lock提供了显示的方法获取锁和释放锁.Lock提供了以下几个方法,请求和释放锁: voi ...

  2. mongodb防火墙配置

    http://ruby-china.org/topics/20128 https://docs.mongodb.com/manual/tutorial/configure-linux-iptables ...

  3. js立即调用的函数表达式

    1.多种实现 // 下面2个括弧()都会立即执行 (function () { /* code */ } ()); // 推荐使用这个 (function () { /* code */ })(); ...

  4. 记录一下折腾webp 的过程

    最近有客户想要处理webp 的动图,情况当然是我们并不能处理webp 格式的图片.这事就交给了我来折腾,一开始想着用瑞士军刀ffmpeg.结果是折腾了差不多一天,前前后后编译了几十次ffmpeg 源码 ...

  5. android shape的使用(转)

    shape用于设定形状,可以在selector,layout等里面使用,有6个子标签,各属性如下: <?xml version="1.0" encoding="ut ...

  6. IMEI串号

    IMEI串号就是国际移动设备身份码,是电子设备的唯一身份证,由于它的唯一性,它可以用来查询电子设备的保修期还有产地,可以说用处直逼人民的身份证啊! 在拨号键盘页面  输入[*#06#]五个字符

  7. Oracle的tnsnames.ora配置(PLSQL Developer)

    首先打开tnsnames.ora的存放目录,一般为D:\app\Administrator\product\11.2.0\client_1\network\admin,就看安装具体位置了. 步骤阅读 ...

  8. 【Asp.Net MVC】日常---路由

    想要这样的路由 不带id:http://test.mymong.com/Home/List.html 带id:http://test.mymong.com/Home/Del/561755ba3af24 ...

  9. C# 发送邮件中包含图片

    List<string> To = new List<string>(); To.Add("jake_ge@askey.com.tw"); List< ...

  10. Codeforces CF#628 Education 8 F. Bear and Fair Set

    F. Bear and Fair Set time limit per test 2 seconds memory limit per test 256 megabytes input standar ...