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
用起來也挺方便的
感謝你的閱讀,希望對你有幫助,歡迎關注作者的個人主頁  www.bamn.cn 希望博客園允許打一點點廣告....
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM