【问题标题】:Nothing shows up in my log file我的日志文件中没有显示任何内容
【发布时间】:2015-10-03 12:40:02
【问题描述】:

我正在尝试创建一个记录器,将所有堆栈跟踪记录到我的文本文件“log.txt”中。当我运行此代码时,会在目录中创建一个空白 log.txt 文档,但 txt 文件中没有写入任何内容。

我的以下代码如下:

public void Log()
    {
        // Create a file for output .txt.
        Stream debugFile = File.Create(@"C:\temp\log.txt");
        // create TextWriterTraceListener named "file"
        TextWriterTraceListener debugWriter = new TextWriterTraceListener(debugFile, "file");
        // add to debug listeners
        Debug.Listeners.Add(debugWriter);
        // set callstack to be shown
        Debug.Listeners["file"].TraceOutputOptions |= TraceOptions.Callstack;
        // set auto-flush
        Debug.AutoFlush = true;
        Debug.WriteLine("Message: " + Environment.StackTrace);
        debugFile.Close();
    }

【问题讨论】:

  • 使用您拥有的代码示例,我无法重现您的问题。我的日志文件里面有文本。如果我将配置更改为 Release,则日志文件为空。
  • 你设置了 DEBUG 标志,对吧?
  • 我在构建配置中设置了 Active(Debug)。
  • 再次检查“定义调试常量”框是否被选中。如果不是,Debug 不会写任何东西
  • 谢谢,它成功了。选中“定义跟踪常数”框有什么作用?

标签: c# logging tracelistener


【解决方案1】:

确保在项目的“属性”>“构建”部分中选中了“定义调试常量”复选框。

它基本上只是一个已定义的常量,尽管 Microsoft 有点神秘地称它们为“条件编译符号”……VS 根据是否定义了 TRACE 或 DEBUG 来做一些事情(比如允许写出调试或跟踪侦听器)。通过这种方式,您可以将所有您想要的调试助手写入您的文件,并且只要它们被#if#endif 包围,一旦您准备好部署您的程序,就不要定义那些常量,并且编译器将忽略(不编译)这些代码部分。

您也可以定义自己的常量。假设您在 Conditional Compilation Symbols 框中键入以下内容:“SENDLOGGING”。在您的代码中,您可以

private void Log()
{
    #if LOCALLOGGING
    //write to a file 
    #elif SENDLOGGING
    //send yourself an email with relevant info
    #else
    //do some other stuff
    #endif
}

在这种情况下,中间部分将运行。如果您定义了 LOCALLOGGING,第一个块将运行。

更多阅读:https://msdn.microsoft.com/en-us/library/0feaad6z.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    相关资源
    最近更新 更多