TinyFrame升级之六:全局日志的设计及实现
日志记录显然是框架设计中不可或缺的元素,在本框架中,我们将使用log4net作为日志记录的主体。下面来具体说明如何让框架继承log4net,并通过Autofac进行IOC注入。
首先,定义好我们的Log日志操作接口:
1: public interface ILoggerService
2: {
3: void Info(string message);
4: void Warn(string message);
5: void Debug(string message);
6: void Error(string message);
7: void Error(Exception ex);
8: void Fatal(string message);
9: void Fatal(Exception ex);
10: }
具体的解释我就不用说了,其中Info代表正常日志,Warn代表告警日志,Debug代表调试日志,Error代表错误日志,Fatal代表系统崩溃日志。
下面是其实现部分:
1: public class LoggerService:ILoggerService
2: {
3: public LoggerService()
4: {
5: log4net.Config.XmlConfigurator.Configure();
6: logger = LogManager.GetLogger(typeof(LoggerService));
7: }
8:
9: private readonly ILog logger;
10:
11: public void Info(string message)
12: {
13: logger.Info(message);
14: }
15: public void Warn(string message)
16: {
17: logger.Warn(message);
18: }
19: public void Debug(string message)
20: {
21: logger.Debug(message);
22: }
23: public void Error(string message)
24: {
25: logger.Error(message);
26: }
27: public void Error(Exception ex)
28: {
29: logger.Error(ex.Message, ex);
30: }
31: public void Fatal(string message)
32: {
33: logger.Fatal(message);
34: }
35: public void Fatal(Exception ex)
36: {
37: logger.Fatal(ex.Message, ex);
38: }
39: }
我在构造中对log4net进行了配置,同时获取了log4net的日志记录对象。我们的配置需要写到用户接口中的web.config文件中:
1: <configSections>
2: <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
3: </configSections>
4:
5: <log4net>
6: <root>
7: <level value="DEBUG"/>
8: <appender-ref ref="LogFileAppender"/>
9: </root>
10: <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
11: <param name="File" value="C:\log.txt"/>
12: <param name="AppendToFile" value="true"/>
13: <rollingStyle value="Size"/>
14: <maxSizeRollBackups value="10"/>
15: <maximumFileSize value="10MB"/>
16: <staticLogFileName value="true"/>
17: <layout type="log4net.Layout.PatternLayout">
18: <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n"/>
19: </layout>
20: </appender>
21: </log4net>
之后在Aufofac中注入一下:
builder.RegisterType<LoggerService>().As<ILoggerService>().InstancePerHttpRequest();
最后,在页面中,我们可以通过构造函数获取其实例:
1: public BookService(IUnitOfWork unitOfWork
2: , IBook bookRepository
3: , IBookType bookTypeRepository
4: , IBookPlace bookPlaceRepository
5: , ICacheManager cacheManager
6: , ILoggerService logger
7: )
8: {
9: this.unitOfWork = unitOfWork;
10: this.bookRepository = bookRepository;
11: this.bookTypeRepository = bookTypeRepository;
12: this.bookPlaceRepository = bookPlaceRepository;
13: this.cacheManager = cacheManager;
14: this.logger = logger;
15: }
16:
17: private readonly IUnitOfWork unitOfWork;
18: private readonly IBook bookRepository;
19: private readonly IBookType bookTypeRepository;
20: private readonly IBookPlace bookPlaceRepository;
21: private readonly ICacheManager cacheManager;
22: private readonly ILoggerService logger;
得到的日志结果如下:

