TextWriterTraceListener和带有GUID的跟踪文件名

17

我在我的应用程序中使用 TextWriterTraceListenerSystem.Diagnostics)来跟踪多个事项,例如异常。

该应用程序在终端服务器上运行,如果有许多用户同时使用,则侦听器开始创建具有随机GUIDs的许多跟踪文件名。

是否有可能或变通方法来避免这种行为?


我不知道这是否是dot net这样做的原因,但通过创建多个文件,每个文件都会得到一个用户的交互,而不是多个用户混合在一起。 - Jay
3个回答

15
我刚看了一下TextWriterTraceListener的文档,页面上有一个注释大约在三分之一的位置。

如果尝试写入正在使用或不可用的文件,则文件名将自动添加GUID前缀。

因此,这似乎是按设计进行的。如果文件确实不可用,则目前的实现无法解决任何问题。你可以尝试编写自定义的TextWriterTraceListener实现,覆盖相关的Write/WriteLine方法,以便输出到文件,每个用户都有一个更适合你需求的名称。
如果你想让终端服务器上所有用户的所有日志记录都写入单个文件,那么你几乎肯定需要运行某种“第三方”进程来“拥有”该文件并同步写入它,例如一个Windows服务,然后由你自定义的TextWriterTraceListener调用。

3
这并没有解释我所处的情况,我的应用程序池只有一个,运行单个工作进程,写入指定的文件名,却仍然产生了多个以guid命名的重复日志文件。因为只有一个进程被配置为使用它,所以不可能有其他进程尝试访问该文件。 - Tom W
@TomW - 我和你的情况一样。我认为正在由IIS处理的并行请求是罪魁祸首。也许如果每个线程有一个日志文件,它会表现得更好。 - Tim Lewis
1
“仅有一个用户”并不等同于“仅有一个进程”。Dot net库函数可能会产生多个进程。我仍然对这种行为感到困惑。当我在笔记本电脑上运行时,每次启动应用程序都会得到一个新的GUID命名文件。但是当我在我们的测试服务器上运行时,所有内容都被写入一个大文件中。 - Jay

0

我目前正在测试在我的输出方法中添加 System.Diagnostics.Trace.Listeners.Clear()...

            // Upon a new day re-create the TextWriterTraceListener to update our file name...
            if (_date?.Day != DateTime.Now.Day) { _listener = null; }

            if (_listener == null)
            {
                System.Diagnostics.Trace.Listeners.Clear();

                _fileName = $"{DateTime.Now.ToString("yyyy-MM-dd")}_Trace.json";

                // Add a writer that appends to the trace.log file:
                _listener = new System.Diagnostics.TextWriterTraceListener(_fileName);

                _listener.IndentSize = 4;
                _listener.TraceOutputOptions = System.Diagnostics.TraceOptions.None; // TraceOptions.DateTime | TraceOptions.ThreadId;
                System.Diagnostics.Trace.AutoFlush = true;
                System.Diagnostics.Trace.Listeners.Add(_listener);

                // Obtain the Console's output stream, then add that as a listener...
                System.Diagnostics.Trace.Listeners.Add(new System.Diagnostics.TextWriterTraceListener(Console.Out));
            }

0

修复是不小心多次调用Trace.Listeners.Add(xxx listener)吗?

因为如果添加了多个侦听器,当您调用Trace.writeline()时,它们会向所有侦听器写入。

此外,本地IIS在关闭应用程序时可能仍在使用该文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接