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

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

转载:

一、什么是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);

四、更详细的配置文件

转载于:https://www.cnblogs.com/zhaox583132460/p/3411725.html

你可能感兴趣的文章
常量指针和指针常量巧妙记忆方法[转]
查看>>
python-haproxy作业讲解视频总结
查看>>
mui搜索框 搜索点击事件
查看>>
select2 下拉搜索控件
查看>>
WebAPI常见的鉴权方法,及其适用范围
查看>>
08. 删除重复&海量数据
查看>>
重新想象 Windows 8 Store Apps (71) - 其它: C# 调用 C++
查看>>
发布mvc遇到的HTTP错误 403.14-Forbidden解决办法
查看>>
记录一些好用的工具
查看>>
超链接样式设置(去下划线)(转)
查看>>
2016012003+陈琦+散列函数的应用及其安全性
查看>>
Android 状态栏通知Notification、NotificationManager详解
查看>>
UIApplicationDelegate协议
查看>>
Jmeter测试dubbo接口填坑
查看>>
[zz]GDB调试精粹及使用实例
查看>>
数据库的创建和删除
查看>>
最简单的三层实例【插入据
查看>>
设计模式学习笔记——Prototype原型模式
查看>>
pom.xml里有红叉报错的解决办法
查看>>
Perl last和next的用法区别
查看>>