TinyFrame升级之六:全局日志的设计及实现的更多相关文章
- 学习ASP.NET Core(10)-全局日志与xUnit系统测试
上一篇我们介绍了数据塑形,HATEOAS和内容协商,并在制器方法中完成了对应功能的添加:本章我们将介绍日志和测试相关的概念,并添加对应的功能 一.全局日志 在第一章介绍项目结构时,有提到.NET Co ...
- SpringBoot全局日志管理(AOP)
1.在pom.xml中引入aop的jar包 <dependency> <groupId>org.springframework.boot</groupId> < ...
- C#日志记录设计与实现(BenXHLog)
C#日志记录设计与实现 日志记录: 日志记录在程序设计开发过程中,是非常重要的,可以供调试和记录数据,虽然说有开源的强大日志管理系统,比如apache的Log4Net,功能可谓强悍,但是有时候,不需要 ...
- 分布式全局ID生成器设计
项目是分布式的架构,需要设计一款分布式全局ID,参照了多种方案,博主最后基于snowflake的算法设计了一款自用ID生成器.具有以下优势: 保证分布式场景下生成的ID是全局唯一的 生成的全局ID整体 ...
- 升级优化关于日志生成logging封装TimedRotatingFileHandler
1.变更升级:优化日志自定义输出到文件的level,以及文件夹生成用户自由控制 # coding=utf-8 import logging import time import os import l ...
- ERP设计之系统基础管理(BS)-日志模块设计(转载)
原文地址:8.ERP设计之系统基础管理(BS)-日志模块设计作者:ShareERP 日志模块基本要素包括: 用户会话.登录.注销.模块加载/卸载.数据操作(增/删/改/审/弃/关等等).数据恢复.日志 ...
- 个人博客开发之blog-api 项目全局日志拦截记录
前言 大型完善项目中肯定是需要一个全局日志拦截,记录每次接口访问相关信息,包括: 访问ip,访问设备,请求参数,响应结果,响应时间,开始请求时间,访问接口描述,访问的用户,接口地址,请求类型,便于项目 ...
- vue 源码详解(一):原型对象和全局 `API`的设计
vue 源码详解(一):原型对象和全局 API的设计 1. 从 new Vue() 开始 我们在实际的项目中使用 Vue 的时候 , 一般都是在 main.js 中通过 new Vue({el : ' ...
- TinyFrame升级之五:全局缓存的设计及实现
在任何框架中,缓存都是不可或缺的一部分,本框架亦然.在这个框架中,我们的缓存分为两部分:内存缓存和单次请求缓存.简单说来,就是一个使用微软提供的MemoryCache做扩展,并提供全局唯一实例:另一个 ...
随机推荐
- 基于微软平台IIS/ASP.NET开发的大型网站有哪些呢?
首先说明一下,本文绝不是要说Microsoft平台多么好,多么牛.只是要提醒一些LAMP/JAVA平台下的同志们,微软平台不至于像你们说的,和想象的那么不堪!只是你们自己不知道而已.同时,也希望广大M ...
- 你知道哪些linux命令,能把文件上传到远程linux服务器
多数情况下 企业的服务基本都是部署在linux服务器 那对于测试同学,必须掌握基本的linux命令 至少要知道怎么部署整体环境 部署过程中,经常需要的操作,是向服务器上传部署包 你一般都是 ...
- dynamic-load-apk插件原理整理
因为当前项目功能越来越多,编译速度越来越慢(公司电脑配置也挺差的...),并且方法数已超出65535的限制了,虽然通过multidex暂时解决了,但是这并不是一个好的解决方式.所以通过插件来加快编译速 ...
- linux 拨号+squid监控脚本
客户端 #!/bin/bash #get_memory-info a=`free -m|grep Mem|awk '{print$2}'` #total-memory b=`free -m|grep ...
- Java设计模式学习笔记(观察者模式)
观察者模式说起来很简单,就是一个订报纸的模式.但是实际上这部分我觉得还是很有意思的,<Head First设计模式>里还有一些还没看完,也是因为理解的不够深吧. 观察者模式会包含两个组件: ...
- JUnit4生命周期
- IE下innerText与FoxFire下textContent属性的不同
<div> 我是中国 人 我<br/>爱 自己 的<div>祖国</div>. <div> IE下输出 我是中国 人 我 爱 自己 的 祖国 ...
- Linux信号
信号本质上就是一个软件中断,它既可以作为两个进程间的通信的方式, 更重要的是, 信号可以终止一个正常程序的执行, 通常被用于处理意外情况 ,* 信号是异步的, 也就是进程并不知道信号何时会到达 $ki ...
- C 运算符优先级
优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 () 圆括号 (表达式)/函数名(形参表) . 成员选择(对象) 对象.成员名 -& ...
- 使用jlink直接烧norflash或者nandflash不借助uboot的猜想
由于喜欢折腾,我是在linux下使用jlink的,既然JLinkExe可以进行内存读写操作,loadbin等操作,并且通过指定命令文件支持批量指令输入,那么首先jlink是可以直接访问内部存储器的,包 ...