【问题标题】:Trace & Log to file using TraceSource使用 TraceSource 跟踪和记录到文件
【发布时间】:2018-07-17 16:52:54
【问题描述】:

我正在开发 ASP.Net MVC Web 应用程序,使用 System.Diagnostics.TraceSource 跟踪和记录到文件。在 web.config 中添加了以下内容

 <system.diagnostics>    
  <trace autoflush="false" indentsize="4"></trace> // what's this for?  
  <sources>    
    <source name ="WebAppLog">    
      <listeners>    
        <add name="FileLog" type="System.Diagnostics.TextWriterTraceListener" initializeData="PartialView_WebApp.log" traceOutputOptions="DateTime,ThreadId,ProcessId,Timestamp,LogicalOperationStack,Callstack">    
          <filter initializeData="All" type="System.Diagnostics.EventTypeFilter"/>    
        </add>    
        <remove name="Default"/>    
      </listeners>    
    </source>    
  </sources>    
</system.diagnostics>

将 Log.cs 添加到应用程序以将消息记录到文件中。

public class Log  
{  
    static TraceSource source = new TraceSource("WebAppLog"); 
    public static void Message(TraceEventType traceEventType, string message)  
    {  
        short id;  
        switch (traceEventType)  
        {  
            case TraceEventType.Information:  
                id = 3;  
                break;  
            case TraceEventType.Verbose:  
                id = 4;  
                break;  
            default:  
                id = -1;  
                break;  
        }  
        source.TraceEvent(traceEventType, id, message);  
        source.Flush();    
    }
}

主页控制器.cs

public ActionResult Index()  
{  
    try  
    {  
        Log.Message(System.Diagnostics.TraceEventType.Information, "Index Action Start");
        // Do work
        Log.Message(System.Diagnostics.TraceEventType.Information, "Index Action End");  
        return View();  
    }  
    catch (Exception ex)  
    {
        throw;  
    }  
}

执行后,我可以生成日志文件,但无法写入任何内容,文件大小始终为 0 字节可能的错误是什么?

【问题讨论】:

    标签: c# logging trace


    【解决方案1】:

    TraceSource 上的 Switch 确定是否生成任何输出。
    默认情况下,如果不配置,是不会有输出的。

    Switch 的值与应出现在输出中的日志级别相匹配。

    可以通过代码设置:

    static TraceSource source = new TraceSource("WebAppLog"); 
    source.Switch.Level = SourceLevels.Verbose; 
    

    或者通过配置,更灵活。 您的配置将如下所示:

    <system.diagnostics>    
         <trace autoflush="false" indentsize="4"></trace> 
         <sources>    
             <source name ="WebAppLog" switchName="mySwitch">    
                 <listeners>    
                     <add name="FileLog" type="System.Diagnostics.TextWriterTraceListener" initializeData="c:\tmp\trace.log" traceOutputOptions="DateTime,ThreadId,ProcessId,Timestamp,LogicalOperationStack,Callstack">    
                         <filter initializeData="All" type="System.Diagnostics.EventTypeFilter"/>
                     </add>    
                     <remove name="Default"/>
                 </listeners>    
            </source>    
        </sources>    
        <switches>
            <add name="mySwitch" value="Verbose" />
        </switches>
    </system.diagnostics>
    


    关于你的问题
    <trace autoflush="false" indentsize="4"></trace>
    

    使用autoflush=true,您不必显式调用source.Flush()
    indentsize 被应用到日志输出中,请注意下面输出片段中从第 2 行开始的前导空格。

    WebAppLog Information: 3: Index Action Start
        ProcessId=7416
        LogicalOperationStack=
        ThreadId=1
    

    【讨论】:

    • 感谢您的回复@pfx,我可以知道这条线&lt;filter initializeData="All" type="System.Diagnostics.EventTypeFilter"/&gt; 在这里做什么吗?据我了解,侦听器TextWriterTraceListener 根据事件类型进行过滤。因此,如果我更改为initializeData="Error",这只会将错误消息记录到文件中吗?如果是这样,value="Verbose" 下的switches 在做什么?请详细说明一下,以便我了解每个属性在这里的作用。
    • Switch 充当TraceSource 的过滤器。 Filter 充当Listener 的过滤器。当只使用一个TraceSource 时,我大多只应用一个Switch。当它配置为value="Error" 时,source.TraceData(TraceEventType.Verbose ... 不会出现在输出中。看看这个answer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 2021-01-15
    相关资源
    最近更新 更多