接上文 项目架构开发:数据访问层之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. QStandardItemModel的简单应用

    The QStandardItemModel class provides a generic model for storing custom data. QStandardItemModel提供了 ...

  2. PHP图片处理之图片背景、画布操作

    像验证码或根据动态数据生成统计图标,以及前面介绍的一些GD库操作等都属于动态绘制图像.而在web开发中,也会经常去处理服务器中已存在的图片.例如,根据一些需求对图片进行缩放.加水印.裁剪.翻转和旋转等 ...

  3. PHP 绘图技术

    1.图片格式:目前网站开发常见的图片格式有gif,jpg/jpeg,png ..... 区别: gif 图片压缩率高,但是只能显示256色,可能造成颜色的丢失,可以显示动画 jpg/jpeg 图片压缩 ...

  4. origin中把多个拟合曲线放在一张图

    双击其中一个.或者New一个graph.这里直接双击其中一个图. 右键,找到layer contents. 可以看到,一个scatter配一个polynomial fit line.把剩下的B,C,D ...

  5. 使用IDEA开发及测试Spark的环境搭建及简单测试

    一.安装JDK(具体安装省略) 二.安装Scala(具体安装省略) 三.安装IDEA 1.打开后会看到如下,然后点击OK

  6. Spring mvc配置Json返回

    第一种 配置 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHand ...

  7. PHP扩展之多线程

    PHP一直以为不支持多线程,后面才知道有基于pThread的扩展包,地址如下: http://php.net/manual/zh/book.pthreads.php 我感兴趣的是以下几个点: 1.Th ...

  8. NodeJS Stream 四:Writable

    什么是可写流 可写流是对数据流向设备的抽象,用来消费上游流过来的数据,通过可写流程序可以把数据写入设备,常见的是本地磁盘文件或者 TCP.HTTP 等网络响应. 看一个之前用过的例子 process. ...

  9. macOS Sierra安装Apache2.4+PHP7.0+MySQL5.7.16

    Mac系统上虽然自带PHP和Apache,但是有时不是我们想要的版本呢.今天我们就在macOS Sierra(10.12.1)上安装比较新的版本的PHP版本,也就是PHP7.0+了.本篇博客我们安装的 ...

  10. <C++Primer>第四版 阅读笔记 第三部分 “类和数据抽象”

    类定义了数据成员和函数成员:数据成员用于存储与该类类型的对象相关联的状态:而函数成员则负责执行赋予数据意义的操作. 第12章 类 一个类可以包含若干公有的.私有的和受保护的部分:在public部分定义 ...