关于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 希望博客园允许打一点点广告....