博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
log4net日志组件
阅读量:4365 次
发布时间:2019-06-07

本文共 15071 字,大约阅读时间需要 50 分钟。

一、什么是log4net组件

 

Log4net是基于.net开发的一款非常著名的记录日志开源组件。他最早是2001年7月由NeoWorks Limited启动的项目,基本的框架源于另外的一个非常著名的姐妹组件-log4j。Log4net记录日志的功能非常强大。它可以将日志分不同的等级,比不同的样式,将日志输出到不同的媒介(数据库、文本、控制台、邮件……)。 

 

二、log4net的核心内容 

 

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

Logger:  

主要用于记录日志的分类和控制日志的级别。它可以以多种格式输出日志信息,同时它也可以控制日志的输出级别。 

Log4net 分为如下几个级别: 

  FATAL  毁灭级别

  ERROR 错误级别

  WARN 警告级别

  INFO 消息级别

  DEBUG 调试级别

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

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

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

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

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

 

Appender: 

 

 

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

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

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

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

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

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

 

三、代码演示跟着来 

 

0.在引用中添加log4net.dll 

 

1.新建一个配置文件(这里可以配置日志写入到sql 、 txt 、 邮件,以及设置日志级别等) 

 

<?xml version="1.0"?>

<configuration>

    <system.web>

        <compilation debug="true" targetFramework="4.0" />
    </system.web>
 <log4net debug="false">

  <!--按日期分割日志文件 一天一个-->

  <appender name="LogFileAppenderByDate" type="log4net.Appender.RollingFileAppender" >
   <!--是否续写-->
   <param name="AppendToFile" value="true" />
   <!--最小锁定模型以允许多个进程可以写入同一个文件-->
   <param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock" />
   <param name="StaticLogFileName" value="true" />
   <!--保存路径-->
   <param name="File" value="F:\Log\\" />
   <param name="DatePattern" value="yyyy-MM-dd.LOG" />
   <param name="StaticLogFileName" value="false" />
   <param name="RollingStyle" value="Date" />
   <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="时间:%d %n级别:%level %n类名:%c%n文件:%F 第%L行%n日志内容:%m%n-----------------------------------------%n%n" />
   </layout>
  </appender>

  <!--按日志容量分割日志文件 10KB一个-->

  <appender name="LogFileAppenderBySize" type="log4net.Appender.RollingFileAppender" >

   <!--是否续写-->

   <param name="AppendToFile" value="true" />
   <!--最小锁定模型以允许多个进程可以写入同一个文件-->
   <param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock" />

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

   <!--按照文件的大小进行变换日志文件-->

   <param name="RollingStyle" value="Size" />
   <param name="File" value="LogData\\log.txt" />
   <!--单个文件最大数量 好像只有在 按Size分割时有效-->
   <param name="MaximumFileSize" value="10KB"/>
   <!--保留的log文件数量 超过此数量后 自动删除之前的   好像只有在 按Size分割时有效-->
   <param name="MaxSizeRollBackups" value="2" />

   <param name="StaticLogFileName" value="false" />

   <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="发生时间:%d %n事件级别:%level %n相关类名:%c%n程序文件:%F 第%L行%n日志内容:%m%n-----------------------------------------%n%n" />
   </layout>
  </appender>
  <!--记录日志到数据库-->
  <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=LKYKJYXG-341C59\LKY;database = ITweb;Integrated security = true;" />
   <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="INFO" />
   <!--启用按日期分割-->
   <appender-ref ref="LogFileAppenderByDate" />
   <!--启用按容量分割-->
   <!--<appender-ref ref="LogFileAppenderBySize" />-->
   <!--启用保存到数据库-->
   <appender-ref ref="AdoNetAppender" />
  </root>
 </log4net>
</configuration>

   

 

2.在Global.asax文件下写入代码 

 

 

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Security;using System.Web.SessionState;using System.IO;namespace WebApplication1{    public class Global : System.Web.HttpApplication    {        void Application_Start(object sender, EventArgs e)        {            // 在应用程序启动时运行的代码            log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(Server.MapPath("/log4nethh.config")));        }        void Application_End(object sender, EventArgs e)        {            //  在应用程序关闭时运行的代码        }        void Application_Error(object sender, EventArgs e)        {            // 在出现未处理的错误时运行的代码        }        void Session_Start(object sender, EventArgs e)        {            // 在新会话启动时运行的代码        }        void Session_End(object sender, EventArgs e)        {            // 在会话结束时运行的代码。             // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为            // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer             // 或 SQLServer,则不会引发该事件。        }    }}

  

3.写入LogHelper类 

 

using System;using System.Collections.Generic;using System.Linq;using System.Web;using log4net;namespace WebApplication1{    ///     /// 日志辅助类    ///     public class LogHelper    {        private static ILog log;        private static LogHelper logHelper = null;        ///         /// 初始化        ///         /// 
public static ILog GetInstance() { logHelper = new LogHelper(null); return log; } /// /// 初始化 /// /// ///
public static ILog GetInstance(string configPath) { logHelper = new LogHelper(configPath); return log; } /// /// 构造函数 /// /// private LogHelper(string configPath) { if (!string.IsNullOrEmpty(configPath)) { log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(configPath)); } else { log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); } } }}

  

 

4.使用Log4net的方法(下面的可以写为一个方法,哪里使用哪里调用。)

 

 

Exception exp = Server.GetLastError();            string strE = "\r\n堆栈:" + exp.StackTrace + "\r " + "Message:" + exp.Message + "\r 来源:" + exp.Source + "\r 来源:" + Request.Url;            Response.Write(strE);            // 在事件日志中记录异常信息                       ILog log = LogHelper.GetInstance();            log.Warn(strE);            Server.ClearError();            Server.Transfer("Error.aspx", false);

   

四、更详细的配置文件 

 

 

posted on
2017-05-08 10:36  阅读(
...) 评论(
...) 收藏

转载于:https://www.cnblogs.com/zhaodahai/p/6823845.html

你可能感兴趣的文章
03、 forms组件
查看>>
Win32++ Home Page
查看>>
织梦Dedecms使用Nginx的安全设置
查看>>
android中自定义shape
查看>>
8、JPA-映射-双向一对一
查看>>
Oracle查看表结构的几种方法
查看>>
1.MySql
查看>>
div+css 设计下拉
查看>>
模拟公交站台竖直排列,两端对齐
查看>>
JavaScript dom 标签属性
查看>>
CSS半透明边框
查看>>
进程上下文和中断上下文
查看>>
unity GUI GUILayout 水平 垂直布局
查看>>
Luogu P2845 [USACO15DEC]Switching on the Lights 开关灯(bfs)
查看>>
潭州课堂25班:Ph201805201 tornado 项目 第六课 用户和图片分享的集成(课堂笔记)...
查看>>
潭州课堂25班:Ph201805201 django 项目 第九课 图片验证码前台实现,判断用户是否注册功能实现 (课堂笔记)...
查看>>
centos7下面ruby的升级
查看>>
札记-20190531
查看>>
简练软考知识点整理-项目监控过程组
查看>>
排序算法 - 函数 Char* Revert(Char* pStr),将字符串pStr逆序
查看>>