前言

Common.LoggingCommons-Logging(apache最早提供的日志门面接口,提供了简单的日志实现以及日志解耦功能) 项目的.net版本。其目的是为 "所有的.net日志实现"提供一个统一的接口,在系统的迭代过程中,可灵活的切换不同的日志实现组件(Log4Net、NLog、EntLib等)。

原理

Common.Logging.LogManager类 作为操作日志实例的主接口,提供了3个对外的方法来获取日志实例

上图所示的Adapter是日志实例工厂类,是从配置文件中获取并创建的

Web.config中的配置, factoryAdapter 节点类型为Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter,该类就是日志实例工厂类的实现。
![
common.logging配置](http://qiniu.youleqp.cn/common.logging%E9%85%8D%E7%BD%AE.png)

如何集成至项目

Common.logging结合Log4Net如何集成至项目中实现日志管理?

选择安装的版本

查看Log4Net的官方版本发布记录发现,从1.2.11版本开始支持的.NET 3.5 和 .NET 4.0, 从2.0.6版本(17年5月)开始支持.NET Core 和 .NET Standard 1.3。那么我们选择的Log4Net版本,至少得是1.2.11版本。 而适配Common.Logging的Log4Net插件版本也有很多(主要是不同版本的Log4Net进行适配),我选择的是Common.Logging.Log4Net1211.

在项目中最好是使用Nuget安装包,会自动关联其Log4Net的版本

先安装 Common.Logging

Install-Package Common.Logging -Version 3.3.1

再安装Common.Logging.Log4Net1211

Install-Package Common.Logging.Log4Net1211 -Version 3.3.1

web.config的配置

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="common">
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
</sectionGroup>
</configSections>
<common>
<!--[DEBUG < INFO < WARN < ERROR < FATAL]-->
<logging>
<factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net1211">
<!--表示log4net的配置直接写在配置文件里-->
<!--<arg key="configType" value="INLINE"/>-->
<!--log4net使用独立的配置文件-->
<arg key="configType" value="FILE-WATCH" />
<arg key="configFile" value="~/XmlConfig/log4net.config" />
</factoryAdapter>
</logging>
</common>
</configuration>

log4net的配置

<?xml version="1.0" encoding="utf-8"?>

<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<!--目录路径,可以是相对路径或绝对路径-->
<file value="Log/" />
<!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
<datePattern value='yyyy-MM-dd/"info.log"' />
<!--追加到文件-->
<appendToFile value="true" />
<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
<rollingStyle value="Composite" />
<!--写到一个文件-->
<staticLogFileName value="false" />
<!--单个文件大小。单位:KB|MB|GB-->
<maximumFileSize value="200MB" />
<!--最多保留的文件数,设为"-1"则不限-->
<maxSizeRollBackups value="-1" />
<!--日志格式-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
</layout>
</appender> <appender name="TraceRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<!--目录路径,可以是相对路径或绝对路径-->
<file value="Log/" />
<!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
<datePattern value='yyyy-MM-dd/"trace.log"' />
<!--追加到文件-->
<appendToFile value="true" />
<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
<rollingStyle value="Composite" />
<!--写到一个文件-->
<staticLogFileName value="false" />
<!--单个文件大小。单位:KB|MB|GB-->
<maximumFileSize value="200MB" />
<!--最多保留的文件数,设为"-1"则不限-->
<maxSizeRollBackups value="-1" />
<!--日志格式-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
</layout>
</appender> <appender name="WarnRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<!--目录路径,可以是相对路径或绝对路径-->
<file value="Log/" />
<!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
<datePattern value='yyyy-MM-dd/"warn.log"' />
<!--追加到文件-->
<appendToFile value="true" />
<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
<rollingStyle value="Composite" />
<!--写到一个文件-->
<staticLogFileName value="false" />
<!--单个文件大小。单位:KB|MB|GB-->
<maximumFileSize value="200MB" />
<!--最多保留的文件数,设为"-1"则不限-->
<maxSizeRollBackups value="-1" />
<!--日志格式-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
</layout>
</appender> <appender name="ErrorRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<!--目录路径,可以是相对路径或绝对路径-->
<file value="Log/" />
<!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
<datePattern value='yyyy-MM-dd/"error.log"' />
<!--追加到文件-->
<appendToFile value="true" />
<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
<rollingStyle value="Composite" />
<!--写到一个文件-->
<staticLogFileName value="false" />
<!--单个文件大小。单位:KB|MB|GB-->
<maximumFileSize value="200MB" />
<!--最多保留的文件数,设为"-1"则不限-->
<maxSizeRollBackups value="-1" />
<!--日志格式-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
</layout>
</appender> <root>
<appender-ref ref="RollingFileAppender" />
<!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF
比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录
如果没有定义LEVEL的值,则缺省为DEBUG-->
<level value="INFO" />
</root> <!--TraceLog 名称固定,写入调试跟踪日志-->
<logger name="TraceLog" additivity="false">
<appender-ref ref="TraceRollingFileAppender" />
<level value="INFO" />
</logger>
<!--Warnlog 名称固定,写入警告日志-->
<logger name="WarnLog" additivity="false">
<appender-ref ref="WarnRollingFileAppender" />
<level value="WARN" />
</logger>
<!--Errorlog 名称固定,写入异常错误日志-->
<logger name="ErrorLog" additivity="false">
<appender-ref ref="ErrorRollingFileAppender" />
<level value="ERROR" />
</logger> </log4net>

更多参数配置说明,请移步Log4Net官网

应用案例

在实际的项目中,我们还封装了LogHelper类用来获取定义好的日志实例(ErrorLog、WarnLog、TraceLog),具体使用如下:

LogHelper.Trace("log222");
LogHelper.Warn("log222");
LogHelper.Error(new Exception('出错了'));

有关LogHelper的源代码,以及测试demo,我已整理放至github上https://github.com/yinboxie/BlogExampleDemo

参考

1、使用Common.Logging+log4net规范日志管理

2、Common.Logging源码解析

3、Log4net配置与使用简要说明

4、非常完善的Log4net详细说明

基于Common.Logging + Log4Net实现的日志管理的更多相关文章

  1. 使用Common.Logging+log4net规范日志管理【转载】

    使用Common.Logging+log4net规范日志管理   Common.Logging+(log4net/NLog/) common logging是一个通用日志接口,log4net是一个强大 ...

  2. 使用Common.Logging+log4net规范日志管理

    Common.Logging+(log4net/NLog/) common logging是一个通用日志接口,log4net是一个强大的具体实现,也可以用其它不同的实现,如EntLib的日志.NLog ...

  3. Common.Logging log4net Common.Logging.Log4Net 配置

    1.log4net 单独配置 log4net支持多种格式的日志输出,我这里只配置输出到本地的txt文件这种格式. <log4net> <root> <appender-r ...

  4. 基于docker部署使用ELK+FileBeat日志管理平台

    Docker从狭义上来讲就是一个进程,从广义上来讲是一个虚拟容器,专业叫法为 Application Container(应用容器).Docker进程和普通的进程没有任何区别,它就是一个普通的应用进程 ...

  5. 使用Common.Logging与log4net的组件版本兼容问题

    引用:  http://www.cnblogs.com/shijun/p/3713830.html 近期使用了Common.Logging的ILog接口做日志接口,同时利用其log4net适配器与lo ...

  6. Common.Logging.dll----------配置方式,可选引用,用于日志输出

    1.简介common logging是一个通用日志接口,log4net是一个具体实现. common logging可以把输出连接到其他非log类上, 如EntLib的日志.NLog等 2.使用接下来 ...

  7. 在C#应用中使用Common Logging日志接口

    我在C#应用中一般使用log4net来记录日志,但如果项目中有个多个工程,那么没有工程都需要引用log4neg,感觉很不爽.不过今日在开spring.net的时候,看到了有个通用日志接口Common ...

  8. Log4net 写文件日志与数据库日志

    一.数据库日志表结构 CREATE TABLE [dbo].[WebLog_Msg]( [LogID] [int] IDENTITY(1,1) NOT NULL, [Date] [datetime]  ...

  9. Common.Logging源码解析二

    Common.Logging源码解析一分析了LogManager主入口的整个逻辑,其中第二步生成日志实例工厂类接口分析的很模糊,本随笔将会详细讲解整个日志实例工厂类接口的生成过程! (1).关于如何生 ...

随机推荐

  1. [UWP]在应用开发中安全使用文件资源

    原文:[UWP]在应用开发中安全使用文件资源 在WPF或者UWP应用开发中,有时候会不可避免的需要操作文件系统(创建文件/目录),这时候有几个坑是需要大家注意下的. 创建文件或目录时的非法字符检测 在 ...

  2. java学习笔记(8)——多线程

    进程:是一个程序在其自身的地址空间的一次执行活动. 线程:(区别于进程)线程没有独立的存储空间. 几个概念:时间片 线程  进程   能不能够用多进程代替多线程呢? 两个进程切换时要交换内存空间,而多 ...

  3. Windows下静态编译Qt4

    既然是静态编译,那就要编译出来的程序不信赖于任何dll文件.首先下载qt-win-opensource-4.7.4-mingw.exe: http://get.qt.nokia.com/qt/sour ...

  4. python3给图片添加水印

    #!/usr/local/bin/python3 #coding=gbk import os, io, sys, re, time, json, random from PIL import Imag ...

  5. Symfony——如何使用Assetic实现资源管理

    1. 安装和启用 从Symfony 2.8开始,Assetic不再包含在Symfony Standard Edition中.在使用其任何功能之前,请在您的项目中安装执行此控制台命令的 AsseticB ...

  6. 通通WPF随笔(3)——艺术二维码素材生成器

    原文:通通WPF随笔(3)--艺术二维码素材生成器 最近公司让我开发一个条形码的生成控件,花了半天时间搞定觉得不过瘾,什么年代了该用二维码了吧.于是wiki了一下二维码的资料. 比较常见的就是QR码( ...

  7. Win10 如何以管理员身份设置开机自启程序(1)

    原文:Win10 如何以管理员身份设置开机自启程序(1) 最近一个项目在win10上部署时遇到问题,即如何设置以管理员身份开机自启.现把解决方法整理如下: 首先,为了进行验证,我编了一个简单的程序te ...

  8. 简单说说Delphi中线程的释放

    线程的释放方式有两种:一种是线程在运行完成后自动释放,一种是手动释放. 无论是那种释放,都应该在线程停止后进行释放. 然而线程的停止也有两种情况:一种是不需要设置标志位,直接完成:一种是由于execu ...

  9. css3 hover平滑过渡效果,鼠标经过元素,背景渐隐渐现效果

    下面实例,演示,鼠标经过时,改变div宽度,平滑改变,带动画 div { width:100px; height:100px; background:blue; transition:width 2s ...

  10. Win10版《芒果TV》全平台直播第89届奥斯卡颁奖典礼,特设第二演播室带来一手资讯

    芒果TV为所有中国影迷们带来的:今年的奥斯卡直播与往年格外不同,为了让网友们观看这场盛典得到多维度体验,不管是来看热闹的还是看门道的都看得开心尽兴,芒果TV特设第二演播室,为大家带来第一手新鲜热辣的现 ...