基于Common.Logging + Log4Net实现的日志管理

前言#

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.
	
Common.Logging.Log4Net适配的版本

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

先安装 Common.Logging

Copy
Install-Package Common.Logging -Version 3.3.1

再安装Common.Logging.Log4Net1211

Copy
Install-Package Common.Logging.Log4Net1211 -Version 3.3.1

web.config的配置#

Copy
<?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的配置#

Copy
<?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),具体使用如下:

Copy
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详细说明

posted @   沉淀的风  阅读(1901)  评论(0编辑  收藏  举报
编辑推荐:
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
阅读排行:
· [翻译] 为什么 Tracebit 用 C# 开发
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
历史上的今天:
2018-07-01 ASP.NET MVC 异常Exception拦截
点击右上角即可分享
微信分享提示
CONTENTS