Log4Net 全方位跟踪程序运行

前端日子自己写了一个简单的日志跟踪程序,现在目前正在做的一个项目中使用以便于跟踪程序异常和运行状况,但是被否认了!可能是没有权威性,于是自己总结了一下Log4net日志跟踪系统,这里分享大家学习一下。当然写这个文章的人太多了,这里不是做任何攀比,只是简单的分享供有需要的人。

 

 一. Log4Net 简介

Log4net  Apache 下一个开放源码的项目,它是Log4j 的一个克隆版。我们可以控制日志信息的输出目的地。Log4net中定义了多种日志信息输出模式。 

在做项目的时候令我最头疼的是在程序发布到正式环境之后出现了问题,我们不能调试而且问题很难重新,于是我们需要大量的日志数据来精确的跟踪程序的运行状况。 

Log4net就可以帮我来解决这一个难题,对于日志的输出我们不需要人为的去干涉,它可以根据需要将日志输出到控制台,文本文件,windows 日志事件查看器中,包括数据库,邮件等等位置,以便我们快速跟踪程序bug 

 

 二. Log4Net 简单使用

 使用Log4net必须引入log4net.dll 文件,因为log4net 是开源的,所以可以直接将源码添加到工程项目中去。然后生成新的dll文件。
      下面使用配置一个最简单的文件输出和控制台输出。 

Log4Net 的配置文件,此段内容添加到App.config 或者 web.config 文件中. 

<configSections>
    
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  
</configSections>
  
<log4net>
    
<appender name="FileAppender" type="log4net.Appender.FileAppender">
      
<file value="D:\a.log"></file>
      
<appendToFile value="true"></appendToFile>
      
<layout type="log4net.Layout.PatternLayout">
        
<conversionPattern value="[%d]:%n%m%n"></conversionPattern>
      
</layout>
    
</appender>
    
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      
<layout type="log4net.Layout.PatternLayout">
        
<conversionPattern value="[%d]:%n%m%n"></conversionPattern>
      
</layout>
    
</appender>
    
<root>
      
<level value="INFO"></level>
      
<appender-ref ref="FileAppender"></appender-ref>
      
<appender-ref ref="ConsoleAppender"></appender-ref>
    
</root>
    
<logger name="MyLogger">
      
<level value="ERROR"></level>
      
<appender-ref ref="FileAppender"></appender-ref>
      
<appender-ref ref="ConsoleAppender"></appender-ref>
    
</logger>

  </ log4net>

  控制台程序测试例子:

ILog log = LogManager.GetLogger("MyLogger");
        
static void Main(string[] args)
        {
            log4net.Config.XmlConfigurator.Configure();
            Program program 
= new Program();
            program.log.Info(
">>>>>>>>>>>>>>");
            program.log.Info(
">>>>>>>>>>>>>>1");
            program.log.Info(
">>>>>>>>>>>>>>2"); 

} 

对于已经熟练使用log4net的同学们来说,这段代码自然是小儿科。但对于新手来说这段配置理解还是有一定难度的,下面逐步解说配置以及程序的使用。在实际应用中log4net可能要比更加复杂,它要根据各种环境和要求来引用生成不同的日志。上面的程序代码只是将日志以文件格式和控制格式输出。如果有兴趣可以将上述代码拷贝到自己的程序中去运行一次看看结果。上述例子是不会输出任何日志信息的,因为配置级别的限制。 

 

 三. Log4Net 结构

Log4net 主要分为5个核心主键: Logger,Appender,Filter,Layout,Object Render 

Logger: 

主要用于记录日志的分类和控制日志的级别。它可以以多种格式输出日志信息,同时它也可以控制日志的输出级别。上面的简单例子我们看似做了日志输出,但是没有输出任何日志结果,因为我们在日志级别上做了限制。 

Appender 

这里我们简单称之为 附着器。意思就是说日志的输出必须依赖于它,更确切的说以文本形式输出,还是控制台格式输出都必须要依靠它来控制。Log4net定义了多种附着器:

(1) AdoNetAppender 将日志记录到数据库中。可以采用SQL和存储过程两种方式 

