log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。
log4net是Apache软件基金会Apache Logging Services工程的一部分。Apache日志服务工程致力于为程序调试和审计提供跨语言的日志服务。(f:百度百科)
Log4net是基于.NET开发的一款记录日志开源组件。它通过一套XML配置的日志引擎,将日志分不同的等级,分别是:FATAL 、 ERROR、 WARN、 INFO 、 DEBUG、ALL(允许所有的日志请求)和OFF(拒绝所有的日志请求),缺省为DEBUG,前五个是不是很熟悉?可以看到和我们平常在调试应用程序的出错有点类似,在编译器中也会留下如错误、警告之类的提示信息,它们的错误级别在不断的降低。
log4net开源项目结构如图所示:
通过查看源码,log4net主要有5个核心部分组成,分别为Logger,Appenders, Filters, Layouts 和Object Renders,在配置文件中它们以节点的形式出现。
-
Logger:主要负责日志的记录,它记录的方式有多种,可以是以文件、数据库、控制台、邮件等多处方式;
-
Appenders:主要负责记录日志介质的方式,它的输出方式主要包括:
-
EventLogAppender:将日志写到Windows操作系统的日志中去。
-
FileAppender:将日志写到文件中。
-
ForwardingAppender:用来为一个Appender指定一组约束。
-
MemoryAppender:将日志存到内存缓冲区。
-
NetSendAppender:将日志输出到Windows Messenger service,这些日志信息将在用户终端的对话框中显示。
-
OutputDebugStringAppender:配置该Appender以向OutputDebugString API写入日志。
-
RemotingAppender:通过.NET Remoting将日志写到远程接收端。
-
RollingFileAppender:将日志以回滚文件的形式写到文件中。
-
SmtpAppender:将日志写到邮件中。
-
SmtpPickupDirAppender:配置与SmtpAppender类似,但要把SmtpHost换为PickupDir。
-
TraceAppender:将日志写到.NET trace 系统。
-
UdpAppender:将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。
以上有些输出方式可能会经常用到(比如写入文件和数据库的方式),有些可能会不经常用到(邮件方式等),具体我们在下面举例来说明。
3.Layouts:主要负责把记录日志格式化输出,显示得格式主要如下:
%timestamp [%thread] %-5level %logger{2} %ndc - %message%newline
timestamp: 表示程序已经开始执行的时间。 单位[毫秒]。
Thread:执行当前代码的线程。
Level:日志的级别。
Logger:日志相关请求的名称。
Message:日志消息。
newline:换行。
案例一:文件记录方式
首先引用Log4net.dll,然后在添加一个配置文件log4net.config(这里不将配置信息写入web.config,个人觉得写在一起实在太乱)中添加下面的配置信息(注意应和web.config处于相同的位置,即根目录下):
4
<
configSections
>
5
<!--
注册lognet
-->
6
<
section
name
="log4net"
type
="log4net.Config.Log4NetConfigurationSectionHandler,log4net"
/>
7
</
configSections
>
8
<
log4net
debug
="false"
>
9
<
root
>
10
<
priority
value
="ALL"
/>
11
<
appender-ref
ref
="TraceAppender"
/>
12
<
appender-ref
ref
="ConsoleAppender"
/>
13
<
appender-ref
ref
="RollingFileAppender"
/>
14
</
root
>
15
<
appender
name
="TraceAppender"
type
="log4net.Appender.TraceAppender"
>
16
<
layout
type
="log4net.Layout.PatternLayout"
>
17
<
conversionPattern
value
="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline"
/>
18
</
layout
>
19
</
appender
>
20
<
appender
name
="ConsoleAppender"
type
="log4net.Appender.ConsoleAppender"
>
21
<
layout
type
="log4net.Layout.PatternLayout"
>
22
<
conversionPattern
value
="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline"
/>
23
</
layout
>
24
</
appender
>
25
<
appender
name
="RollingFileAppender"
type
="log4net.Appender.RollingFileAppender"
>
26
<
file
value
="Log\SysLog"
/>
27
<!--
日志文件夹及文件名开头
-->
28
<
appendToFile
value
="true"
/>
29
<!--
是否追加到文件
-->
30
<
RollingStyle
value
="Date"
/>
31
<!--
日期的格式
-->
32
<
DatePattern
value
="yyyy-MM-dd"
/>
33
<!--
文件名后面加上.log后缀,必须使用转义字符
-->
34
<
maximumFileSize
value
="1MB"
/>
35
<!--
最大文件大小
-->
36
<
StaticLogFileName
value
="false"
/>
37
<!--
日志文件名是否为静态
-->
38
<
layout
type
="log4net.Layout.PatternLayout,log4net"
>
39
<
param
name
="ConversionPattern"
value
="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline"
/>
40
<
param
name
="Header"
value
=" ------------------网站运行过程中产生的错误-------------------------- "
/>
41
<
param
name
="Footer"
value
=" -----------------测试:GZQ------------------------------------- "
/>
42
</
layout
>
43
</
appender
>
44
</
log4net
>
45
<!--
End站点日志配置部分
-->
46
</
configuration
>
%d, %date :表示当然的时间
%level : 表示日志的级别
%logger, %c:表示日志产生的主题,通常是所在的类名,便于定位问题
%m, %message :表示日志的具体内容
%n, %newline: 换行
在AssemblyInfo.cs中添加如下代码:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
在全局处理程序中添加如下代码:
1 protected void Application_Start(object sender, EventArgs e)
3 log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));
在页面添加button和一个label,在button的单击事件中添加如下代码:
1 protected void btnShowTime_Click(object sender, EventArgs e)
3 log4net.ILog myLogger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
4 myLogger.Warn("这是一个警告日志");
5 myLogger.Info("单击了按钮");
6 myLogger.Debug("用Log4Net写入数据库日志");
7 myLogger.Error("这是一个错误日志");
8 myLogger.Fatal("这是一个致命的错误日志");
9 try
10 {
11 ILog logger = LogManager.GetLogger("LogRecord");
12 logger.Debug("用Log4Net写入数据库日志");
13 int x = 5;
14 int y = 0;
15 Response.Write(x / y);
16 }
17 catch (Exception ex)
18 {
19 myLogger.Error(ex);
20 }
21 finally
22 {
23 lblShow.Text = DateTime.Now.ToLongTimeString()+":操作日志已记录完成";
24 }
2 <configuration>
3 <configSections>
4 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
5 </configSections>
6 <!--Log4net Begin-->
7 <log4net>
8 <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
9 <bufferSize value="1" />
10 <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
11 <connectionString value="SERVER=127.0.0.1;DATABASE=TestDataBase;UID=sa;PWD=123456;Connect Timeout=15;" />
12 <commandText value="INSERT INTO ErrorLog ([dtDate],[sThread],[sLevel],[sLogger],[sMessage],[sException]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
13 <parameter>
14 <parameterName value="@log_date" />
15 <dbType value="DateTime" />
16 <layout type="log4net.Layout.RawTimeStampLayout" />
17 </parameter>
18 <parameter>
19 <parameterName value="@thread" />
20 <dbType value="String" />
21 <size value="100" />
22 <layout type="log4net.Layout.PatternLayout">
23 <conversionPattern value="%t" />
24 </layout>
25 </parameter>
26 <parameter>
27 <parameterName value="@log_level" />
28 <dbType value="String" />
29 <size value="200" />
30 <layout type="log4net.Layout.PatternLayout">
31 <conversionPattern value="%p" />
32 </layout>
33 </parameter>
34 <parameter>
35 <parameterName value="@logger" />
36 <dbType value="String" />
37 <size value="500" />
38 <layout type="log4net.Layout.PatternLayout">
39 <conversionPattern value="%logger" />
40 </layout>
41 </parameter>
42 <parameter>
43 <parameterName value="@message" />
44 <dbType value="String" />
45 <size value="3000" />
46 <layout type="log4net.Layout.PatternLayout">
47 <conversionPattern value="%m" />
48 </layout>
49 </parameter>
50 <parameter>
51 <parameterName value="@exception" />
52 <dbType value="String" />
53 <size value="4000" />
54 <layout type="log4net.Layout.ExceptionLayout" />
55 </parameter>
56 </appender>
57 <!-- setup the root category, add the appenders and set the default level -->
58 <root>
59 <level value="WARN"/>
60 <level value="INFO"/>
61 <level value="DEBUG"/>
62 <level value="FINE"/>
63 <appender-ref ref="ADONetAppender" />
64 </root>
65 <!-- specify the level for some specific categories -->
66 <logger name="iNotes">
67 <level value="WARN"/>
68 <level value="INFO"/>
69 <level value="DEBUG"/>
70 <level value="FINE"/>
71 <appender-ref ref="ADONetAppender"/>
72 </logger>
73 <logger name="StellaLogger">
74 <level value="ALL"/>
75 <appender-ref ref="AdoNetAppender" />
76 </logger>
77 </log4net>
78 <!--Log4net End-->
79 </configuration>
1 CREATE TABLE [dbo].[ErrorLog](
3 [nId] [bigint] IDENTITY(1,1) NOT NULL,
5 [dtDate] [datetime] NOT NULL,
7 [sThread] [varchar](100) NOT NULL,
9 [sLevel] [varchar](200) NOT NULL,
11 [sLogger] [varchar](500) NOT NULL,
13 [sMessage] [varchar](3000) NOT NULL,
15 [sException] [varchar](4000) NULL)
简介 log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。 log4net是Apache软件基金会Apache Logging Services工程的一部分。Apache日志服务工程致力于为程序调试和审计提供跨语言的日志服务。(f:百度百科)原理
根据上一篇的思路,简单完成了根据时间设置,自动删除过期的
日志文件,测试代码链接如下:
http://download.csdn.net/download/dreamgis/10035539
直接在
log4net的配置文件中添加一个属性,用来设置过期时间长度(单位:天),见下图:
晚上关于删除的
日志文件主要有https://blog.csdn.net/hellolib/article/details/78316253, 其实我这里的实现
方式和他差不多,不过我这里不用配置时间, 直接写死 删除10天以前的
日志数据,
static ILog _log = null;
static object lockHelper = new object();
一. Log4Net简介
Log4net是从Java中的Log4j迁移过来的一个.Net版的开源日志框架,它的功能很强大,可以将日志分为不同的等级,以不同的格式输出到不同的存储介质中,比如:数据库、txt文件、内存缓冲区、邮件、控制台、ANSI终端、远程接收端等等,我们这里主要介绍最常用的两种:txt文件和数据库。
(PS:其它的存储介质详见 http://logging.apache...
log4j是一个Java编程语言的日志框架。在使用log4j时,我们可能会遇到一些IOException异常,例如无法打开日志文件或者无法写入日志文件等问题。对于这些异常,log4j提供了一些策略来处理它们。
一种处理IOException的策略是使用FailoverAppender。这个Appender会尝试将日志消息写入多个不同的地方,如果其中一个地方出现了IOException异常,它会尝试将消息写入其他地方。这样可以确保日志消息被记录下来,即使某个地方无法写入。
另一种策略是使用RollingFileAppender,它可以自动为日志文件创建备份文件。如果主文件无法写入,RollingFileAppender可以切换到备份文件进行记录。这样可以避免日志数据的丢失。
除了以上的两种策略,log4j还提供了其他的处理IOException的方法,开发者可以根据实际情况选择合适的策略来处理异常情况。