Log4Net(Logging for DotNet)学习笔记

2023-11-04

系统支持(SystemFramework):提供系统的框架支持,典型的,如异常、日志等。也有现成的,比如log4net。      

突然一种老朋友似的感觉涌上心头,这不是我一直想要得到的吗?一直想在的我系统加入的东西吗―――-日志系统。嘿嘿,高兴啊!本文从一个使用者,非系统研究者的角度写下此文。

1.   Log4Net谁把你先做了?你是我一直想搞定的啊!

Logging Services Project @ Apache

log4net is an effort undergoing incubation at the Apache Software Foundation (ASF), sponsored by the Apache Logging Services project. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision makingCareer-Minded-Executive-Entourage  process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF. As log4net is undergoing incubation these releases are not officially endorsed by the ASF.

从这里( http://logging.apache.org/log4net/downloads.html)你可以得到最权威的答案。它是Apache基金的一个项目。开源,免费,嘿嘿,自然的哦!

对了,它还有很多兄弟姐妹,从这里你可以了解到它们( http://logging.apache.org/)。

马上down一下。

2.    迫不及待的看看效果:

a)         Create a web project(DotNetFramework2.0,vs2005正版)

b)        添加一个引用,log4net-1.2.10\log4net-1.2.10\bin\net\2.0\debug\log4net.dll,我们可以看见出现三个文件,其中有一个是xml的配置文档(log4net.xml),

继续学习:

1.  Log4net的结构

a)         log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及 Layout(布局).

2.  Log4net可以将我们的日志指定到多target。比如File,DataBase,Console,ect

3.  Log4net 将logging分级别

级别
允许的方法
Boolean属性
优先级别

Highest
void Fatal(...);


  bool IsFatalEnabled;
FATAL


void Error(...);


  bool IsErrorEnabled;
RROR


  void Warn(...);

bool IsWarnEnabled;
WARN


void Info(...);


  bool IsInfoEnabled;
INFO

Lowest
void Debug(...);


  bool IsDebugEnabled;
DEBUG



  还有两个特殊的级别: ALL和OFF。ALL表示允许所有的日志请求。OFF是拒绝所有的请求

4.  好了,下面配置web.config,使它指定我们的日志存储方式。这是通过配置appender(附着器)来实现的。如何入手呢?

a)         你可以从我们上文提到的那个xml(log4net.xml)文档中找到example.相当多的例子。

b)        或者按照下面给出的操作进行:


                             上面的图片,就是我们的web.config的骨架.很显然,你应该已经明白,其中的

<log4net debug=”false” >是我们需要配置的重点。当然,别忘记了<section>的那点配置。



下面给出我的例子,文件存储。

<log4net debug=”false”>

<appender name="LogFileAppender" type="log4net.Appender.FileAppender">

                             <param name="File" value="SunSystem.log.txt"/>

                            <param name="datePattern" value="MM-dd HH:mm"/>

                            <param name="AppendToFile" value="true"/>

                             <layout type="log4net.Layout.PatternLayout">

                                     <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>

                             </layout>

</appender>

                      <root>

                             <level value="DEBUG"/>

                            <appender-ref ref=" LogFileAppender "/>

                      </root>

</log4net>



下面这个是数据库(以sqlsever)配置的例子:

先create a table:



Create TABLE [dbo].[Log] (

         [Id] [int] IDENTITY (1, 1) NOT NULL,

         [Date] [datetime] NOT NULL,

         [Thread] [varchar] (255) NOT NULL,

         [Level] [varchar] (50) NOT NULL,

         [Logger] [varchar] (255) NOT NULL,

         [Message] [varchar] (4000) NOT NULL,

         [Exception] [varchar] (2000) NULL

)



<log4net debug="false">

          //千万不要让这个name和tpye相同,否则,将无法有日志输出。原因不明(也许是关键字吧)

                   <appender name="AdoNetAppender_SQL" type="log4net.Appender.AdoNetAppender">

                            <bufferSize value="100" />

                            <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

                            <connectionString value="data source= 【服务器】;initial catalog=【 数据库名】;integrated security=false;persist security info=True;User ID=sa;Password=sa" />

                            <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>

          <root>

                   <level value="DEBUG"/>

                            <appender-ref ref="AdoNetAppender_SQL"/>

                   </root>

</log4net>





可以了,现在让我们的web系统启动时,关联配置文件:

    void Application_Start(object sender, EventArgs e)

    {

        log4net.Config.DOMConfigurator.Configure();



}//Global.asax



