目录
- 0.简介
- 1.安装程序包
- 2.配置文件示例
- 3.日记的级别:Level
- 4.日志的输出源:Appenders
- 5.日志格式:Layout
- 6.日志文件变换方式(回滚方式):RollingStyle
- 7.日志的过滤器:Filter
- 8.将日志记录在数据库中
- 9.记入日志的原则
- 10.参考
- 11.完整的案例源码
0.简介
- Log4Net库是Apache log4j框架在 .NET平台下的实现,其开源免费。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。
- 官网地址:http://logging.apache.org/log4net/index.html
- Log4Net开源地址:https://github.com/apache/logging-log4net/
1.安装程序包
- NuGet:
Install-Package log4net -Version 2.0.8
- 我发现网上一些关于Log4Net的配置的文章中的配置在我的项目中无法运行,所以以下关于Log4Net的使用是在基于 .net 4.6.1的 ASP .NET MVC项目中,开发工具VS2015。
2.配置文件示例
在项目(此处为Web项目)的配置文件Web.config中添加配置信息
2.1注意事项:
"
"节点必须配置在 之后的第一个位置, 否则报错,提示:“只允许一个
元素。它必须是根 元素第一个子元素” 可以有多个"
"中添加相应的“ ”
即可以设置多个日志输出的形式,下面我们是把日志以txt文件的形式保存在App_Data/Log文件夹中的在ASP .NET MVC项目中使用Log4Net,首先要在Global.asax.cs中初始化Log4Net,即添加
log4net.Config.XmlConfigurator.Configure();
2.2示例
2.3配置细节说明
写入日记的级别:DEBUG以上级别(包含该级别)
日志的保存位置:
App_Data/Log/
, 因为App_Data文件夹下的文件无法被用户下载,不希望访问者下载的文件放到这里(如果是控制台项目是生成到 bin\Debug 下)日志文件为后续内容附加到已有文件(若是false,则为后续覆盖向前的内存)
见 6.日志文件变换方式(回滚方式):RollingStyle
见5.2格式示例1
日志写入文件时,不锁定文本文件,防止多线程时不能写Log,
官方说线程非安全,所以示例中没有写此配置,若是需要可以添加:
3.日记的级别:Level
在Log4Net中日志的level: OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL
一般正式项目中只记录InFo以上
Undone:怎么区分级别(什么时候用什么等级)
4.日志的输出源:Appenders
Appenders用来定义日志的输出方式,可以保存为文件,可以保存到数据库,可以发送邮件,可以写到远程接收端。
Appender节点下可以配置Filters和Layout来实现日志的过滤和输出格式
在配置文件中配置如下:
其中的type属性可以设置日志保存的方式,具体的type参数值可以查阅 :非常完善的Log4net详细说明
常用的两种方式:
- type="log4net.Appender.RollingFileAppender" 表示将日志以回滚文件的形式写到文件中。
- type="log4net.Appender.AdoNetAppender"表示将日志记录到数据库中。
5.日志格式:Layout
在配置的Layout节点中可以设置日记记录的格式
5.1设置格式的参数
%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
%n(new line):换行
%d(datetime):输出当前语句运行的时刻
%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
%t(thread id):当前语句所在的线程ID
%p(priority):等同于:%level 日志的当前优先级别,即DEBUG、INFO、WARN…等
%c(class):当前日志对象的名称
%f(file):输出语句所在的文件名。
%l(line):输出语句所在的行号。
%数字:表示该项的最小长度,如果不够,则用空格填充,如“%-5level”表示level的最小宽度是5个字符,如果实际长度不够5个字符则以空格填充。(因为日志的几个等级的单词长度不一样,通过设置字符长度,可以示日志更加整齐)
5.2格式示例1
上面的配置文件中的格式:
按照上述布局,每一条日志的格式类似:
记录时间:2020-01-15 20:34:37,946 线程ID:[6] 日志级别:DEBUG 出错类:_008Log4Net.Controllers.HomeController property:[(null)] - 错误描述:Hi I am log4net Debug Level
5.3格式示例2
按照上述布局,每一条日志的格式类似:
2020-01-15 21:09:17,362 [6] DEBUG _008Log4Net.Controllers.HomeController - Hi I am log4net Debug Level
5.4格式示例3
按照上述布局,每一条日志的格式类似:
记录时间:2020-01-15 22:51:44,106
线程ID:[7]
日志级别: ERROR
出错类:_008Log4Net.Controllers.HomeController property: [(null)] -
错误描述:Hi I am log4net Error Level
System.NullReferenceException: 未将对象引用设置到对象的实例。
在 _008Log4Net.Controllers.HomeController.Index() 位置 F:\ForGit\ASP.NET MVC\008Log4Net\Controllers\HomeController.cs:行号 29
6.日志文件变换方式(回滚方式):RollingStyle
6.1 三种日志回滚方式
回滚方式即按照何种方式产生多个日志文件
按照何种方式产生多个日志文件,其中value参数的可选值:
Date
(日期),Size
(文件大小),Composite
(混合)
6.2 按照混合模式回滚
按照混合模式产生多个日志文件(即既考虑时间,也文件考虑大小)
上述示例中的选择使用混合模式生成日志文件,即一定时间内达到一定大小则生成新的一个日志文件
以下两个节点设置日志文件的大小和数量
最大变换数量,如果超过这个数量则从第一个文件开始复写(即最多保持10个日志文件)
最大文件大小为1MB,支持KB,MB,GB
注意根据以上两个参数:我们将最大文件大小设置为1MB并将文件变换数量设置为10,那么根据日期或文件大小,它将只保留最后(1*10)MB大小的日志文件。
具体根据项目一定时间内可能产生的日志大小,可以进行文件大小和文件数量的合理分配。
6.3 按照时间回滚
(注意这种写法和 等价)
示例:实现日志每一天一个文件夹,每一分钟一个文件
6.4 按照文件大小回滚
示例:Undone
7.日志的过滤器:Filter
filter可以过滤不同等级的日志
按照:OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL的顺序可以设置一个范围
实例:将不同级别的日记记录在不同的日志文件中
8.将日志记录在数据库中
示例:将日记记录在MS SQL Server数据库中
在MS SQLServer中新建一个库,添加一个db_Log表,存放日记信息
建表SQL:
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
) ON [PRIMARY]
配置信息:
按照以上方式配置,存放在数据库中的日志类似如下:
9.记入日志的原则
最后从网上找了一段写日志的原则:
.在catch后,把异常写入日志.
.在调用第三方控件的开始和结束处.
.在连接数据库的开始结束处.
.除非必要,不要在循环体中加入日志,否则一旦出问题可能导致日志暴增.
.在自己认为很重要的逻辑处写入日志.
10.参考
博客园:使用Log4net记录日志
知乎:别在代码里乱打日志了,这才是正确的打日志姿势!
CSDN:ASP.NET MVC的最佳日志记录库
CSDN:非常完善的Log4net详细说明
CSDN:关于日志的那些事儿
CSDN:我的log4net使用手册(完善中)
11.完整的案例源码
下载地址