(2) AnsiColorTerminalAppender ANSI 窗口终端写下高亮度的日志事件 

(3) AspNetTraceAppender 能用asp.netTrace的方式查看记录的日志

(4) BufferingForwardingAppender 在输出到子Appenders之前先缓存日志事件 

(5) ConsoleAppender 将日志输出到控制台 

(6) EventLogAppender 将日志写到Windows Event Log 

(7) FileAppender 将日志写到文件中 

(8) MemoryAppender 将日志存到内存缓冲区 

(9) NetSendAppender 将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示 

(10) RemoteSyslogAppender 通过UDP网络协议将日志写到Remote syslog service

(11) RemotingAppender 通过.NET Remoting将日志写到远程接收端 

(12) RollingFileAppender 将日志以回滚文件的形式写到文件中 

(13) SmtpAppender 将日志写到邮件中 

(14) TraceAppender 将日志写到.NET trace 系统 

(15) UdpAppender 将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播 

 

Filter:

Appender 是将日志以缺省值的方式输出,意思就是按照默认值的方式输出。而Filter 意思就是过滤器,使用Filter 可以将日志以不同格式来输出 

Layout:

这个用于控制日志输出显示格式 

Object Render:

用于按照用户自定义标准来输出日志 

 

Log4net 结构图 (从其他地方截图过来)

 


Log4net 的日志对象管理器LogManagerLogManager是用于来管理所有的Logger对象的,GetLogger() 可以用来查找已经存在的Logger对象,如果对象不存在它会自动创建一个Logger对象,并且管理它 。

 

 

 四. Log4Net 日志基本

Log4net 分为如下几个级别:

   FATAL  毁灭级别

   ERROR 错误级别

   WARN 警告级别

   INFO 消息级别

   DEBUG 调试级别

      这几种日志级别 FATAL> ERROR> WARN> INFO>DEBUG

      只有日志输出级别大于或等于配置的级别才能输出日志信息

      比如我的日志配置级别为INFO

      那么只有log.Info() log.Warn()log.Error() log.Fatal()才能输出日志信息,Debug方式就不能输出。

       Log4net中还有两种特殊的配置级别: ALL 允许所有的日志级别输出 OFF 拒绝所有的日志级别输出 

 

 五. Log4Net 配置说明

  <configSections>

    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  
</configSections>
  
<log4net>
    
    
<!--记录日志到数据库-->
    
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
      
<bufferSize value="100" />
      
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      
<connectionString value="data source=GAS-HECHEN;initial catalog=dsc141051_db;integrated security=false;persist security info=True;User ID=sa;Password=000000" />
      
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
      
<parameter>
        
<parameterName value="@log_date" />
        
<dbType value="DateTime" />
        
<layout type="log4net.Layout.RawTimeStampLayout" />
      
</parameter>
      
<parameter>
        
<parameterName value="@thread" />
        
<dbType value="String" />
        
<size value="255" />
        
<layout type="log4net.Layout.PatternLayout">
          
<conversionPattern value="%thread" />
        
</layout>
      
</parameter>
      
<parameter>
        
<parameterName value="@log_level" />
        
<dbType value="String" />
        
<size value="50" />
        
<layout type="log4net.Layout.PatternLayout">
          
<conversionPattern value="%level" />
        
</layout>
      
</parameter>
      
<parameter>
        
<parameterName value="@logger" />
        
<dbType value="String" />
        
<size value="255" />
        
<layout type="log4net.Layout.PatternLayout">
          
<conversionPattern value="%logger" />
        
</layout>
      
</parameter>
      
<parameter>
        
<parameterName value="@message" />
        
<dbType value="String" />
        
<size value="4000" />
        
<layout type="log4net.Layout.PatternLayout">
          
<conversionPattern value="%message" />
        
</layout>
      
</parameter>
      
<parameter>
        
<parameterName value="@exception" />
        
<dbType value="String" />
        
<size value="2000" />
        
<layout type="log4net.Layout.ExceptionLayout" />
      
</parameter>
    
</appender>
    
    
<!--输入日志到控制台-->
    
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      
<layout type="log4net.Layout.PatternLayout">
        