以上配置可以了。

写代码了,哪里你需要用这个框架为你的异常或日志做记录。

我做了一个简单的例子:

在webform上放一个button,2个textbox:

  

protected void Button1_Click(object sender, EventArgs e)

    {

        log4net.ILog logger = log4net.LogManager.GetLogger(this.GetType());

        int a = 0;

        int b = 0;

        int c = 0;

        try

        {

             a = Convert.ToInt32(this.TextBox1.Text.Trim());

             b = Convert.ToInt32(this.TextBox2.Text.Trim());

             c = a / b;

        }

        catch (Exception err)

        {

            logger.Debug(err.ToString());

        }

        finally{

            Response.Write(c.ToString());

           

        }

}

  选择文件输出方式:

   输入:5/0,产生异常,输出到文件。效果明显啊!

   在我们的SunSystem.log.txt 文件中:

   

2006-06-10 16:01:01,004 [10] INFO  ASP.default_aspx [(null)] - System.DivideByZeroException: 试图除以零。

   在 _Default.Button1_Click(Object sender, EventArgs e) 位置 e:\MyProjects\webapp\Log4Test\Default.aspx.cs:行号 27



再测试:abc/cde ,产生异常:



2006-06-10 16:00:55,020 [10] INFO  ASP.default_aspx [(null)] - System.FormatException: 输入字符串的格式不正确。

   在 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)

   在 System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)

   在 System.Convert.ToInt32(String value)

   在 _Default.Button1_Click(Object sender, EventArgs e) 位置 e:\MyProjects\webapp\Log4Test\Default.aspx.cs:行号 25



选择数据库为输出对象:



同样的测试:




一个最基础的运用就完成了!





疑问????

1.是否可以同时输出到文件和数据库?

2.那个root结点干什么的啊?



====è

1.      可以同时保存到多种介质。

<root>

            <level value="DEBUG"/>

<appender-ref ref="LogFileAppender"/>



<appender-ref ref="AdoNetAppender_SQL"/>

<appender-ref ref="ColoredConsoleAppender"/>

</root>

2.     Root 节点的意思?

<root>

  <level value="WARN" />

  <appender-ref ref="LogFileAppender" />

  <appender-ref ref="ConsoleAppender" />

</root>

 

在框架的体系里,所有的日志对象都是根日志(root logger)的后代。 因此如果一个日志对象没有在配置文件里显式定义,则框架使用根日志中定义的属性。在<root>标签里,可以定义level级别值和Appender的列表。如果没有定义LEVEL的值,则缺省为DEBUG。可以通过<appender-ref>标签定义日志对象使用的Appender对象。<appender-ref>声明了在其他地方定义的Appender对象的一个引用。在一个logger对象中的设置会覆盖根日志的设置。而对Appender属性来说,子日志对象则会继承父日志对象的Appender列表。这种缺省的行为方式也可以通过显式地设定<logger>标签的additivity属性为false而改变。

<logger name="testApp.Logging" additivity="false">

</logger>

Additivity的值缺省是true.



3。 进一步的学习中…………



使用log4net可以很方便地为应用添加日志功能。应用Log4net,使用者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能。同时,通过外部配置文件,用户可以不用重新编译程序就能改变应用的日志行为,使得用户可以根据情况灵活地选择要记录的信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Log4Net(Logging for DotNet)学习笔记 的相关文章

