• 基于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

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

  • 相关阅读:
    定时器中断彩灯控制程序
    单片机C51 8位流水灯
    十进制转换2-9进制转换
    加减乘除+菜单实现
    文件 I/O缓冲流
    文件 I/O字符流
    spring配置c3p0连接池
    javax.swing.Timer的与Lambda的使用
    代码简化之道--接口之从传统实现到Lambda表达式实现
    Java核心技术第六章--内部类
  • 原文地址:https://www.cnblogs.com/xyb0226/p/11115884.html
Copyright © 2020-2023  润新知