【问题标题】:TraceSource logging creates duplicates of logsTraceSource 日志记录创建日志副本
【发布时间】:2022-12-19 21:39:32
【问题描述】:

我在我的应用程序中实现了 TraceSource 日志记录。此日志跟踪失败的登录尝试和错误。

当我运行该程序并生成我的第一个错误时,我的文件 CommissionLog.log 被创建并且错误包含在其中,但同时也创建了另一个文件,其内容似乎是 id 示例:62-60ae-3423sfd4534-42342-7sdfsfh4s3c142Commission

但是,如果我生成另一个错误,该错误会添加到原始日志文件中,但还会创建另一个文件,第一个复制的文件不会收到新错误。

显然我错误地实现了 TraceSource 日志记录,但我不明白为什么它会创建重复的日志。如果我生成另一个错误,则会创建另一个文件。

但是原来的日志文件一直在更新,很迷茫。

这是一个非常简单的复制,没有我的数据库/连接的详细信息,因为我觉得娱乐不需要它

private void Login_Btn_Click(object sender, EventArgs e) 
{
   bool userExists = false;
   // Logging (get users application data path)
           
   var roamingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
   var filePath = Path.Combine(roamingDirectory, "Commission.log");
   Trace.Listeners.Add(new TextWriterTraceListener(filePath, "myListener"));

   try 
   {
      if(!userExists) 
      {
          // Logging
          Trace.TraceInformation(DateTime.Now.ToShortDateString() + " | " + DateTime.Now.ToLongTimeString() + " - User login failed. Exception: User ID not found");
      }

   }
   catch(Exception ex) 
   {
      // Logging
      Trace.Listeners.Add(new TextWriterTraceListener(filePath, "myListener"));
      Trace.TraceInformation(DateTime.Now.ToShortDateString() + " | " + DateTime.Now.ToLongTimeString() + " - " + ex.ToString());
   }


   Trace.Flush();
}

如果我运行这个,我会得到 2 个文件,我的日志文件和一个包含

Commission Information: 0 : **/**/**** | **:**:** - User login failed. Exception: User ID not found

这是我创建配置文件以使其全部正常工作的地方

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.diagnostics>
        <trace autoflush="false" indentsize="4">
            <listeners>
                <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\\Commission.log" />
                <remove name="Default" />
            </listeners>
        </trace>
        <sources>
            <source name="TraceTest"
              switchName="sourceSwitch"
              switchType="System.Diagnostics.SourceSwitch">
                <listeners>
                    <add name="console"
                      type="System.Diagnostics.ConsoleTraceListener">
                        <filter type="System.Diagnostics.EventTypeFilter"
                          initializeData="Error"/>
                    </add>
                    <add name="myListener"/>
                    <remove name="Default"/>
                </listeners>
            </source>
        </sources>
        <switches>
            <add name="sourceSwitch" value="Error"/>
        </switches>
    </system.diagnostics>
</configuration>

【问题讨论】:

    标签: c# trace


    【解决方案1】:

    您获得的文件超出预期的原因是您多次使用Trace.Listeners.Add。通常每个应用程序的每个侦听器您应该只使用该命令一次。

    我将 Listener 想象成一种记录器——您可以让 Listener 将您的日志发送到文件,另一个用于控制台,另一个用于 Seq。

    您正在做的是,每次单击按钮都会添加文件侦听器的新实例,因此从现在开始,您添加的每个列出的侦听器都会写入新文件,依此类推。

    我猜是因为您多次注册它 Trace 正在生成另一个文件(带有 guid)以防止并发文件写入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-06
      • 2011-02-12
      • 2014-11-09
      • 1970-01-01
      • 2020-05-14
      • 2019-08-10
      • 2020-10-12
      • 1970-01-01
      相关资源
      最近更新 更多