<conversionPattern value="[时间]:%d%n[级别]:%p%n[内容]:%m%n%n"></conversionPattern>
      
</layout>
    
</appender>

    
<appender name="FileAppender" type="log4net.Appender.FileAppender">
      
<param name="file" value="D:\a.log"></param>
      
<param name="appendToFile" value="true"></param>
      
<layout type="log4net.Layout.PatternLayout">
        
<conversionPattern value="[时间]:%d%n[级别]:%p%n[内容]:%m%n%n"></conversionPattern>
      
</layout>
    
</appender>
    
    
<root>
      
<level value="INFO"></level>
      
<appender-ref ref="FileAppender"></appender-ref>
      
<appender-ref ref="ConsoleAppender"></appender-ref>
    
</root>
    
<logger name="MyLogger">
      
<level value="INFO"></level>
      
<appender-ref ref="FileAppender"></appender-ref>
      
<appender-ref ref="ConsoleAppender"></appender-ref>
    
</logger>
  
</log4net>

这个配置文件定义了三种不同的Appender,分别是ADO.NET 记录到数据,ConsoleAppender 从控制台输出, FileAppender 日志信息文件输出。

然而Log4Net 的配置附着器远不止这些,这里上传一个比较全的附着器配置文件供大家参考 点击下载 

 

根据上面的日志配置文件仍然使用如下代码测试:

 

这里需要注意,log4net.Config.XmlConfigurator.Configure();   这个相当于初始化Log4net, 如果是在Web程序中 我们可以将这句话添加到 Global.asax 文件的Application_Start(object sender, EventArgs e) 方法中。在程序启动的时候就初始化配置信息。

  上面的程序运行结果图,控制台输出结果为:

 

信息记录到指定的磁盘文件中,记录的结果如下图:

 

 

 这里说明两个配置:

 

这里的root 和 logger 配置节点,root 就相当于默认的日志对象配置,而logger是指定特定的日志配置。他们可以共存。

对于这两个节点下面都有 level 和 appender-ref 节点,分别用于指定日志的输出级别和引用哪些附着器。每个日志对象都可以使用多个appender,这里的配置同时使用文件输出和控制台输出。得到的结果就是上面两个结果图。

 

  下面的logger对象添加了AdoNetAppender附着器,当使用MyLogger日志对象的时候就会使用这三种不同的方式记录日志。

 

上面的程序声明了两个日志对象 log 和 log1,log 是在初始化的时候存在的,它得到的是<logger name="MyLogger"> 这个日志对象,而log1 是LogManager 中不存在的日志对象,这里它会重新创建一个并且由LogManager 管理,后面再次使用则使用这个已经存在的对象。 这里两个日志对象同时使用结果如下:

 

 

现在我修改配置文件的日志文件输出级别: 

<logger name="MyLogger">
      
<level value="WARN"></level>
      
<appender-ref ref="FileAppender"></appender-ref>
      
<appender-ref ref="ConsoleAppender"></appender-ref>
      
<appender-ref ref="AdoNetAppender"></appender-ref>

</ logger>

 运行得到的结果如图:

 

显然MyLogger对象日志没有输出日志信息。 

 

六. Log4Net 参数说明 

上面我们看到的配置文件中有类似%m %n 等这样的符号,这些符号都是有特殊意义的。

   %m[%message]       : 输出的日志消息

   %n                                : 换行

   %d[%datetime]   : 输出当前语句运行的时刻

   %r                  : 输出程序从运行到执行到当前语句时消耗的毫秒数

   %d                                当前语句所在的线程ID

   %p                  : 日志的当前优先级别

   %c                  当前日志对象的名称

   %L                  : 输出语句所在的行号

   %F                  输出语句所在的文件名

         %-数字                      :表示该项的最小长度,如果不够,则用空格填充 

 

 

 七. 自定义轻量级日志系统

具体参照 文章: ORM映射框架总结--日志处理 

这里不再过多的说明 

 

示例下载 

转载于:https://www.cnblogs.com/qingyuan/archive/2011/05/13/2045616.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

业务架构·应用架构·数据架构实战~业务驱动的应用架构设计

