项目架构开发:数据访问层之Logger

本章我们继续ILogger的开发
ILogger.cs
public interface ILogger
{
void Info(object message);
void Info(object message, Exception e);
void Debug(object message);
void Debug(object message, Exception e);
void Warn(object message);
void Warn(object message, Exception e);
void Error(object message);
void Error(object message, Exception e);
void Fatal(object message);
void Fatal(object message, Exception e);
}
日志服务的实现

这里我们引用的是log4net组件,我们来看看具体实现
LoggerBase.cs
public class LoggerBase : ILogger
{
private ILog logger; public LoggerBase()
{
logger = LogManager.GetLogger("log4netlogger");
} public void Info(object message)
{
logger.Info(message);
} public void Info(object message, Exception e)
{
logger.Info(message, e);
} public void Debug(object message)
{
logger.Debug(message);
} public void Debug(object message, Exception e)
{
logger.Debug(message, e);
} public void Warn(object message)
{
logger.Warn(message);
} public void Warn(object message, Exception e)
{
logger.Warn(message, e);
} public void Error(object message)
{
logger.Error(message);
} public void Error(object message, Exception e)
{
logger.Error(message, e);
} public void Fatal(object message)
{
logger.Fatal(message);
} public void Fatal(object message, Exception e)
{
logger.Fatal(message, e);
}
}
其实log4net可以直接在项目各层调用的,我们这里之所以还要创建一个接口,似乎有过度封装之嫌;
我这么做是有原因的,因为我不想只限于一种日志记录方式,如果以后还有其他组件,或者自己写日志组件
那都可以很方便的扩展了。
再看看log4net.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
</configSections>
<appSettings>
</appSettings>
<log4net> <!--定义日志的输出媒介,下面定义日志以五种方式输出。也可以下面的按照一种类型或其他类型输出。-->
<!--None,Fatal,ERROR,WARN,DEBUG,INFO,ALL-->
<root>
<level value="all"/> <!--文件形式记录日志-->
<!--<appender-ref ref="LogFileAppender" />--> <!--控制台控制显示日志-->
<!--<appender-ref ref="ConsoleAppender" />--> <!--启用Access数据库记录日志-->
<!--<appender-ref ref="AdoNetAppender_Access" />--> <!--SqlServer数据库记录日志-->
<!--<appender-ref ref="AdoNetAppenderSqlServer" />-->
</root> <logger name="log4netlogger">
<level value="all" />
<appender-ref ref="AdoNetAppenderSqlServer" />
</logger> <!--定义输出到数据库中,这里举例输出到SqlServer数据库中-->
<appender name="AdoNetAppenderSqlServer" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="Data Source=JIANRONGLAN-PC\SQLEXPRESS;Initial Catalog=SystemBase;User ID=sa;Password=123456" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="Fatal" />
</filter>
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender> </log4net>
</configuration>
基础设施层的实现

Logger.cs 代码跟上边的差不多,主要是要实现日志驱动的配置,或许有其他方法,但暂时这么写吧
public sealed class Logger
{
private readonly static ILogger loggerProvider; static Logger()
{
loggerProvider = ProviderHelper.GetLoggerProvider();
} public static void Info(object message)
{
loggerProvider.Info(message);
} public static void Info(object message, Exception e)
{
loggerProvider.Info(message, e);
} public static void Debug(object message)
{
loggerProvider.Debug(message);
} public static void Debug(object message, Exception e)
{
loggerProvider.Debug(message, e);
} public static void Warn(object message)
{
loggerProvider.Warn(message);
} public static void Warn(object message, Exception e)
{
loggerProvider.Warn(message, e);
} public static void Error(object message)
{
loggerProvider.Error(message);
} public static void Error(object message, Exception e)
{
loggerProvider.Error(message, e);
} public static void Fatal(object message)
{
loggerProvider.Fatal(message);
} public static void Fatal(object message, Exception e)
{
loggerProvider.Fatal(message, e);
}
}
我们新建测试看看效果

[TestClass]
public class LoggerTest
{
[TestMethod]
public void Info()
{
LjrFramework.Infrastructure.Logger.Info("sqlserver test message " + Guid.NewGuid().ToString()); Assert.AreEqual(true, true);
}
}

查看数据库记录

