无法使用C#中的TraceSource方法写入日志文件

时间:2014-01-25 06:01:09

标签: c# tracing

我使用以下代码记录异常,但它没有将任何日志写入文件" mylistener.log "。我在这里缺少什么?

using System;
using System.Diagnostics; 

namespace TraceSourceApp
{
    class Program
    {
        private static TraceSource mySource = new TraceSource("TraceSourceApp");
        static void Main(string[] args)
        {          
            TextWriterTraceListener textListener = 
               new TextWriterTraceListener("myListener.log");

            mySource.Listeners.Add(textListener);
            int i = 10, j = 0, k;
            try
            {
                k = i / j;
            }
            catch
            {
                mySource.TraceEvent(TraceEventType.Error, 12,
                    "Division by Zero");
            }      
            mySource.Close();               
        }           
    }
}

1 个答案:

答案 0 :(得分:2)

为了让TraceSource将数据写入文件,您需要将TraceSource的Switch - 属性设置为SourceSwitch实例。按如下方式更改您的代码:

static void Main(string[] args)
{
    TextWriterTraceListener textListener = new TextWriterTraceListener("myListener.log");
    // New code starts here
    var sourceSwitch =  new SourceSwitch("SourceSwitch", "Verbose");
    mySource.Switch = sourceSwitch;
    // New code ends here
    mySource.Listeners.Add(textListener);
    // ...

除了让TraceWriter自动刷新其内容之外,在main方法的开头设置Trace.AutoFlush(示例在没有它的情况下工作,但确保侦听器被刷新是一个好主意为了不丢失日志条目):

static void Main(string[] args)
{
    Trace.AutoFlush = true;
    // ...

作为替代方案,您还可以通过在结尾处调用其Flush - 方法来显式刷新侦听器:

textListener.Flush();
mySource.Close();

在现实世界的代码中,我建议添加一个try-finally或者使用block来断言Flush被调用并且源被关闭。