1、什么是应用架构 应用架构是一组应用系统及其交互关系的描述&#xff0c;其中的每个应用系统都是一个“逻辑功能组”&#xff0c;用于支撑业务功能、管理数据资产。 支撑业务架构中&#xff0c;具体业务功能、业务流程的要求。 支撑数据架构中&#xff0c;具体数据资产的操…

Android 之 四大组件、六大布局、五大存储

Android 之四大组件、六大布局、五大存储&#xff1a;https://blog.csdn.net/shenggaofei/article/details/52450668 Android 四大组件、五大存储、六大布局&#xff1a;https://blog.csdn.net/xiankog/article/details/81702119 Android四大基本组件介绍与生命周期&#xff…

业务架构·应用架构·数据架构实战~业务驱动的数据架构设计

1.什么是数据架构&#xff08;DA&#xff09; 定义一&#xff1a;数据架构是通过对齐企业战略得到的数据资产管理蓝图。具体而言&#xff0c;该蓝图用于指导如何分析数据需求、如何做好相应设计。 定义二&#xff1a;数据架构描述企业的 A、主要数据类型及其来源&#xff1b…

安卓逆向_3 --- 篡改apk名称和图标、修改包名实现应用分身、修改资源去广告、去除re管理器广告

From&#xff1a;https://www.bilibili.com/video/BV1UE411A7rW?p7 Android 中 adb shell dumpsys 相关命令&#xff1a;https://blog.csdn.net/fengyulinde/article/details/78798055 adb shell dumpsys 命令是用于打印出当前系统信息 (更切确的说是dumpsys命令&#xff0c;…

Nature:科学家成功解读大脑构建的分子机制

来源&#xff1a;生物谷摘要&#xff1a;日前&#xff0c;一项刊登在国际杂志Nature上的研究报告中&#xff0c;来自伦敦大学国王学院的研究人员通过研究发现了大脑构建的基本过程&#xff0c;这或许能帮助理解诸如自闭症和癫痫症等神经发育障碍背后的分子机制。日前&#xff0…

谈判底层逻辑~谈判中的难点梳理

谈判三大困境&#xff1a;抗拒、僵持、僵局 1.抗拒--总防备 eg.买电影票不买两边有人的&#xff0c;和邻居不打招呼 产生防备的原因&#xff1a; 陌生/不熟悉 太多/太复杂 生意上就是&#xff0c;抗拒&#xff0c;不要靠近.... 怎么破冰&#xff1f; Ta不愿见面&#xff…

安卓逆向_5 --- Android 学习

Android 之 四大组件、六大布局、五大存储&#xff1a;https://blog.csdn.net/freeking101/article/details/105377197 安卓&#xff08;Android&#xff09;动态创建多个按钮并添加监听事件&#xff1a;https://www.jb51.net/article/88036.htm 安卓按钮添加监听的三种方法&am…

华为公布车联网进展:年内将覆盖10万网联车

来源&#xff1a;车云摘要&#xff1a;实际上&#xff0c;华为进军汽车业的“野心”在于&#xff0c;提供车联网的相关解决方案。近年来&#xff0c;华为一直有向其他领域扩充的计划与布局&#xff0c;此前&#xff0c;其将与汽车厂商合作造车的传闻也一直不绝于耳。对此&#…

杨强:人工智能在企业的落地是一门大学问

来源&#xff1a;图灵人工智能摘要&#xff1a;人工智能到现在已经 60 多年&#xff0c;几起几落&#xff0c;它的兴衰也是围绕着 “AI是不是可以落地” 进行的。杨强香港科技大学计算机和工程学系主任国际人工智能联合会IJCAI理事长第四范式首席科学家杨强&#xff1a;一个AI&…

安卓逆向_6 --- Dalvik 字节码、Smali 详解

CTF Wiki smali&#xff1a;https://ctf-wiki.org/android/basic_operating_mechanism/java_layer/smali/smali/ 深入理解 Dalvik 字节码指令及 Smali 文件&#xff1a;https://blog.csdn.net/dd864140130/article/details/52076515 安卓逆向入门教程&#xff08;二&#xff09…

NASA宣布在火星上发现了3种有机分子

