Log4net框架简介:

  Log4net 是 Apache 下的一个开源项目,log4net框架基于Apache log4j™。Log4net用于日志记录或跟踪API,它允许开发人员控制以任意粒度输出哪些日志语句。它在运行时使用外部配置文件完全可配置。

Log4net 定义了多种日志信息输出模式,它可以根据需要将日志输出到控制台,文本文件,windows 日志事件查看器中,包括数据库,邮件等位置,以便快速跟踪程序运行情况。

Log4net 有三个核心组件,分别是Logger(记录器), Appender(附着器)以及 Layout(布局).

主要组件简介:

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

  log4net使用继承体系,也就是说假如存在两个Logger,名字分别为a.b.c和a.b。那么a.b就是a.b.c的祖先。每个Logger都继承了它祖先的属性。

2、 Appender 用于设置日志的存储方式和位置,我们可能要将日志输出到控制台,文本文件,windows 日志事件查看器中, 包括数据库,邮件等等位置。

  Logger 的配置中会绑定一个或多个 Appender,每种 Appender 都有特定一些参数。

3、 Filter就是过滤器,使用过滤器可以过滤掉Appender输出的部分内容,只输出感兴趣的日志。

4、 Layout用于控制Appender的输出格式,可以使线性的也可以使XML。一个Appender只能有一个Layout配置。

日志记录级别:

高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低)

关联配置文件
    log4net默认关联的是应用程序的配置文件App.config或Web.config,可以使用程序集自定义属性来进行设置。下面来介绍一下这个自定义属性:log4net.Config.XmlConifguratorAttribute。
XmlConfiguratorAttribute有3个属性:ConfigFile、ConfigFileExtension、Watch。
ConfigFile:配置文件的名字,文件路径相对于应用程序目录。ConfigFileExtension:配置文件的扩展名,文件路径相对于应用程序的目录,不能和ConfigFile属性一起使用。Watch:如果将Watch属性设置为true,就会监视配置文件,当配置文件发生变化的时候,就会重新加载。例如:
//监视默认的配置文件,App.exe.config
[assembly: log4net.Config.XmlConfigurator(Watch = true)] //配置文件:App.exe.log4net
[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "log4net")] //配置文件:log4net.config
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]
也可以在Global.asax的Application_Start里或者是Program.cs中的Main方法中添加,注意这里一定是绝对路径,如下所示:
log4net.Config.XmlConfigurator.Configure(new FileInfo(@"F:\xx\xxx\log4net.config"));

Lo4net 案例:

1、官网:http://logging.apache.org/下载,完成后项目引入log4net.dll程序集。或通过Nuget为项目安装引入Log4net.dll。

2、以 控制台应用程序为例, 创建应用程序StudyLog4Net,引入Log4net.dll。

3、在项目中,添加一个名为 log4net 的应用程序配置文件,如下图所示。

