Log4Net的应用教程之保存日志到数据库中

关于Log4Net的应用,网上有很多教程,但大多数都是拷贝复制,有些按照他的代码来,运行起来发现也出不来效果,但是Log4net的作用实在是非常大的,或者这里说的不对,应该说系统的日志功能是很重要的也很有必要的,当然设置系统的时候完全可以自己来开发一个日志功能,不外乎就是写日志到文件或者数据库中等等,如果写日志到数据库中,那么就需要使用ADO了,如果是三层架构的,那么这个日志添加就不能再任何地方都可以随便添加了,但是Log4net可以做到独立的链接数据库,并且在系统的任何地方都能够使用。

01 我们先添加一个简单的asp.net web项目

我们再添加一个common的类库,这个类库是一些公共的工具类

在添加一个Business的类库,这个类库主要是业务逻辑层的,我这里主要是为了测试在系统任何地方都能调用数据库,所以才创建这些类库

创建后的项目如下:

02 引入log4net.dll的引用,可以在下方的源码中找到,我们在common中引入这个dll

03  我们创建一个数据库,这里面你可以使用你已经创建好的数据库,我这里创建一个名Log4NetDB的数据库

添加,一张数据表Log,sql代码如下

if exists (select 1
from sysobjects
where id = object_id(‘Log‘)
and type = ‘U‘)
drop table Log
go

/*==============================================================*/
/* Table: Log */
/*==============================================================*/
create table Log (
Id bigint identity,
AddTime datetime not null,
Thread nvarchar(100) not null,
Level nvarchar(200) not null,
Logger nvarchar(500) not null,
Message nvarchar(3000) not null,
Exception nvarchar(4000) null,
constraint PK_LOG primary key (Id)
)
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty ‘MS_Description‘,
‘Log4net日志表‘,
‘user‘, @CurrentUser, ‘table‘, ‘Log‘
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty ‘MS_Description‘,
‘日志主键‘,
‘user‘, @CurrentUser, ‘table‘, ‘Log‘, ‘column‘, ‘Id‘
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty ‘MS_Description‘,
‘添加时间‘,
‘user‘, @CurrentUser, ‘table‘, ‘Log‘, ‘column‘, ‘AddTime‘
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty ‘MS_Description‘,
‘所在线程‘,
‘user‘, @CurrentUser, ‘table‘, ‘Log‘, ‘column‘, ‘Thread‘
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty ‘MS_Description‘,
‘级别‘,
‘user‘, @CurrentUser, ‘table‘, ‘Log‘, ‘column‘, ‘Level‘
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty ‘MS_Description‘,
‘拥有者‘,
‘user‘, @CurrentUser, ‘table‘, ‘Log‘, ‘column‘, ‘Logger‘
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty ‘MS_Description‘,
‘日志信息‘,
‘user‘, @CurrentUser, ‘table‘, ‘Log‘, ‘column‘, ‘Message‘
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty ‘MS_Description‘,
‘异常信息‘,
‘user‘, @CurrentUser, ‘table‘, ‘Log‘, ‘column‘, ‘Exception‘
go

04 在log4netdemo主项目根目录添加一个Log4net.config的配置文件

<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<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="DATABASE=Log4NetDB;SERVER=.;UID=sa;PWD=pwdpwd;Connect Timeout=15;" />
<commandText value="INSERT INTO Log ([AddTime],[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="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>
<root>
<level value="WARN"/>
<level value="INFO"/>
<level value="DEBUG"/>
<level value="FINE"/>
<appender-ref ref="ADONetAppender" />
</root>
<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>
</configuration>

05 在主项目中的AssemblyInfo.cs 添加

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] 

06 使用的时候,需要先实例化日志对象

比如在page里面

 private static log4net.ILog logHelper = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
protected void Page_Load(object sender, EventArgs e)
{
//项目中调用使用日志
logHelper.Info("hehe");
}

在common里面

private static log4net.ILog logHelper = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

public static void ComHelperDo()
{
int i = 0;
try
{
int b = 3 / i;
}
catch (Exception ex)
{
logHelper.Error("发现异常", ex);
}
}

在business里

 private static log4net.ILog logHelper = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public static void BusHelperDo()
{
logHelper.Error("错误信息");
}

最后数据库里就添加成功了

需要用到日志的项目就需要引入log4net的dll

用起来也挺方便的

源码下载:http://pan.baidu.com/s/1hqrPhVu

