zoukankan      html  css  js  c++  java
  • TraceSource的使用以及日志设计

     .NET Framework 命名空间 System.Diagnostics 包含用于跟踪执行流程的 Trace、Debug 和 TraceSource 类,以及用于分析代码的 Process、EventLog 和PerformanceCounter 类。

    跟踪是一种在应用程序运行时监视其执行情况的方式。当开发 .NET Framework 应用程序时,可以在其中添加跟踪和调试检测功能,并且在开发应用程序时和部署应用程序后,都可以使用该检测功能。利用 Trace 和

    Debug 类,可以将有关错误和应用程序执行的信息记录到日志、文本文件或其他设备中,以便在随后进行分析。

    下面列出了六个写入跟踪信息的 Debug Members 和 Trace 方法。

    Assert:指定的文本;如果未指定任何文本,则为“调用堆栈”。只有当 Assert 语句中以参数形式指定的条件为 false 时,才会写入输出。

    Fail:指定的文本;如果未指定任何文本,则为“调用堆栈”。

    Write:指定的文本。

    WriteIf:如果满足 WriteIf 语句中以参数形式指定的条件,则为指定的文本。

    WriteLine:指定的文本和一个回车。

    WriteLineIf:如果满足 WriteLineIf 语句中以参数形式指定的条件,则为指定的文本和一个回车。

    1、Trace 和 Debug区别

      Trace 和 Debug区别: Trace 和 Debug 类基本相同,不同的只是 Trace 类的过程和函数默认为编译成发布版本。

    2、什么是Listeners

      Listenters属性,它是TraceListenerCollection类型(TraceSource类和TraceListener类),给类属性控制跟踪信息输出的方向,可以是控制台(add(TextWriterTraceListener(new Console.Out))),文件(add(TextWriterTraceListener(new

      IO.File.CreateText(“output.txt”))等。

      Listenters集合中的成员包括TextWriterTraceListener,DefaultTraceListener,EventLogTraceListener,WebPageTraceListener等。而TextWriterTraceListener的子类又有ConsoleTraceListener, DelimitedListTraceListener,

      XmlWriterTraceListener,EventSchemaTraceListener。

    3、跟踪开关  

      除了指定Listener外,要控制消息是否被输出,还需要指定跟踪开关。跟踪开关用于启用、禁用和筛选跟踪输出。

          Framework 中提供了三种类型的跟踪开关:BooleanSwitch 类、TraceSwitch 类和 SourceSwitch 类。

      BooleanSwitch是最简单的跟踪开关,可以指定是否输出消息。

      TraceSwitch 和 SourceSwitch 类用于为特定的跟踪级别启用跟踪开关,以便显示为该级别及其下的所有级别指定的 Trace 或 TraceSource 消息。

     3.1、使用BooleanSwitch开关

      以下是使用BooleanSwitch的例子:   

    var textWriterTraceListener1 = new TextWriterTraceListener(System.Console.Out);
    Debug.Listeners.Add(textWriterTraceListener1);
    
    var textWriterTraceListener2 = new TextWriterTraceListener(System.IO.File.CreateText("output.txt"));
    Debug.Listeners.Add(textWriterTraceListener2);
    
    var textWriterTraceListener3 = new EventLogTraceListener();
    Debug.Listeners.Add(textWriterTraceListener3);
    
    var sooleanSwitch = new BooleanSwitch("DataMessageSwitch", "DataMessageSwitch des") { Enabled = true };
    
    Debug.WriteLineIf(sooleanSwitch.Enabled, "log....");
    
    Debug.Flush();

      bs.Enabled设置为true或者false,并不会使程序自动决定是否输出信息。

      如果不使用代码方式,而是使用配置文件的方式,是在 <configuration> 标记之后,但在 </configuration> 标记之前添加相应的 XML 来配置您的开关。如下: 

    <system.diagnostics>
       <switches>
          <add name="DataMessagesSwitch" value="1" />
       </switches>
    </system.diagnostics>

     3.2、使用TraceSwitch开关

      TraceSwitch类可以通过使用跟踪开关来筛选消息,通过Level属性来获取或设置开关级别。0、1、2、3 和 4 分别对应于 Off、Error、Warning、Info 和 Verbose。任何大于 4 的数字都会被当作 Verbose,任何小于零的数字都会被当作 Off。

      以下的例子,用代码的方式来演示使用TraceSwitch来设置跟踪开关:    

    var textWriterTraceListener1 = new TextWriterTraceListener(System.Console.Out);
    Debug.Listeners.Add(textWriterTraceListener1);
    
    var textWriterTraceListener2 = new TextWriterTraceListener(System.IO.File.CreateText("output.txt"));
    Debug.Listeners.Add(textWriterTraceListener2);
    
    var textWriterTraceListener3 = new EventLogTraceListener();
    Debug.Listeners.Add(textWriterTraceListener3);
    
    var traceSwitch = new TraceSwitch("mySwitch", "in the Config file") {Level = TraceLevel.Verbose};
    
    Debug.WriteLineIf(traceSwitch.TraceError, "Error!!!");
    Debug.WriteLineIf(traceSwitch.TraceWarning, "Warning!!!");
    Debug.WriteLineIf(traceSwitch.TraceInfo, "Info!!!");
    Debug.WriteLineIf(traceSwitch.TraceVerbose, "Verbose!!!");
    
    Debug.Flush();

      使用XML来配置,如下:

    <system.diagnostics>
       <switches>
          <add name="mySwitch" value="1" />
       </switches>
    </system.diagnostics>

    4、使用TraceSource代替Trace和Debug

      从FRAMEWORK2.0开始,就不建议使用Trace和Debug了,而改而用TraceSouce。TraceSource 旨在用作增强的跟踪系统,并且可代替较旧的 Trace 和 Debug 跟踪类的静态方法使用。熟悉的 Trace 和 Debug 类仍然存在,不过建议的做法

      是使用 TraceSource 类进行跟踪。

          下面的例子演示使用代码来实现消息的输出:

    private static readonly TraceSource MySource = new TraceSource("TraceSourceApp");
    
    static void Main(string[] args)
    {
        MySource.Switch = new SourceSwitch("sourceSwitch", "Error");
        MySource.Listeners.Remove("Default");
    
        var textListener = new TextWriterTraceListener("myListener.log")
                                {
                                    TraceOutputOptions = TraceOptions.DateTime | TraceOptions.Callstack,
                                    Filter = new EventTypeFilter(SourceLevels.Error)
                                };
        MySource.Listeners.Add(textListener);
    
        var console = new ConsoleTraceListener(false)
                            {Filter = new EventTypeFilter(SourceLevels.Information), Name = "console"};
        MySource.Listeners.Add(console);
        Activity1();
    
        var traceListener = MySource.Listeners["console"];
        if (traceListener != null)
            traceListener.Filter = new EventTypeFilter(SourceLevels.Critical);
        Activity2();
    
        MySource.Switch.Level = SourceLevels.All;
    
        var listener = MySource.Listeners["console"];
        if (listener != null)
            listener.Filter = new EventTypeFilter(SourceLevels.Information);
        Activity3();
    
        MySource.Close();
    }
    
    static void Activity1()
    {
        MySource.TraceEvent(TraceEventType.Error, 1, "Error message.");
        MySource.TraceEvent(TraceEventType.Warning, 2, "Warning message.");
    }
    
    static void Activity2()
    {
        MySource.TraceEvent(TraceEventType.Critical, 3, "Critical message.");
        MySource.TraceInformation("Informational message.");
    }
    
    static void Activity3()
    {
        MySource.TraceEvent(TraceEventType.Error, 4, "Error message.");
        MySource.TraceInformation("Informational message.");
    }

      以上代码,如果使用配置文件的方式实现,如下:  

    <system.diagnostics>
      <sources>
        <source name="TraceSourceApp" switchName="sourceSwitch" switchType="System.Diagnostics.SourceSwitch">
          <listeners>
            <add name="console" type="System.Diagnostics.ConsoleTraceListener">
              <filter type="System.Diagnostics.EventTypeFilter" initializeData="Warning"/>
            </add>
            <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="myListener.log"
                 traceOutputOptions="Callstack">
              <filter type="System.Diagnostics.EventTypeFilter" initializeData="Error"></filter>
            </add>
            <remove name="Default"/>
          </listeners>
        </source>
      </sources>
      <switches>
        <add name="sourceSwitch" value="Warning"/>
      </switches>
    </system.diagnostics>

      配置文件实现的对应代码部分为:

    private static readonly TraceSource MySource = new TraceSource("TraceSourceApp");
    
    static void Main(string[] args)
    {
        Activity1();
    
        Activity2();
    
        Activity3();
    
        MySource.Close();
    }
    
    static void Activity1()
    {
        MySource.TraceEvent(TraceEventType.Error, 1, "Error message.");
        MySource.TraceEvent(TraceEventType.Warning, 2, "Warning message.");
    }
    
    static void Activity2()
    {
        MySource.TraceEvent(TraceEventType.Critical, 3, "Critical message.");
        MySource.TraceInformation("Informational message.");
    }
    
    static void Activity3()
    {
        MySource.TraceEvent(TraceEventType.Error, 4, "Error message.");
        MySource.TraceInformation("Informational message.");
    }

    5、设计一个日志系统

      有了以上的知识之后,我们就可以来设计一个应用程序的日志系统(是的,我们不在需要LOG4NET)。我们来假设这个日志系统最基础的功能:

          1、以日期来创建日志名,以免历史日志全部写入一个文件中去;

          2、可以配置想要输出的日志类别,如Warning或者Error等;

          3、可以配置想要的日志内容:如StackTrace或者错误信息等;

          思路:

          1、在应用程序启动代码中,设置文件名。因为文件名要根据日期动态生成,所以不能使用配置文件;

          2、其它配置可以配置文件实现;

          3、DO IT

    6、日志信息写入Windows日志中存在的问题和解决方法

      在Web项目中,当使用asp.net向系统中创建一个事件日志或者一个事件源时,可能会得到如下异常错误消息: System.Security.SecurityException: 不允许所请求的注册表访问权。这是因为运行asp.net进程

      的默认帐户是ASPNET(在IIS6.0下面是NetworkService),而此账户默认只有读权限,没有写权限,所以不能创建事件日志或事件源。解决此问题的办法有提升ASPNET帐户的权限、不在程序内部创建事件日志      

      或事件源等,主要有以下三种解决方案:

      在程序运行之前,定义要使用的事件日志和事件源,打开注册表编辑器,手工将事件日志和事件源添加到注册表中。主要步骤如下:
      ① 点击“开始”菜单,再点击“运行”。
      ② 在“运行”的“打开”框中输入“regedit”,然后按OK按钮,打开注册表编辑器。
      ③ 在注册表编辑器中找到下列子键:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog
      ④ 右键单击“Eventlog”,点击“新建”,再点“项”,将在“Eventlog”的下一级创建一个新的项目,将此项目命名为“TDDN”, TDDN项就是事件日志,可以根据实际情况为此项命名,比如可以命名为项目名称。
      ⑤ 在“TDDN”项上单击右键,点击“新建”,再点“项”,将在“TDDN”的下一级创建一个新的项,将此项命名为“Weblog”, Weblog项就是事件源,此项也可以根据实际情况命名。
      ⑥ 关闭注册表编辑器。

      这样事件日志和事件源就建好了,如果需要多个事件日志或事件源,重复以上过程。

  • 相关阅读:
    096实战 在windows下新建maven项目
    095实战 ETL的数据来源,处理,保存
    094实战 关于js SDK的程序,java SDK的程序
    093实战 Nginx日志切割,以及脚本上传nginx的切割日志
    092实战 数据收集(各种事件)
    091实战 Nginx配置(日志服务器中关于日志的产生)
    android64位机子兼容32位.so库文件
    给 Android 初学者的 Gradle 知识普及
    Android重力感应开发
    随笔之Android平台上的进程调度探讨
  • 原文地址:https://www.cnblogs.com/SuperBing/p/2824787.html
Copyright © 2011-2022 走看看