4、在log4net 编辑配置文件,如下图所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--注册log4net(目前注释掉也可以正常使用)-->
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections> <log4net> <!-- 日志默认值节点 -->
<root>
<!-- 默认日志对象级别 -->
<!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
<level value="all" />
<!-- 默认日志记录方式 ref为<appender>节点的name属性-->
<appender-ref ref="MyColoredConsoleAppender"/>
</root>
<!--
注意!!!
<root>节点和<logger>节点,如果同时出现,
会先执行root的内容,再执行logger的内容,
有可能会出现重复插入记录的情况,
解决方案:默认节点不设置默认记录方式
-->
<!-- 指定类别日志设置节点 name为LogManager.GetLogger("logger.db.debug")中的name参数 -->
<logger name="logger.db.debug">
<!-- 该日志对象的级别(可多个级别设置在一起,公用同一个记录方式)-->
<level value="DEBUG"/>
<!-- 该日志对象的记录方式(可多个记录方式设置在一起,同时记录到多种媒介上) -->
<appender-ref ref="AdoNetAppender_Debug"/>
</logger>
<logger name="logger.db.info">
<level value="INFO"/>
<appender-ref ref="AdoNetAppender_Info"/>
</logger>
<!-- 文本日志 -->
<logger name="logger.file.debug">
<level value="DEBUG"/>
<appender-ref ref="RollingFileAppender_Debug"/>
</logger>
<logger name="logger.file.other">
<level value="INFO"/>
<level value="WARN"/>
<appender-ref ref="RollingFileAppender_Other"/>
</logger> <!--
AdoNetAppender:利用ADO.NET记录到数据库的日志。
ConsoleAppender:将日志输出到控制台。
RollingFileAppender:将日志以回滚文件(重复操作原始文件)的形式写到文件中。
-->
<!-- 将日志记录事件写入应用程序的控制台。事件可以转到标准流或标准错误流。事件可以具有为每个级别定义的可配置文本和背景颜色。 -->
<appender name="MyColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
<!-- 设置不同级别控制台显示的不同颜色 -->
<mapping>
<level value="INFO" />
<foreColor value="Green" />
</mapping>
<mapping>
<level value="ERROR" />
<foreColor value="Red, HighIntensity" />
</mapping>
<!-- 记录的格式。 -->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{HH:mm:ss,fff} [%-5level] %m %n" />
<!-- 标准 <conversionPattern value = "%date [%thread]%-5level%logger [%ndc] - %message%newline" />-->
</layout>
<!--
过滤器type有如下几种类型
log4net.Filter.DenyAllFilter 丢弃所有日志事件。
log4net.Filter.LevelMatchFilter 准确匹配事件等级。
log4net.Filter.LevelRangeFilter 匹配一个范围的等级。
log4net.Filter.LoggerMatchFilter 匹配一个日志器名字的开始。
log4net.Filter.PropertyFilter 匹配指定属性名称的子字符串。
log4net.Filter.StringMatchFilter 匹配事件消息的子字符串。
-->
<filter type="log4net.Filter.LevelRangeFilter">
<!-- 控制输出日志的级别范围 -->
<param name="LevelMin" value="Info" />
<param name="LevelMax" value="Error" />
</filter>
</appender> <!-- 文件形式记录日志-Debug -->
<appender name="RollingFileAppender_Debug" type="log4net.Appender.RollingFileAppender">
<!--日志文件路径,按文件大小方式输出时在这里指定文件名,并且前面的日志按天在文件名后自动添加当天日期形成文件-->
<param name= "File" value= "D:\App_Log\Debug\"/>
<!--是否是向文件中追加日志-->
<param name= "AppendToFile" value= "true"/>
<!--记录日志写入文件时,不锁定文本文件-->
<!--<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />-->
<!--Unicode编码-->
<!--<Encoding value="UTF-8" />-->
<!--最多产生的日志文件数,value="-1"为不限文件数-->
<!--<param name="MaxSizeRollBackups" value="" />-->
<!--log保留天数-->
<param name= "MaxSizeRollBackups" value= ""/>
<!--日志文件名是否是固定不变的(是否只写到一个文件中)-->
<param name= "StaticLogFileName" value= "false"/>
<!--按日期产生文件夹,文件名[在日期方式与混合方式下使用]日志文件名格式为:--.log -->
<param name= "DatePattern" value= "yyyy-MM-dd&quot;.log&quot;"/>
<!--<param name="DatePattern" value="yyyy-MM-dd/"-ReflectionLayout.log="""" />
<param name="DatePattern" value="yyyyMMdd/yyyyMMdd"-TimerServer.log"" />
<param name="DatePattern" value="yyyyMMdd/"TimerServer/TimerServer.log"" />-->
<!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
<param name="RollingStyle" value="Date" />
<!--每个文件的大小。只在混合方式与文件大小方式下使用,超出大小的在文件名后自动增加1重新命名-->
<param name="maximumFileSize" value="500KB" />
<!--记录的格式。-->
<layout type="log4net.Layout.PatternLayout">
<!--
%d, %date :表示当然的时间
   %p, %level :表示日志的级别
   %c, %logger :表示日志产生的主题或名称,通常是所在的类名,便于定位问题
   %m, %message :表示日志的具体内容
   %n, %newline :换行
%exception :表示异常信息
-->
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m %logger %n" />
</layout>
</appender>
<!-- 文件形式记录日志-Other -->
<!--将日志记录事件写入文件系统中的文件。RollingFileAppender可以配置为根据日期或文件大小约束记录到多个文件。-->
<appender name="RollingFileAppender_Other" type="log4net.Appender.RollingFileAppender">
<param name= "File" value= "D:\App_Log\Other\"/>
<param name= "AppendToFile" value= "true"/>
<param name= "MaxSizeRollBackups" value= ""/>
<param name= "StaticLogFileName" value= "false"/>
<param name= "DatePattern" value= "yyyy-MM-dd&quot;.log&quot;"/>
<param name="RollingStyle" value="Date" />
<param name="maximumFileSize" value="500KB" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m %logger %n" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<!-- 控制输出日志的级别范围 -->
<param name="LevelMin" value="Info" />
<param name="LevelMax" value="Warn" />
</filter>
</appender> <!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质 -->
<!-- 数据库日志-Debug(每一个appender节点,代表一个记录日志的方式) -->
<!-- 使用预准备语句或存储过程将日志记录事件写入数据库。 -->
<appender name="AdoNetAppender_Debug" type="log4net.Appender.AdoNetAppender">
<!--日志缓存写入条数 设置为0时只要有一条就立刻写到数据库 生产环境可改为10-100写入一次-->
<bufferSize value="" />
<!-- 数据库连接类型 -->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<!-- 数据库连接字符串 -->
<connectionString value="data source=ANDYCHEN-PC;initial catalog=DBRABC;integrated security=true;persist security info=True;User ID=sa;Password=123" />
<!-- 执行SQL语句 -->
<commandText value="INSERT INTO ApplicationLog_Debug(LogDate, Level, Logger, Message, Exception) VALUES (@log_date, @log_level, @logger, @message, @exception)" />
<!-- 参数赋值 -->
<!-- 参数-日志时间 -->
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<!-- 参数-日志级别 -->
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<!-- 参数-日志名称 -->
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<!-- 参数-日志内容(size是最大长度,超出则直接去到该长度的内容) -->
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<!-- 参数-异常内容(Exception会记录异常的所有信息,如:System.NullReferenceException: 未将对象引用设置到对象的实例。
在 TestLog4Net.Program.Main(String[] args) 位置 d:\TestDemo_Tyh\TestLog4Net\TestLog4Net\Program.cs:行号 ) -->
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender> <appender name="AdoNetAppender_Info" type="log4net.Appender.AdoNetAppender">
<!-- 表示是记录10条到缓冲区,满10条后再写入SQL server 调试时可以改为1,实际应用建议为100 -->
<bufferSize value="" />
<!-- 数据库连接类型 -->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<!-- 数据库连接字符串 -->
<connectionString value="data source=ANDYCHEN-PC;initial catalog=DBRABC;integrated security=true;persist security info=True;User ID=sa;Password=123" />
<!-- 执行SQL语句 -->
<commandText value="INSERT INTO ApplicationLog_Debug(LogDate, Level, Logger, Message, Exception) VALUES (@log_date, @log_level, @logger, @message, @exception)" />
<!-- 参数赋值 -->
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender> </log4net> </configuration>

5、编写代码

using log4net;
using log4net.Config;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web; namespace StudyLog4Net
{
public class Program
{
//private static log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public static void InitLog4Net()
{
//配置文件 第一种
//string assemblyFilePath = Assembly.GetExecutingAssembly().Location;
//string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);
//string configFilePath = assemblyDirPath + "\\log4net.config";
//var logConfig = new FileInfo(configFilePath); //配置文件 第二种
//Path.GetFullPath("../..") 获取当前项目的屋里路径
var logConfig = new FileInfo(Path.GetFullPath("../..") + @"/log4net.config");
//配置文件 第三种 若要用下面这个,需要将log4net.config 放入此配置文件在当前应用程序集的执行目录,即.exe目录
//var logConfig = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config");
log4net.Config.XmlConfigurator.ConfigureAndWatch(logConfig);
} static void Main(string[] args)
{
//初始化log4net对象
InitLog4Net(); // 注意:
//若是不使用InitLog4Net() 进行初始化,可在Properties的AssemblyIndo.cs 中添加
//[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4net.config", Watch = true)]
//当然,此配置文件在当前应用程序集的执行目录,即项目的bin/Debug 或者 bin/Release目录下,否则会出现找不到配置文件而无法创建logger对象。
//(web的项目,直接放在web项目的根目录下即可),可直接根据 AppDomain.CurrentDomain.BaseDirectory + "log4net.config" 获取配置文件 //创建默认类型的日志对象(传递对象类型typeof(Program)可以自动记录类名称)
var logger = LogManager.GetLogger(typeof(Program));
logger.Debug("测试日志");//配置了过滤器不记录此条信息
logger.Info("测试日志");
logger.Error("测试日志");
; //创建指定类型的日志对象
var loggerDbDebug = LogManager.GetLogger("logger.db.debug");
var loggerDbInfo = LogManager.GetLogger("logger.db.info");//创建指定类型的文本日志对象
var loggerFileDebug = LogManager.GetLogger("logger.file.debug");
var loggerFileOther = LogManager.GetLogger("logger.file.other"); //写入默认类型日志
logger.Debug("测试日志");//配置了过滤器不记录此条信息
logger.Info("测试日志");
logger.Error("测试日志");
//写入指定类型日志(可以先验证是否为当前日志级别)
if (loggerDbDebug.IsDebugEnabled)
loggerDbDebug.Debug("db.debug", new Exception("db.debug.Exception"));
if (loggerDbInfo.IsInfoEnabled)
loggerDbInfo.Info("db.info", new Exception("db.info.Exception"));
//写入指定类型的文本日志
loggerFileDebug.Debug("file.debug", new Exception("file.debug.Exception"));
loggerFileOther.Info("file.info", new Exception("file.info.Exception"));
loggerFileOther.Warn("file.warn", new Exception("file.warn.Exception"));
loggerFileOther.Error("file.error", new Exception("file.error.Exception"));//配置了过滤器不记录此条信息
loggerFileOther.Fatal("file.fatal", new Exception("file.fatal.Exception"));//配置了过滤器不记录此条信息 Console.WriteLine("complete");
Console.ReadKey();
}
}
}

6、SQLSERVER 数据库表创建,如下所示:

-- 判断索引是否存在,存在就删除
if exists (select 1
from sysindexes
where id = object_id('ApplicationLog_Debug')
and name = 'Index_ApplicationLog_Debug_LogDate'
and indid > 0
and indid < 255)
drop index ApplicationLog_Debug.Index_ApplicationLog_Debug_LogDate
go
-- 判断表是否存在
if exists (select 1
from sysobjects
where id = object_id('ApplicationLog_Debug')
and type = 'U')
drop table ApplicationLog_Debug
go -- 创建表
create table ApplicationLog_Debug (
Id bigint identity,
LogDate datetime not null,
Level varchar(50) not null,
Logger varchar(50) null,
Message ntext null,
Exception text null,
constraint PK_APPLICATIONLOG_DEBUG primary key nonclustered (Id)
)
go --创建索引
create clustered index Index_ApplicationLog_Debug_LogDate on ApplicationLog_Debug (
LogDate DESC
)
go

7、运行项目,结果如下:

Log4Net 笔记的更多相关文章

  1. Log4net使用笔记

    Log4net使用笔记   编写人:CC阿爸 2013-10-29 近来在处理项目时候,想将系统的操作日志以文本的形式记录下来,方便对系统操作记录进行追踪. 经过在网上搜索部分解决方案,大致可以归纳如 ...

  2. [转载]Log4net学习笔记

    Log4net 学习笔记: 主要是根据apache站点整理的: 原文链接:http://logging.apache.org/log4net/release/sdk/ http://logging.a ...

  3. log4net学习笔记

    一直想找一个好用的日子类,今天偶然的机会看到了log4net这个类库,过来学习一下. log4net是.NET框架下的一个日子类库,官网是http://logging.apache.org/log4n ...

  4. log4net基本日志使用笔记[windows application]

    Ref: http://www.cnblogs.com/wangsaiming/archive/2013/01/11/2856253.html http://www.cnblogs.com/zhouf ...

  5. asp.net MVC日志插件Log4Net学习笔记二:保存日志到sqlserver的配置

    1.写到sqlserver的配置: <!--保存到SQLSERVER数据库日志--> <log4net> <appender name="AdoNetAppen ...

  6. asp.net MVC日志插件Log4Net学习笔记一:保存日志到本地

    log4net(Log For Net)是Apache开源的应用于.Net框架的日志记录工具,详细信息参见Apache网站.它是针对Java的log4j(Log For Java的)姊妹工具.用过lo ...

  7. log4net 学习笔记

    记入最基本的用法 : refer : http://www.cnblogs.com/aehyok/archive/2013/05/07/3066010.html <configuration&g ...

  8. Log4Net使用学习笔记

    项目源文件下载https://files.cnblogs.com/files/ckym/Log4NetTestSourceCode.zip Log4net是一款非常好用的日志记录的框架,使用它可以实现 ...

  9. log4net 使用笔记

    一.Log4net特征 1.自定义日志输出级别 Log4net将日志分为五个级别优先级从高到低依次:FATAL > ERROR > WARN > INFO > DEBUG,此外 ...

随机推荐

  1. 依据出生日期Date 计算年龄

    依据出生日期计算年龄 public class DateGetAge { public static int getAge(Date birthDay) throws Exception { Cale ...

  2. git 出现502错误后用depth一步一步来

    公司有个项目的git仓库,因为一些二进制文件也放在里面,版本迭代后,整个仓库特别大,有好几G. 直接git clone是不行的,会报这样的错误: error: RPC failed; HTTP 502 ...

  3. Intent 介绍

    一.Intent的介绍 Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述 ...

  4. android环境部署(1)

    1.首先是eclipse(现在拿eclipse-standard-kepler-SR1-win32做实验): 下载地址:http://www.eclipse.org/downloads/downloa ...

  5. 在 XenServer上调试windows程序

    WinDbg WinDbg is one of a number of tools available from Microsoft that can be used for debugging Wi ...

  6. 挖一挖C#中那些我们不经常使用的东西之系列(1)——ToDictionary,ToLookup

    这个系列我们看看C#中有哪些我们知道.可是又不知道怎么用.又或者懒得去了解的东西,比方这篇我们要介绍的toDictionary 和ToLookup. 从图中我们看到有四个ToXXX的方法,当中ToAr ...

  7. Ubuntu——修正LibreOffice中文乱码以及eclipse提示框颜色

    刚进ubuntu的时候就老遇到用libreoffice打开某些文档时出现一堆叠在一起的乱码.以及最開始使用eclipse编辑时,鼠标放到一个变量或者函数时 弹出来一黑框框-看的难受的.... 这里记录 ...

  8. 神奇的canvas——巧用 canvas 为图片添加水印

    代码地址如下:http://www.demodashi.com/demo/11637.html 很久之前写过一篇关于 canvas 的文章,是通过 canvas 来实现一个绚丽的动画效果,不管看过没看 ...

  9. nnlog-yaml

    from nnlog import Logger# log=Logger(file_name='my.log',level='debug',# when='S',backCount=5,interva ...

  10. Python 的基本运算和内置函数

    一.运算符 (一)Python算术运算符 以下假设变量: a=10,b=20: 运算符 描述 实例 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a ...