随机推荐

  • 达观数据研发“曹植”大语言模型,致力于国产GPT模型

    在通用领域 以ChatGPT为代表的生成式大规模语言模型展现出卓越的知识学习和文字创作能力 受到国内外的广泛关注 垂直领域的GPT大模型同样拥有广阔的应用前景 达观基于多年文本智能技术积累和垂直领域场景业务经验 正在积极探索大语言模型LLM
  • redhat linux7版本重置密码教程

    对于redhat linux7版本的初学者来说 重置密码是必然会提到的 重置密码不仅可以解决你忘记密码的烦恼 更重要的是在rhce的考试的时候派上用场 因为考试的系统密码是靠你自己重置的 操作环境 VMware pro redhat lin
  • 修改Mysql数据库的用户名

    修改数据库用户名 首先安装过MySQL后 点击windows 找到MySQL 5 7 Command Line Client 点击运行 然后输入密码进入数据库 登录数据库后 然后输入一条下面的语句 select user from mysq
  • 编写ros2与webots进行联合仿真的代码,用Python写

    在写ROS2与Webots的联合仿真代码时 您可以使用Python作为编程语言 下面是一些提示 以帮助您开始编写代码 安装ROS2和Webots 您需要安装ROS2和Webots 并确保它们能够正常运行 创建ROS2工作空间 使用ROS2
  • L - Candy Machine

    SDUT 2022 Spring Team Contest for 21 12 Virtual Judge JB loves candy very much One day he finds a candy machine with NN
  • SQLException之驱动版本不匹配

    java sql SQLException Unknown initial character set index 255 received from server Initial client character set can be f
  • docker安装fastdfs

    一 准备docker环境 二 搜索fastdfs镜像 三 拉取镜像 docker pull delron fastdfs 选取delron fastdfs镜像的原因是包含了nginx不用自己安装nginx转发 也可以选择qbanxiaoli
  • c++ this指针

    this指针是c 中的一个关键字 它在类中被自动隐藏了起来 this指针指向当前对象并且只能用在类的内部使用 通过this指针我们可以访问类中的所有成员 public protect private class A public void
  • IDEA过期重置

    过期重置 https blog csdn net zzztimes article details 117550423
  • win10电脑发现不了华为share_huaweishare打开 电脑找不到手机

    本帖最后由 lang dine 于 2020 1 26 22 37 编辑 我的笔记本不是华为笔记本其他的网络设备都能搜索到 唯独huawei手机搜索不到 无法被搜到应该是huawei share的问题 这个问题还能顺延出两个故障 win10
  • 方波参考测试信号PI控制调试

    要调试方波参考测试信号的PI控制 可以按照以下步骤进行操作 确保系统已经正确连接 并且您已经设置了方波参考测试信号的频率和幅值 配置PI控制器 根据您的控制系统要求 选择适当的PI控制器参数 例如比例增益 Kp 和积分时间 Ki 这些参数可
  • c++虚函数和纯虚函数的区别

    关于虚函数的定义是 被virtual关键字修饰的成员函数 关于纯虚函数的定义是 是一种特殊的虚函数 在许多情况下 在基类中不能对虚函数给出有意义的实现 把它声明为纯虚函数 它的实现留给该基类的派生类去做 这是是纯虚函数 虚函数的简单实例 定
  • Android9以后遇到的一些问题

    Android9以后不能使用外存 我遇到这个问题的时候没报错 但就是无法成功创建文件 报了找不到文件异常才发现问题 application的属性中添加一条属性 请求使用遗留外存 android requestLegacyExternalSt
  • pm ux ui_ui与ux回顾2020年前端设计方面与重要性之间的差异

    pm ux ui Why Because people use the terms UI and UX so interchangeably that I believe it is about time someone talks abo
  • 【C++】 函数返回vector

    当程序中要返回vector时 一般做法会将函数直接定义为 vector
  • Qt tabwidget中插入widget

    一 简单介绍 QT gt tabWidget 标签页面 在ui中通过工具栏自定义拉取控件 其中tabwidget可以可以创建多个标签页面 默认生成两个tab widget tab 1 tab 2 并且可以在ui中右键自由添加控制删除等标签页
  • 头歌python实训通关四——分支结构

    第1关 英制单位英寸与公制单位厘米互换 任务描述 本关任务 编写一个能实现单位英寸与公制单位厘米的互换的函数 相关知识 为了完成本关任务 你需要掌握 1 if条件语句 编程要求 根据提示 在右侧编辑器补充代码 实现单位英寸与公制单位厘米互换
  • 关于 private static final long serialVersionUID = 1L

    实现java io Serializable这个接口是为序列化 serialVersionUID 用来表明实现序列化类的不同版本间的兼容性 如果你修改了此类 要修改此值 否则以前用老版本的类序列化的类恢复时会出错 实现后如果你用的是工具的话
  • Java内省机制

    Wiki上的解释 在计算机科学中 内省是指计算机程序在运行时 Run time 检查对象 Object 类型的一种能力 通常也可以称作运行时类型检查 不应该将内省和反射混淆 相对于内省 反射更进一步 是指计算机程序在运行时 Run time
  • Log4Net(Logging for DotNet)学习笔记

    系统支持 SystemFramework 提供系统的框架支持 典型的 如异常 日志等 也有现成的 比如log4net 突然一种老朋友似的感觉涌上心头 这不是我一直想要得到的吗 一直想在的我系统加入的东西吗 日志系统 嘿嘿 高兴啊 本文从一个