接上文 项目架构开发:数据访问层之Cache

本章我们继续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);
}
}

查看数据库记录

自此日志功能完成了,比较简单

项目架构开发系列

项目架构开发:数据访问层之Logger的更多相关文章

  1. 企业级应用架构(三)三层架构之数据访问层的改进以及测试DOM的发布

    在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.n ...

  2. 项目架构开发:数据访问层之Cache

    数据访问层简单介绍 数据访问层,提供整个项目的数据访问与持久化功能.在分层系统中所有有关数据访问.检索.持久化的任务,最终都将在这一层完成. 来看一个比较经典的数据访问层结构图 大概可以看出如下信息 ...

  3. 项目架构开发:数据访问层之Repository

    接上文 项目架构开发:数据访问层之Logger 本章我们继续IRepository开发,这个仓储与领域模式里边的仓储有区别,更像一个工具类,也就是有些园友说的“伪仓储”, 这个仓储只实现单表的CURD ...

  4. 项目架构开发:数据访问层之UnitOfWork

    接上文 项目架构开发:数据访问层之IQuery 本章我们继续IUnitOfWork的开发,从之前的IRepository接口中就可以看出,我们并没有处理单元事务, 数据CUD每次都是立即执行的,这样有 ...

  5. 项目架构开发:数据访问层之Query

    接上文 项目架构开发:数据访问层之Repository 上一章我们讲了IRepository接口,这张我们来讲IQuery 根据字面意思就可以知道,这次主要讲数据查询,上一章我们只针对单表做了查询的操 ...

  6. 随机获得MySQL数据库中100条数据方法 驾照题库项目 MVC架构 biz业务层的实现类 根据考试类型rand或order通过dao数据访问层接口得到数据库中100或全部数据

    package com.swift.jztk.biz; import java.util.Collections; import java.util.Comparator; import java.u ...

  7. 数据访问层之Repository

    数据访问层之Repository   接上文 项目架构开发:数据访问层之Logger 本章我们继续IRepository开发,这个仓储与领域模式里边的仓储有区别,更像一个工具类,也就是有些园友说的“伪 ...

  8. asp.net/wingtip/创建数据访问层

    一. 什么是数据访问层 在wingtip项目中,数据访问层是对以下三者的总称:1. product类等数据相关的实体类(class)2. 数据库(database),对实体类成员的存储3. 上述二者的 ...

  9. servlet层调用biz业务层出现浏览器 500错误,解决方法 dao数据访问层 数据库Util工具类都可能出错 通过新建一个测试类复制代码逐步测试查找出最终出错原因

    package com.swift.jztk.servlet; import java.io.IOException; import javax.servlet.ServletException; i ...

随机推荐

  1. instanceof typeof

    //清单 6. JavaScript instanceof 运算符代码 function instance_of(L, R) {//L 表示左表达式,R 表示右表达式 var O = R.protot ...

  2. 前端开发 Grunt 之 Connect详解

    在前端开发过程中,我们需要在开发过程中,将开发中的站点部署到服务器上,然后,在浏览器中查看实际的效果,在 Grunt 环境下,可以直接使用集成在 Grunt 中的 Connect 插件完成站点服务器的 ...

  3. fiddler 路由设置

    REGEX:^http://data.51buy.com/biz/oppmsmobile/web/js/app/(.+)/(.+).js E:\svns\new\dev\webapp\data_ics ...

  4. iOS 之 关闭键盘

    //方法一:关闭整个系统的键盘 [[[UIApplication sharedApplication] keyWindow] endEditing:YES]; //方法二:关闭当前页的键盘 [[sel ...

  5. permutation test

  6. noip2016天天爱跑步

    题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 个结点 ...

  7. docker的资源限制cpuset cpuquota memory

    总结 目前,公司7u已经不再使用lxc,转而使用libcontainer 即native docker对cpuquota的支持目前是有问题的,一般大家使用docker的时候,主要是对memory,cp ...

  8. javaweb入门实例---servlet例子

    1.编写servlet: TreeDataServlet.java package com.maggie.tree; import java.io.IOException; import javax. ...

  9. Java线程:条件变量、原子量、线程池等

    一.条件变量 条件变量实现了java.util.concurrent.locks.Condition接口,条件变量的实例化就是通过一个Lock对象上调用newCondition()方法获得的,这样条件 ...

  10. ejb ql 返回object

    String sqlStr="select t.car_kind,count(t) from table1 t where t.jb_date='"+jb_date+"' ...