图来自美国国家航空航天局来源&#xff1a;海外网摘要&#xff1a;美国国家航空航天局&#xff08;NASA&#xff09;召开新闻发布会&#xff0c;公开了火星新发现——好奇号火星探测器在火星上发现了有机分子。当地时间周四&#xff08;7日&#xff09;&#xff0c;美国国家航空…

Chrome 爬虫插件 Web Scraper

Web Scraper 官网&#xff1a;https://webscraper.io/ 有关webscraper的问题&#xff0c;看这个就够了&#xff08;建议收藏&#xff09;&#xff1a; https://zhuanlan.zhihu.com/p/34104808https://blog.csdn.net/biggbang/article/details/86251526 web scraper 入门到精通…

AI新方向: 科学家们暂停模仿“人脑”,公布了新路线图

来源&#xff1a;华尔街新闻摘要&#xff1a;科学家们一直致力于创造一种像人类一样思考的机器&#xff0c;但经过一段时间的探索&#xff0c;这一进程遇到了阻碍&#xff0c;他们基本上已经暂停了模仿“人脑”&#xff0c;转而研究已有发现的应用。科学家们一直致力于创造一种…

Hack.Chat 在浏览器里快速建立简单、随用即丢线上聊天室,无须下载安装软体

From&#xff1a;http://www.luoxiao123.cn/1554-6.html 有时候想跟其他使用者线上文字对话&#xff0c;但又不想把自己的联络资料&#xff08;例如 Facebook 或即时通讯帐号&#xff09;泄漏给对方&#xff0c;有些人可能会选择申请一个临时使用的帐号&#xff0c;但这未免也太…

CCAI2018 | 韩家炜:大规模文本数据挖掘的新方向

来源&#xff1a;中国人工智能学会现实中的大数据常常表示为一种非结构化&#xff0c;交叉和动态变化的文本数据。如何从大规模文本数据中抽取结构化知识是一个非常值得研究的任务。很多研究工作依赖于劳动密集型的数据标注&#xff0c;用有监督的方法去抽取知识。但是&#xf…

关于面试宝典中的各个问题(一)

1、关于浮点数1.0f在内存中的表示&#xff1a;是3f800000. 各个类型所占的字节数&#xff08;byte&#xff09;&#xff0c;1byte8bit char 1 short 2 bool 1 int 4 long 4 float 4 double 8 long double 8 char * 4 int * 4 float * 4 以上是对于我的电脑&#xff0c;在典型…

安卓手机 Python 自动化( uiautomation、uiautomation2、weditor )

其他自动化工具或者框架&#xff1a; Airtest&#xff1a;https://airtest.readthedocs.io/zh_CN/latest/autojs&#xff1a;Auto.js快速入门实战教程&#xff1a;https://zhuanlan.zhihu.com/p/90065914appium&#xff1a;https://blog.csdn.net/freeking101/article/details…

揭秘|多伦多大学反人脸识别,身份欺骗成功率达99.5%

来源 &#xff1a;机器人大讲堂摘要&#xff1a;在一些社交媒体平台&#xff0c;每次你上传照片或视频时&#xff0c;它的人脸识别系统会试图从这些照片和视频中得到更多信息。比如&#xff0c;这些算法会提取关于你是谁、你的位置以及你认识的其他人的数据&#xff0c;并且&am…

安卓逆向_8 --- Android 调试工具 DDMS 和 Monitor ( 去掉 车来了 app 的广告 )

From&#xff1a;https://www.e-learn.cn/topic/3527658 Android SDK 中的 ddms 使用详解&#xff1a;https://blog.csdn.net/x83853684/article/details/80643131 ADB、Android Monitor、DDMS、HierarchyViewer、MAT、SysTrace、TraceView 性能分析工具使用大全&#xff1a;…

杂谈 | 微软复兴,它与苹果竟有这么多相似之处!

来源&#xff1a;网易智能摘要&#xff1a;且不要谈CEO们是否会让他们公司的“重生”&#xff0c;仅仅是成为一个成功帝国的好管家就已经是一项了不起的成就了。上周&#xff0c;微软市值超过了谷歌母公司Alphabet&#xff0c;成为继苹果&#xff08;Apple&#xff09;和亚马逊…