C#日志类记录

每个程序都要和日志打交道。程序日志的质量直接影响了排除问题的难度。普通程序调试信息直接输出控制台,复杂程序则通过文本,xml等方式记录运行时的调试信息。
在C#中Diagnostics命名空间下有一个微软提供的专门用于记录信息的TraceSource类。TraceSource的使用方法很简单,只需要4行代码

TraceSource ts = new TraceSource("Code.Main", SourceLevels.All);
ts.Listeners.Add(new ConsoleTraceListener());
ts.TraceEvent(TraceEventType.Information, 0, "Message");
ts.Close();

日志类包括以下组成:

  • TraceSource: 日志的主体,日志类都是围绕这个类展开的。第一个初始化参数是名字,用于唯一标志TraceSource。可以在一个程序中定义多个TraceSource,通过名字进行区分。第二个初始化参数就是SourceSwitch.
  • SourceSwitch: 用于筛选日志。在打日志的时候(调用函数TraceEvent),可以设置输出日志的类型(TraceEventType), 比如 Critical、Error、Warning、Information和Verbose。SourceSwitch根据日志的类型筛选日志,如果设置为SourceLevels.Error,那么只有Error, Critical类型的日志能被输出到Listener.
  • Listener: 输出日志的位置。例如ConsoleTraceListener将日志输出到控制台, XmlWriterTraceListener将日志以xml格式输出到文件中。
  • TraceFilters: TraceSource可以筛选输出到Listener的日志,同样, Listener也可以筛选输出的日志,这就是TraceFilter的作用.

提示:

  • 一个程序可以有多个TraceSource, 一个TraceSource可以设置多个Listener, 不同的TraceSource可以共享一个Listerner(这也就是TraceFilter存在的意义)。如果一个TraceSource设置多个Listener,那么日志会同时输出到所有Listener。
  • SourceLevels有两种类型,一种是和重要性相关的日志类型, 比如Critical, Error, Warning, Information,Verbose。 另外一种是和活动相关的日志类型ActivityTracing, 只有TraceEventType.Start, TraceEventType.Suspend, TraceEventType.Transfer, TraceEventType.Resume。 和活动相关的日志类型主要用于记录程序中子线程或者子任务开始,结束的状态。
  • TraceEvent的第二个参数是一个整形助记符。在不同的函数中设置不同的助记符或者直接设置为线程id,用来记录线程的运行状态。
  • 调用TraceEvent不会直接将日志输出到Listener, 需要调用Flush或者Close才能输出到Listener.
  • TraceSource有一个方法TraceTransfer, 是和活动相关的方法。他向Listener写入一条转移信息(其实就是输出一条包含guid的信息),表明一个活动(线程)执行了一个新的子活动(子线程)。可以根据这条信息判断程序的执行流程。这个方法需要配合Trace.CorrelationManager.StartLogicalOperation, Trace.CorrelationManager.StopLogicalOperation使用。
  • 微软帮我们实现了常用的Listener, 比如ConsoleTraceListener,TextWriterTraceListener, XmlWriterTraceListener, DelimitedListTraceListener, EventLogTraceListener, EventSchemaTraceListener。如果需要定制Listener, 只需要实现TraceListener接口即可。
  • 可以通过App.config动态配置日志类的属性,但程序中设置的属性会覆盖配置文件的属性。
时间: 2024-10-13 23:12:46

C#日志类记录的相关文章

C++开源日志类

今天想给我的C++项目找一个开源的日志类,用于记录系统日志,结果浪费了半个下午的时间.从网上搜索相关资料,找到以下几个备选方案: 1.log4cplus 下载地址:http://sourceforge.net/projects/log4cplus/files/log4cplus-stable/1.1.0 2.log4cxx 下载地址:http://logging.apache.org/log4cxx/download.html (log4cxx 是由JAVA实现的 log4j 开源的,用C++实

WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作)

WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作) 好吧,还是那个社区APP,非管理系统,用户行为日志感觉不是很必要的,但是,错误日志咱还是得记录则个.总不能上线后报bug了让自己手足无措吧,虽然不管有木有错误日志报bug都是件很头疼的事... 我们知道webAPI也有好几个Filter,上篇文章我们做token与权限用到了ActionFilterAttribute,这次我们用ExceptionFilterAttribute来做

日志文本记录

日志记录有助于我们快速的进行错误排查,以下是简单的日志记录步骤,下面以一个简单的MVC程序为例来介绍 1.先创建一个简单的mvc程序 2.在项目中引入log4net.dll 3.添加TestLogNet4类 using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Web; using System.Web.Configuration; [

Golang简单日志类

实现简单的日志写入文件功能运行环境:golang1.4.2+win7x64golang1.4.2+centos6.5×64 1 package Helper 2 3 import ( 4 “fmt” 5 “log” 6 “os” 7 “time” 8 ) 9 10 /*简单日志类*/ 11 /*注意,这个类不是线程安全的*/ 12 type LogFile struct { 13 mFile *os.File 14 mLogger *log.Logger 15 } 16 17 //创建日志对象

一个项目需要考虑的问题:项目路径,数据库设计和权限,安全策略,日志类实现,页面基本结构

整个项目的流程 1.构建整个项目的框架结构[基本常量的定义] [实现一个框架需要权衡和良好的包含体系] 2.数据库设计和权限控制[对访问数据库的用户权限控制:默认新创建的用户对库内的数据并没有操作权限:Grant语句进行全新啊管理] 在项目建立之初,对数据库表结构进行设计是项目的关键. 考虑到各个业务层面上,设计各自的表结构. 注意数据库的三范式结构: 数据不可分割:第一范式[关联型数据库][针对每一列字段] 每一行数据的独立性:第二范式[针对每一行数据] 数据表之间的数据不要重复冗余:第三范式

自制迷你日志类

写网站程序的时候,都要把异常写入日志吧,比较常用的是Log4Net,不过我要求不高,只需要把异常和信息记在网站服务器的网站目录下就可以了,于是我自己写了一个. public static class Logger { private static readonly object Obj = new object(); public static void Log(string title, string msg) { LogError(title, msg); } public static v

日志类(一)字段

今年一直想写一个基于完成端口的服务器,但是因为生活上的事屡屡推迟.此次怀着进行到底的决心开始.给自己的目标每周2单元(业余爱好者,能写的时间不多.2单元安排比较合理) 言归正传.一个完备的服务器首先必不可缺的是预警系统.无论是内部错误,还是外部攻击.都应该有响应的处理,那么记录下服务器的状态是我们分析问题的关键.那么日志类应运而生. 一个工程级的日志类应具备消耗资源少(CPU,内存),稳定,便于管理和查看的特点.数据库模式就值得我们参考,写一个轻量级的防数据库模式的日志类是此次目标. 我将此次工

Spring+SpringMVC+Mybatis 利用AOP自定义注解实现可配置日志快照记录

目的: 需要对一些事物的操作进行日志记录,如果在service内进行记录,大量的代码重复,并且维护比较麻烦.所以采用AOP的方式对service进行拦截.使用自定义注解的目的则是判断是否需要记录日志和传递额外的信息. 方式 本次解决方案十分感谢博主-跳刀的兔子的博文 本文绝大部分参考与本文,略有不同,所以做一些整理,博主的文章更详细一些. 1.首先新建自定义注解 @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @

线程托管日志类

using System;using System.Collections.Generic;using System.IO;using System.Text;using System.Threading; namespace BLL{ /// <summary> /// 日志类 /// </summary> /// <remarks>此日志类提供高性能的日志记录实现. /// 当调用Write方法时不会造成线程阻塞,而是立即完成方法调用,因此调用线程不用等待日志写入文