关于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 = ;
try
{
int b = / 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
用起来也挺方便的
感谢你的阅读,希望对你有帮助,欢迎关注作者的个人主页 www.bamn.cn 希望博客园允许打一点点广告....
 

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

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

    假设有这样一个枚举: /// <summary> /// 字典项类型 /// </summary> public enum DicItemType { [EnumDescrip ...

  2. log4net:保存日志到数据库

    1:下载log4net http://logging.apache.org/log4net/download_log4net.cgi 2:引用到项目 下载以后,在项目中引用log4net.dll 3: ...

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

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/hxpjava1/article/details/32714855 一.使用Log4Net将日志记录到 ...

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

    首先建立转换:从数据库表到日志 表输入的设置:   日志设置:   新建job:     转换选择刚才建好的输出日志转换.变量设置如下: 此ID就是转换中的${ID},执行job,可以看到控制台输出日 ...

  5. log4j输出日志到数据库中

    1.log4j配置 ###----------------- appender:DATABASE_LOG -----------------#指定输出日志的等级和日志输出范围log4j.logger. ...

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

    在DAO层调用save()方法,页面上显示成功,但是在数据库中查找时发现数据没有保存到数据库中的原因可能是: 1.Service层中是否在调用DAO层中的save()方法之前添加注解@Transact ...

  7. 怎样借助log4j把日志写入数据库中

            log4j是一个优秀的开源日志记录项目.我们不仅能够对输出的日志的格式自定义,还能够自定义日志输出的目的地,比方:屏幕.文本文件,数据 库,甚至能通过socket输出.本节使用MySQ ...

  8. Session保存到指定数据库中

    方法1:向数据库中添加session相关信息,可以使用官方工具 命令提示符cmd中执行: cd C:\Windows\Microsoft.NET\Framework\v4.0.30319       ...

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

    1.关于配置文件. <?xml version="1.0" encoding="utf-8" ?> <configuration> &l ...

随机推荐

  1. C++ 反射机制的简单实现

    C++并不支持反射机制,只能自己实现. 如果需要实现字字符串到函数到映射,一定要使用到函数指针. 简单实现反射机制,根据字符串来构造相应到类.主要有以下几点: (1) 可以使用map保存字符从到函数指 ...

  2. go语言之进阶篇关闭channel

    1.关闭channel package main import ( "fmt" ) func main() { ch := make(chan int) //创建一个无缓存chan ...

  3. go语言之进阶篇显式调用panic函数

    1.显式调用panic函数 示例: package main import "fmt" func testa() { fmt.Println("aaaaaaaaaaaaa ...

  4. 断开所有的SMB连接的批处理

    备用 @ECHO OFF ECHO ===Check how many SMB shares that already connected=== net use ECHO ===Disconnect ...

  5. fn:replace()函数

    fn:replace()函数将字符串中所有指定的子串用另外的字符串替换. 语法 fn:replace()函数的语法如下: ${fn:replace(<原始字符串>, <被替换的字符串 ...

  6. 左手坐标系和右手坐标系 ZZ

    今天记录一下一些基本的数学知识,左手坐标系和右手坐标系.这些对于搞图像开发或者游戏开发的朋友来说,应该是很基础的东西,不过对于大部分人来说还是比较陌生的知识.之所以看这方面资料主要是因为在使用Andr ...

  7. 通过经纬度坐标计算距离的方法(经纬度距离计算)ZZ

    通过经纬度坐标计算距离的方法(经纬度距离计算) 最近在网上搜索“通过经纬度坐标计算距离的方法”,发现网上大部分都是如下的代码: #define PI 3.14159265 static double ...

  8. 大数据开发实战:Storm流计算开发

    Storm是一个分布式.高容错.高可靠性的实时计算系统,它对于实时计算的意义相当于Hadoop对于批处理的意义.Hadoop提供了Map和Reduce原语.同样,Storm也对数据的实时处理提供了简单 ...

  9. 【转载】.NET/C#-uploadify视频文件or大文件上传

    引言 之前使用Uploadify做了一个上传图片并预览的功能,今天在项目中,要使用该插件上传大文件.之前弄过上传图片的demo,就使用该demo进行测试.可以查看我的这篇文章: [Asp.net]Up ...

  10. Spark Structured Streaming:将数据落地按照数据字段进行分区方案

    方案一(使用ForeachWriter Sink方式): val query = wordCounts.writeStream.trigger(ProcessingTime(5.seconds)) . ...