接上文 项目架构开发:数据访问层之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. Angular - - ngIf、ngSwitch、ngHide/ngShow

    在组合这些ng指令写到一篇文章里的时候,基本是有规则的,野兽把功能相似相近的一类大多会组合到一起,方便理解和记忆. 这篇的三个指令也都是对DOM元素的操作,页面上显示/隐藏的判断,添加/移除的判断. ...

  2. C-Sharp网络编程案例解析(Socket类的使用)

    Server端: using System; using System.Collections.Generic; using System.Text; using System.Net; using ...

  3. 【续】强行在C# Winform中渲染Cocos2d-x 3.6

    [前言] 上一篇讲了怎么把Cocos2d-x 3.6渲染进MFC窗体,这里来讲一下怎么在C# Winform中做到同样的功能.如果你不熟悉MFC的使用但对C# Winform比较在行,请往下看. 这一 ...

  4. Spark算子总结及案例

    spark算子大致上可分三大类算子: 1.Value数据类型的Transformation算子,这种变换不触发提交作业,针对处理的数据项是Value型的数据. 2.Key-Value数据类型的Tran ...

  5. Linux文件权限与目录配置

    一.linux文件属性 用户组概念:假如主机有两个团体,第一个团体名为projecta,里面有class1,class2,class3:第二个团体名为projecb,里面有class4,class5, ...

  6. Nodejs.sublime-build 在sublime3中的配置

    { "cmd": ["node", "$file"], "file_regex": "^[ ]*File \& ...

  7. doubango地址配置

    转自:http://wiki.sip2sip.info/projects/sip2sip/wiki/SipDeviceConfiguration SIP Device Configuration Th ...

  8. 巧用css text-indent减小中文标点符号的占位大小

    由于设计需要,我们的页面中经常会有如下效果: 可是我们实现出来的效果确实这样的: 看起来两行文本没有对齐嘛,仔细检查后原来是[字符的原因,因为是中文标点符号占半个字的位置.不信?选中下汉字标点符号看一 ...

  9. Redis系列三(redis配置文件分析)

    在第一篇文章中有提到过redis.conf这个文件,这个文件就是redis-server的具体配置了.要使用好redis,一定要搞清楚redis的配置文件,这样才能最大的发挥redis的性能. # B ...

  10. A+B problem (High-precision)

    The "A+B problem" is very easy,but I failed for many times. The code: #include<iostream ...