Log4Net日志记录两种方式
简介
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:主要负责记录日志介质的方式,它的输出方式主要包括:
- AdoNetAppender:将日志记录到数据库中。可以采用SQL和存储过程两种方式
AspNetTraceAppender:能用ASP.NET中跟踪的方式查看记录的日志。
BufferingForwardingAppender:在输出到子Appenders之前先缓存日志事件。
- ColoredConsoleAppender:在终端的窗口写下高亮度的日志事件。
- ConsoleAppender:将日志输出到控制台。
- 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处于相同的位置,即根目录下):
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!--日志配置部分-->
<configSections>
<!--注册lognet-->
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net debug="false">
<root>
<priority value="ALL"/>
<appender-ref ref="TraceAppender"/>
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="RollingFileAppender"/>
</root>
<appender name="TraceAppender" type="log4net.Appender.TraceAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline"/>
</layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline"/>
</layout>
</appender>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="Log\SysLog"/>
<!--日志文件夹及文件名开头-->
<appendToFile value="true"/>
<!--是否追加到文件-->
<RollingStyle value="Date"/>
<!--日期的格式-->
<DatePattern value="yyyy-MM-dd"/>
<!--文件名后面加上.log后缀,必须使用转义字符-->
<maximumFileSize value="1MB" />
<!--最大文件大小-->
<StaticLogFileName value="false"/>
<!--日志文件名是否为静态-->
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline"/>
<param name="Header" value=" ------------------网站运行过程中产生的错误-------------------------- "/>
<param name="Footer" value=" -----------------测试:GZQ------------------------------------- "/>
</layout>
</appender>
</log4net>
<!--End站点日志配置部分-->
</configuration>
%d, %date :表示当然的时间
%level : 表示日志的级别
%logger, %c:表示日志产生的主题,通常是所在的类名,便于定位问题
%m, %message :表示日志的具体内容
%n, %newline: 换行
在AssemblyInfo.cs中添加如下代码:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
在全局处理程序中添加如下代码:
protected void Application_Start(object sender, EventArgs e)
{
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));
}
测试
在页面添加button和一个label,在button的单击事件中添加如下代码:
protected void btnShowTime_Click(object sender, EventArgs e)
{
log4net.ILog myLogger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
myLogger.Warn("这是一个警告日志");
myLogger.Info("单击了按钮");
myLogger.Debug("用Log4Net写入数据库日志");
myLogger.Error("这是一个错误日志");
myLogger.Fatal("这是一个致命的错误日志");
try
{
ILog logger = LogManager.GetLogger("LogRecord");
logger.Debug("用Log4Net写入数据库日志");
int x = ;
int y = ;
Response.Write(x / y);
}
catch (Exception ex)
{
myLogger.Error(ex);
}
finally
{
lblShow.Text = DateTime.Now.ToLongTimeString()+":操作日志已记录完成";
}
}
结果
案例二:日志记入数据库
记入数据库的方式和记入文件的方式大同小异,主要区别在配置文件,其他步骤相同,记入数据库的配置文件log4net.config如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<!--Log4net Begin-->
<log4net>
<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="SERVER=127.0.0.1;DATABASE=TestDataBase;UID=sa;PWD=123456;Connect Timeout=15;" />
<commandText value="INSERT INTO ErrorLog ([dtDate],[sThread],[sLevel],[sLogger],[sMessage],[sException]) 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="100" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%t" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="200" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%p" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="500" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="3000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%m" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
<!-- setup the root category, add the appenders and set the default level -->
<root>
<level value="WARN"/>
<level value="INFO"/>
<level value="DEBUG"/>
<level value="FINE"/>
<appender-ref ref="ADONetAppender" />
</root>
<!-- specify the level for some specific categories -->
<logger name="iNotes">
<level value="WARN"/>
<level value="INFO"/>
<level value="DEBUG"/>
<level value="FINE"/>
<appender-ref ref="ADONetAppender"/>
</logger>
<logger name="StellaLogger">
<level value="ALL"/>
<appender-ref ref="AdoNetAppender" />
</logger>
</log4net>
<!--Log4net End-->
</configuration>
创建记录日志的数据表:
CREATE TABLE [dbo].[ErrorLog]( [nId] [bigint] IDENTITY(1,1) NOT NULL, [dtDate] [datetime] NOT NULL, [sThread] [varchar](100) NOT NULL, [sLevel] [varchar](200) NOT NULL, [sLogger] [varchar](500) NOT NULL, [sMessage] [varchar](3000) NOT NULL, [sException] [varchar](4000) NULL)
测试
采用上面的测试方法。
结果
结语
项目中经常用到的两种方式在这里做一下总结。其他方式,用到了再补上。
Log4Net日志记录两种方式的更多相关文章
- log4net使用的两种方式
1.首先添加log4net.dll引用(可以使用 管理NuGet程序包添加引用,也可以下载下来手动去添加引用) 2.在app.config文件中配置 3.log4net使用的2终方式 log4net ...
- log4net配置的两种方式
----------文件配置:------------------- <?xml version="1.0" encoding="utf-8" ?> ...
- 通过filebeat、logstash、rsyslog采集nginx日志的几种方式
由于nginx功能强大,性能突出,越来越多的web应用采用nginx作为http和反向代理的web服务器.而nginx的访问日志不管是做用户行为分析还是安全分析都是非常重要的数据源之一.如何有效便捷的 ...
- Redis的持久化的两种方式drbd以及aof日志方式
redis的持久化配置: 主要包括两种方式:1.快照 2 日志 来看一下redis的rdb的配置选项和它的工作原理: save 900 1 // 表示的是900s内,有1条写入,则产生快照 save ...
- mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样
Mybatis批量更新数据 mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样 mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样 mybatis批 ...
- Log4Net日志记录介绍
原文地址 : http://www.cnblogs.com/wolf-sun/p/3347373.html#3009010 简介 log4net库是Apache log4j框架在Microsoft . ...
- Redis持久化的两种方式(RDB和AOF)
redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File). RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储 ...
- 【转】python之配置日志的几种方式
[转]python之配置日志的几种方式 作为开发者,我们可以通过以下3种方式来配置logging: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用 ...
- 分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC (转载 不错)
分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC 1 一致性 1.1 简述 一致性,是指对每个节点一个数据的更新,整个集群都知道更新,并且是一致的 假设一个具有N个节点的分布式系统,当 ...
随机推荐
- 学习笔记——Maven settings.xml 配置详解
文件存放位置 全局配置: ${M2_HOME}/conf/settings.xml 用户配置: ${user.home}/.m2/settings.xml note:用户配置优先于全局配置.${use ...
- 学习笔记——Maven超级POM
2014-07-04:更新如何在安装程序中找到超级pom文件.Maven有一个超级POM,所有的POM均继承此文件.你可以使用解压工具打开jar文件$M2_HOME/lib/maven-model-b ...
- .NET中常用的几种解析JSON方法
一.基本概念 json是什么? JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是一种轻量级的数据交换格式,是存储和交换文本信息的语法. ...
- C#Winform使用扩展方法自定义富文本框(RichTextBox)字体颜色
在利用C#开发Winform应用程序的时候,我们有可能使用RichTextBox来实现实时显示应用程序日志的功能,日志又分为:一般消息,警告提示 和错误等类别.为了更好地区分不同类型的日志,我们需要使 ...
- Sublime Text 2 使用笔记(大全呀,菜鸟必看)
下载和安装 Sublime Text2是一款开源的软件,不需要注册即可使用(虽然没有注册会有弹窗,但是基本不影响使用). 下载地址:http://www.sublimetext.com ,请自行根据系 ...
- 关于 jquery select2 多个关键字 模糊查询的解决方法
select2 只针对 元素的text()进行匹配,实际开发过程中可能会存在通过id 或者特殊编码进行 多关键字匹配. 改动了下源码:红色为改动部分. process=function(element ...
- vs操作快捷键
注释: 先CTRL+K,然后CTRL+C取消注释: 先CTRL+K,然后CTRL+U 解析命名空间:shift+alt+f10 或Ctrl + . 调试快捷键 F6: ...
- Bootstrap3.0学习第十八轮(JavaScript插件——下拉菜单)
详情请查看 http://aehyok.com/Blog/Detail/25.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:h ...
- 安装及破解IntelliJ IDEA15
1. 下载安装包 进入 JetBrains 官网,http://www.jetbrains.com/idea/download/#tabs_1=windows, 从Ultimate下载企业版 Inte ...
- HDU 5973 Game of Taking Stones 威佐夫博弈+大数
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5973 Game of Taking Stones Time Limit: 2000/1000 MS ...