自此日志功能完成了,比较简单
项目架构开发系列
- 项目架构开发:数据访问层之Cache
- 项目架构开发:数据访问层之Logger
- 项目架构开发:数据访问层之Repository
- 项目架构开发:数据访问层之Query
- 项目架构开发:数据访问层之UnitOfWork
项目架构开发:数据访问层之Logger的更多相关文章
- 企业级应用架构(三)三层架构之数据访问层的改进以及测试DOM的发布
在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.n ...
- 项目架构开发:数据访问层之Cache
数据访问层简单介绍 数据访问层,提供整个项目的数据访问与持久化功能.在分层系统中所有有关数据访问.检索.持久化的任务,最终都将在这一层完成. 来看一个比较经典的数据访问层结构图 大概可以看出如下信息 ...
- 项目架构开发:数据访问层之Repository
接上文 项目架构开发:数据访问层之Logger 本章我们继续IRepository开发,这个仓储与领域模式里边的仓储有区别,更像一个工具类,也就是有些园友说的“伪仓储”, 这个仓储只实现单表的CURD ...
- 项目架构开发:数据访问层之UnitOfWork
接上文 项目架构开发:数据访问层之IQuery 本章我们继续IUnitOfWork的开发,从之前的IRepository接口中就可以看出,我们并没有处理单元事务, 数据CUD每次都是立即执行的,这样有 ...
- 项目架构开发:数据访问层之Query
接上文 项目架构开发:数据访问层之Repository 上一章我们讲了IRepository接口,这张我们来讲IQuery 根据字面意思就可以知道,这次主要讲数据查询,上一章我们只针对单表做了查询的操 ...
- 随机获得MySQL数据库中100条数据方法 驾照题库项目 MVC架构 biz业务层的实现类 根据考试类型rand或order通过dao数据访问层接口得到数据库中100或全部数据
package com.swift.jztk.biz; import java.util.Collections; import java.util.Comparator; import java.u ...
- 数据访问层之Repository
数据访问层之Repository 接上文 项目架构开发:数据访问层之Logger 本章我们继续IRepository开发,这个仓储与领域模式里边的仓储有区别,更像一个工具类,也就是有些园友说的“伪 ...
- asp.net/wingtip/创建数据访问层
一. 什么是数据访问层 在wingtip项目中,数据访问层是对以下三者的总称:1. product类等数据相关的实体类(class)2. 数据库(database),对实体类成员的存储3. 上述二者的 ...
- servlet层调用biz业务层出现浏览器 500错误,解决方法 dao数据访问层 数据库Util工具类都可能出错 通过新建一个测试类复制代码逐步测试查找出最终出错原因
package com.swift.jztk.servlet; import java.io.IOException; import javax.servlet.ServletException; i ...
随机推荐
- NodeMCU之旅(三):响应配置按钮
引言 在之前的代码中,要连接的WIFI信息都已写死在代码里,这显然不能适应我们的需求.所以需要想个办法让用户可以配置这些信息. WIFI工作模式 NodeMCU支持STATION,SOFTAP,STA ...
- 2.14. 删除托管对象(Core Data 应用程序实践指南)
删除托管对象,只要调用托管对象上下文的deleteObject 或 deleteObjects就可以了.同样,真正的删除,要在调用save:之后.
- C# windows服务的创建与调试
Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的.所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Window ...
- redhat5安装phantomjs
Linux 64-bit Download phantomjs-2.1.1-linux-x86_64.tar.bz2 (22.3 MB) and extract the content. Note: ...
- js原生设计模式——10适配器模式之参数适配器
原理:参数适配器说白了就是给出要带入数据字段的对应字段的默认值,一旦数据字段值不足,就取默认值补足. [写法一]:直接返回 <!DOCTYPE html><html lang=&qu ...
- HDU-1232-畅通工程(并查集)
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1232考察并查集,(最小生成树)题目很简单用k记录树根的个数,k-1就是还需要建设的路 #include& ...
- redhat+11g+rac 安装数据库软件时只有一个节点可选
在安装数据库软件时,只能检测到一个节点 650) this.width=650;" title="捕获.JPG" src="http://s3.51cto.co ...
- Pomelo的监控模块
对服务器的监控和管理有三个主体:master,monitor,client:master负责收集所有服务器的信息,下发对服务器的操作指令.monitor负责上报服务器状态,并对master的命令作出反 ...
- Bootstrap 输入组
Bootstrap 输入组: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- jsp+servlet+javaBean+Dao
一.Servlet程序各模块介绍1.JSP 用于显示.收集数据的部分.2.Servlet 用于验证数据.实例化JavaBean.调用DAO连接数据库.控制页面跳转3.DAO 用于连接数据库及进行数据库 ...