博客园附件下载:http://files.cnblogs.com/files/maijin/Log4NetDemo.rar

感谢你的阅读,希望对你有帮助,欢迎关注作者的个人主页 www.bamn.cn 希望博客园允许打一点点广告....

时间: 2024-10-27 17:30:28

Log4Net的应用教程之保存日志到数据库中的相关文章

使用Log4Net将系统日志信息记录到记事本和数据库中

一.使用Log4Net将日志记录到记事本中步骤 1,将log4net.dll文件添加到项目引用中 2,写日志记录器类如下: /// <summary> /// 日志记录器 /// </summary> public class LogWriter { /// <summary> /// 记录调试信息 /// </summary> /// <param name="message"></param> public s

配置NHibernate将枚举保存为Oracle数据库中的字符串

假设有这样一个枚举: /// <summary> /// 字典项类型 /// </summary> public enum DicItemType { [EnumDescription("程序使用")] Program = 0, [EnumDescription("用户自定义")] Custom = 1 } NHibernate默认是映射为数据库中的数字类型,也就是0或者1.当我们使用数据库管理工具(例如PLSql/Developer)直接浏

kettle作业(job)调用转换,设置变量,写日志到数据库中【转】

首先建立转换:从数据库表到日志 表输入的设置: 日志设置: 新建job: 转换选择刚才建好的输出日志转换.变量设置如下: 此ID就是转换中的${ID},执行job,可以看到控制台输出日志结果: 黑色字体部分中只写出了id=1的一条记录. 最后补充,将转换的日志写到数据库中:打开转换>ctrl+t>日志选项卡>转换>点击下面的SQL,执行SQL建表.执行完job会在数据库中写入日志记录.

如何借助log4j把日志写入数据库中

log4j是一个优秀的开源日志记录项目,我们不仅可以对输出的日志的格式自定义,还可以自己定义日志输出的目的地,比如:屏幕,文本文件,数据 库,甚至能通过socket输出.本节使用MySQL数据库主要讲述如何将日志信息输入到数据库中. 用log4j将日志写入数据库主要用到是log4j包下的JDBCAppender类,它提供了将日志信息异步写入数据的功能,我们可以直接使用这个类将我 们的日志信息写入数据库:也可以扩展JDBCAppender类,就是将JDBCAppender类作为基类进行二次开发获得

调用save()方法,页面显示保存成功,但是数据库中没有值的原因

在DAO层调用save()方法,页面上显示成功,但是在数据库中查找时发现数据没有保存到数据库中的原因可能是: 1.Service层中是否在调用DAO层中的save()方法之前添加注解@Transactional,凡是对数据库的更新操作都要加上该句注解. 2.查看项目中的WEB-INF文件夹下面的application.xml文件,看看<tx:annotation-driven transaction-manager="transactionManager"/>标签中是否缺少

Log4NET将日志写入数据库中

Apache log4net? Config Examples Overview This document presents example configurations for the built-in appenders. These configurations are designed to work with thelog4net.Config.DOMConfigurator and the log4net.Repository.Hierarchy.Hierarchy. These

关于使用Log4Net将日志插入oracle数据库中

1.关于配置文件. <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="System.Configuration.IgnoreSectionHandler" /> </configSections> <log4

Java中将图片保存到数据库中

在实际的开发中,我们可能需要将图片.影音等文件直接保存到数据库中,然后通过编程方式将数据读出进行使用.例如将读出的图片数据显示出来,将读出的电影文件播放出来. 二进制数据直接保存到文件和从文件中读出非常的简单.和普通的数据库操作差别不大.只是用到部分流操作.例如各种输入输出流操作.所以深刻理解流操是非常重要的. 在此我借助于一个JSP的简单实例进行讲解.此实例保存职员数据,其中职员数据包含一个图片列.此列保存每名员工的照片.在此将照片直接保存到数据库中.首先建立职员信息表EmployeeInfo

[原创]Java调用PageOffice在线打开数据库中保存的Word文件

PageOffice产品和数据库是两个独立的概念,严格来说两者之间没有任何本质关系.PageOffice不依赖数据库而存在,但是数据库和PageOffice可以结合使用来完成某些复杂的业务逻辑.例如:PageOffice可以打开数据库中的二进制流文件,也可以将Word或者Excel整个文档或者文档中的一部分数据保存到数据库中,这里的数据库可以是任意数据库,如:Sqlite,Access,SQL Server,Oracle,MySQL,DB2,Sybase等.下面我们就此问题展开详细论述. 1)打