0


Log4net详细教程

Log4net详细教程

一、Log4net概述

log4net 是从 java 下有卓越表现的 log4j 移植过来的,是一个能够将日志信息输出到各种 不同目标的.net 类库,主要作用是将程序调试和运行时的各种日志信息进行记录,通俗来讲log4net是一个帮助程序员将日志语句输出到各种输出目标的工具。log4net 包的设计使得日志语句可以保留在发布的代码中,而不会产生高性能成本。官网地址

log4net主要几个方法:

控制级别,由低到高: ALL | DEBUG | INFO | WARN | ERROR | FATAL | OFF,<level>标签下配置写入级别,写入配置级别以上日志。

日志类型如下
DEBUG:调试日志,开发完成后几乎不用,我一般都直接不写这个配置;
INFO:基本日志信息,最常用的;
WARN:警告日志信息,不常用;
ERROR:错误日志,异常日志信息,常用;
FATAL:致命错误日志信息,不常用;

二、配置教程

这篇博客适合Log4net小白,这里,你要清楚几个问题:log4net配置文件是什么结构?如何在程序代码上正确地调用配置文件?你要怎么配?你要实现什么样的逻辑功能?

此篇文章要实现的功能逻辑: 配置一个全局日志帮助类,能够给整个项目进行调用,其中,类方法这些,我写在功能模块上,其他项目通过引用生成好的公共模块dll文件正常调用日志帮助类里的静态方法。其中,我将配置上三种日志记录模式,以满足以后日志记录的功能需求:文件日志、控制台日志、数据库日志(我用Sql日志,它支持各种数据库)。

其中,我在文件日志再细分:默认文件日志、默认文件异常日志、管理员权限文件日志、管理员权限异常文件日志;
控制台日志再细分:默认控制台日志、控制台异常日志、有颜色的控制台日志、有颜色的控制台异常日志

1、配置文件详解

先直接贴我整个项目配好能用的源码如下:

<?xml version="1.0" encoding="utf-8" ?><configuration><configSections><sectionname="log4net"type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/></configSections><!--站点日志配置部分--><log4net><!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL --><!-- Set root logger level to ERROR and its appenders --><!--
        <root>:实际上就是一个根logger,所有其它logger都默认继承它
        支持子元素:
        appender-ref:0个或多个,要引用的appender的名字;
        level:最多一个。 只有在这个级别或之上的事件才会被记录;
        param:0个或多个, 设置一些参数;
        --><root><!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--><!--比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录--><!--如果没有定义LEVEL的值,则默认为DEBUG--><levelvalue="INFO"/></root><!--
        <logger>:
            支持的属性:
            name:必须的,logger的名称
            additivity:可选,取值是true或false,默认值是true。设置为false时将阻止父logger中的appender

            支持的子元素:
            appender-ref:0个或多个,要引用的appender的名字
            level:最多一个。 只有在这个级别或之上的事件才会被记录。
            param:0个或多个, 设置一些参数。
        --><!--只记录文件日志--><!--默认日志--><loggername="Default_File"additivity="false"><levelvalue="INFO"/><appender-refref="DefaultLogFileAppender_Info"/><appender-refref="DefaultLogFileAppender_Debug"/><appender-refref="DefaultLogFileAppender_Warn"/><appender-refref="DefaultLogFileAppender_Error"/><appender-refref="DefaultLogFileAppender_Fatal"/></logger><!--默认异常日志--><loggername="Default_Ex_File"additivity="false"><levelvalue="ERROR"/><appender-refref="DefaultLogFileAppender_Ex_Error"/><appender-refref="DefaultLogFileAppender_Ex_Fatal"/></logger><!--管理员权限日志--><loggername="Admin_File"additivity="false"><levelvalue="INFO"/><appender-refref="AdminLogFileAppender_Info"/><appender-refref="AdminLogFileAppender_Debug"/><appender-refref="AdminLogFileAppender_Warn"/><appender-refref="AdminLogFileAppender_Error"/><appender-refref="AdminLogFileAppender_Fatal"/></logger><!--管理员权限异常日志--><loggername="Admin_Ex_File"additivity="false"><levelvalue="ERROR"/><appender-refref="AdminLogFileAppender_Ex_Error"/><appender-refref="AdminLogFileAppender_Ex_Fatal"/></logger><!-- 控制台程序日志 --><loggername="ConsoleDefault"additivity="false"><levelvalue="INFO"/><appender-refref="ConsoleAppender"/></logger><loggername="ColoredConsoleDefault"additivity="false"><levelvalue="INFO"/><appender-refref="ColoredConsoleAppender"/></logger><!-- 控制台异常程序日志 --><loggername="ColoredConsoleDefault_Ex"additivity="false"><levelvalue="ERROR"/><appender-refref="ConsoleAppender_Ex"/></logger><loggername="ColoredConsoleDefault_Ex"additivity="false"><levelvalue="ERROR"/><appender-refref="ColoredConsoleAppender_Ex"/></logger><!-- SQL日志 --><loggername="DefaultLog_Sql"additivity="false"><levelvalue="INFO"/><appender-refref="AdoNetAppender"/></logger><!-- 将日志写到文件中 --><appendername="DefaultLogFileAppender_Info"type="log4net.Appender.RollingFileAppender"><!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--><lockingModeltype="log4net.Appender.FileAppender+MinimalLock"/><!-- 不自动生成空白文件 --><lockingModeltype="Common.Helper.MinimalLockDeleteEmpty"/><!--目录路径,可以是相对路径或绝对路径--><paramname="File"value="log\\Info\\"/><!--文件名,按日期生成文件夹--><paramname="DatePattern"value="/yyyy-MM/&quot;Info_&quot;MM-dd-HH&quot;.log&quot;"/><!--追加到文件--><appendToFilevalue="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStylevalue="Composite"/><preserveLogFileNameExtensionvalue="true"/><!--写到一个文件--><staticLogFileNamevalue="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSizevalue="5MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackupsvalue="20"/><!--日志格式--><layouttype="log4net.Layout.PatternLayout"><paramname="ConversionPattern"value="%n【%d】:%m%n"/></layout><!--限制只写信息日志--><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="INFO"/><paramname="LevelMax"value="INFO"/></filter></appender><appendername="DefaultLogFileAppender_Debug"type="log4net.Appender.RollingFileAppender"><!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--><lockingModeltype="log4net.Appender.FileAppender+MinimalLock"/><!--目录路径,可以是相对路径或绝对路径--><paramname="File"value="log\\Debug\\"/><!--文件名,按日期生成文件夹--><paramname="DatePattern"value="/yyyy-MM/&quot;Debug_&quot;MM-dd-HH&quot;.log&quot;"/><!--追加到文件--><appendToFilevalue="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStylevalue="Composite"/><preserveLogFileNameExtensionvalue="true"/><!--写到一个文件--><staticLogFileNamevalue="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSizevalue="5MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackupsvalue="20"/><!--日志格式--><layouttype="log4net.Layout.PatternLayout"><paramname="ConversionPattern"value="%n【%d】:%m%n"/></layout><!--限制只写信息日志--><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="DEBUG"/><paramname="LevelMax"value="DEBUG"/></filter></appender><appendername="DefaultLogFileAppender_Warn"type="log4net.Appender.RollingFileAppender"><!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--><lockingModeltype="log4net.Appender.FileAppender+MinimalLock"/><!-- 不自动生成空白文件 --><lockingModeltype="Common.Helper.MinimalLockDeleteEmpty"/><!--目录路径,可以是相对路径或绝对路径--><paramname="File"value="log\\Warn\\"/><!--文件名,按日期生成文件夹--><paramname="DatePattern"value="/yyyy-MM/&quot;Warn_&quot;MM-dd-HH&quot;.log&quot;"/><!--追加到文件--><appendToFilevalue="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStylevalue="Composite"/><preserveLogFileNameExtensionvalue="true"/><!--写到一个文件--><staticLogFileNamevalue="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSizevalue="5MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackupsvalue="20"/><!--日志格式--><layouttype="log4net.Layout.PatternLayout"><paramname="ConversionPattern"value="%n【%d】:%m%n"/></layout><!--限制只写信息日志--><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="WARN"/><paramname="LevelMax"value="WARN"/></filter></appender><appendername="DefaultLogFileAppender_Error"type="log4net.Appender.RollingFileAppender"><!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--><lockingModeltype="log4net.Appender.FileAppender+MinimalLock"/><!-- 不自动生成空白文件 --><lockingModeltype="Common.Helper.MinimalLockDeleteEmpty"/><!--目录路径,可以是相对路径或绝对路径--><paramname="File"value="log\\Error\\"/><!--文件名,按日期生成文件夹--><paramname="DatePattern"value="/yyyy-MM/&quot;Error_&quot;MM-dd-HH&quot;.log&quot;"/><!--追加到文件--><appendToFilevalue="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStylevalue="Composite"/><preserveLogFileNameExtensionvalue="true"/><!--写到一个文件--><staticLogFileNamevalue="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSizevalue="5MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackupsvalue="20"/><!--日志格式--><layouttype="log4net.Layout.PatternLayout"><paramname="ConversionPattern"value="%n【%d】:%m%n"/></layout><!--限制只写信息日志--><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="ERROR"/><paramname="LevelMax"value="ERROR"/></filter></appender><appendername="DefaultLogFileAppender_Fatal"type="log4net.Appender.RollingFileAppender"><!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--><lockingModeltype="log4net.Appender.FileAppender+MinimalLock"/><!-- 不自动生成空白文件 --><lockingModeltype="Common.Helper.MinimalLockDeleteEmpty"/><!--目录路径,可以是相对路径或绝对路径--><paramname="File"value="log\\Fatal\\"/><!--文件名,按日期生成文件夹--><paramname="DatePattern"value="/yyyy-MM/&quot;Fatal_&quot;MM-dd-HH&quot;.log&quot;"/><!--追加到文件--><appendToFilevalue="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStylevalue="Composite"/><preserveLogFileNameExtensionvalue="true"/><!--写到一个文件--><staticLogFileNamevalue="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSizevalue="5MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackupsvalue="20"/><!--日志格式--><layouttype="log4net.Layout.PatternLayout"><paramname="ConversionPattern"value="%n【%d】:%m%n"/></layout><!--限制只写信息日志--><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="FATAL"/><paramname="LevelMax"value="FATAL"/></filter></appender><appendername="DefaultLogFileAppender_Ex_Error"type="log4net.Appender.RollingFileAppender"><!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--><lockingModeltype="log4net.Appender.FileAppender+MinimalLock"/><!-- 不自动生成空白文件 --><lockingModeltype="Common.Helper.MinimalLockDeleteEmpty"/><!--目录路径,可以是相对路径或绝对路径--><paramname="File"value="log\\Error\\"/><!--文件名,按日期生成文件夹--><paramname="DatePattern"value="/yyyy-MM/&quot;Error_&quot;MM-dd-HH&quot;.log&quot;"/><!--追加到文件--><appendToFilevalue="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStylevalue="Composite"/><preserveLogFileNameExtensionvalue="true"/><!--写到一个文件--><staticLogFileNamevalue="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSizevalue="5MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackupsvalue="20"/><!--日志格式--><layouttype="log4net.Layout.PatternLayout"><paramname="ConversionPattern"value="%n【%d】:%m%n【异常信息】:%exception%n"/></layout><!--限制只写信息日志--><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="ERROR"/><paramname="LevelMax"value="ERROR"/></filter></appender><appendername="DefaultLogFileAppender_Ex_Fatal"type="log4net.Appender.RollingFileAppender"><!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--><lockingModeltype="log4net.Appender.FileAppender+MinimalLock"/><!-- 不自动生成空白文件 --><lockingModeltype="Common.Helper.MinimalLockDeleteEmpty"/><!--目录路径,可以是相对路径或绝对路径--><paramname="File"value="log\\Fatal\\"/><!--文件名,按日期生成文件夹--><paramname="DatePattern"value="/yyyy-MM/&quot;Fatal_&quot;MM-dd-HH&quot;.log&quot;"/><!--追加到文件--><appendToFilevalue="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStylevalue="Composite"/><preserveLogFileNameExtensionvalue="true"/><!--写到一个文件--><staticLogFileNamevalue="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSizevalue="5MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackupsvalue="20"/><!--日志格式--><layouttype="log4net.Layout.PatternLayout"><paramname="ConversionPattern"value="%n【%d】:%m%n【异常信息】:%exception%n"/></layout><!--限制只写信息日志--><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="FATAL"/><paramname="LevelMax"value="FATAL"/></filter></appender><!-- Admin_File管理员权限的日志 --><appendername="AdminLogFileAppender_Info"type="log4net.Appender.RollingFileAppender"><!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--><lockingModeltype="log4net.Appender.FileAppender+MinimalLock"/><!-- 不自动生成空白文件 --><lockingModeltype="Common.Helper.MinimalLockDeleteEmpty"/><!--目录路径,可以是相对路径或绝对路径--><paramname="File"value="log\\Info\\"/><!--文件名,按日期生成文件夹--><paramname="DatePattern"value="/yyyy-MM/&quot;Info_&quot;MM-dd-HH&quot;.log&quot;"/><!--追加到文件--><appendToFilevalue="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStylevalue="Composite"/><preserveLogFileNameExtensionvalue="true"/><!--写到一个文件--><staticLogFileNamevalue="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSizevalue="5MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackupsvalue="20"/><!--日志格式--><layouttype="log4net.Layout.PatternLayout"><paramname="ConversionPattern"value="%n【%d】:%m%n【源码信息】:%location%n"/></layout><!--限制只写信息日志--><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="INFO"/><paramname="LevelMax"value="INFO"/></filter></appender><appendername="AdminLogFileAppender_Debug"type="log4net.Appender.RollingFileAppender"><!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--><lockingModeltype="log4net.Appender.FileAppender+MinimalLock"/><!-- 不自动生成空白文件 --><lockingModeltype="Common.Helper.MinimalLockDeleteEmpty"/><!--目录路径,可以是相对路径或绝对路径--><paramname="File"value="log\\Debug\\"/><!--文件名,按日期生成文件夹--><paramname="DatePattern"value="/yyyy-MM/&quot;Debug_&quot;MM-dd-HH&quot;.log&quot;"/><!--追加到文件--><appendToFilevalue="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStylevalue="Composite"/><preserveLogFileNameExtensionvalue="true"/><!--写到一个文件--><staticLogFileNamevalue="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSizevalue="5MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackupsvalue="20"/><!--日志格式--><layouttype="log4net.Layout.PatternLayout"><paramname="ConversionPattern"value="%n【%d】:%m%n【源码信息】:%location%n"/></layout><!--限制只写信息日志--><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="DEBUG"/><paramname="LevelMax"value="DEBUG"/></filter></appender><appendername="AdminLogFileAppender_Warn"type="log4net.Appender.RollingFileAppender"><!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--><lockingModeltype="log4net.Appender.FileAppender+MinimalLock"/><!-- 不自动生成空白文件 --><lockingModeltype="Common.Helper.MinimalLockDeleteEmpty"/><!--目录路径,可以是相对路径或绝对路径--><paramname="File"value="log\\Warn\\"/><!--文件名,按日期生成文件夹--><paramname="DatePattern"value="/yyyy-MM/&quot;Warn_&quot;MM-dd-HH&quot;.log&quot;"/><!--追加到文件--><appendToFilevalue="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStylevalue="Composite"/><preserveLogFileNameExtensionvalue="true"/><!--写到一个文件--><staticLogFileNamevalue="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSizevalue="5MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackupsvalue="20"/><!--日志格式--><layouttype="log4net.Layout.PatternLayout"><paramname="ConversionPattern"value="%n【%d】:%m%n【源码信息】:%location%n"/></layout><!--限制只写信息日志--><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="WARN"/><paramname="LevelMax"value="WARN"/></filter></appender><appendername="AdminLogFileAppender_Error"type="log4net.Appender.RollingFileAppender"><!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--><lockingModeltype="log4net.Appender.FileAppender+MinimalLock"/><!-- 不自动生成空白文件 --><lockingModeltype="Common.Helper.MinimalLockDeleteEmpty"/><!--目录路径,可以是相对路径或绝对路径--><paramname="File"value="log\\Error\\"/><!--文件名,按日期生成文件夹--><paramname="DatePattern"value="/yyyy-MM/&quot;Error_&quot;MM-dd-HH&quot;.log&quot;"/><!--追加到文件--><appendToFilevalue="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStylevalue="Composite"/><preserveLogFileNameExtensionvalue="true"/><!--写到一个文件--><staticLogFileNamevalue="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSizevalue="5MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackupsvalue="20"/><!--日志格式--><layouttype="log4net.Layout.PatternLayout"><paramname="ConversionPattern"value="%n【%d】:%m%n【源码信息】:%location%n"/></layout><!--限制只写信息日志--><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="ERROR"/><paramname="LevelMax"value="ERROR"/></filter></appender><appendername="AdminLogFileAppender_Fatal"type="log4net.Appender.RollingFileAppender"><!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--><lockingModeltype="log4net.Appender.FileAppender+MinimalLock"/><!-- 不自动生成空白文件 --><lockingModeltype="Common.Helper.MinimalLockDeleteEmpty"/><!--目录路径,可以是相对路径或绝对路径--><paramname="File"value="log\\Fatal\\"/><!--文件名,按日期生成文件夹--><paramname="DatePattern"value="/yyyy-MM/&quot;Fatal_&quot;MM-dd-HH&quot;.log&quot;"/><!--追加到文件--><appendToFilevalue="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStylevalue="Composite"/><preserveLogFileNameExtensionvalue="true"/><!--写到一个文件--><staticLogFileNamevalue="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSizevalue="5MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackupsvalue="20"/><!--日志格式--><layouttype="log4net.Layout.PatternLayout"><paramname="ConversionPattern"value="%n【%d】:%m%n【源码信息】:%location%n"/></layout><!--限制只写信息日志--><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="FATAL"/><paramname="LevelMax"value="FATAL"/></filter></appender><!-- Admin_Ex_File管理员权限的异常日志 --><appendername="AdminLogFileAppender_Ex_Error"type="log4net.Appender.RollingFileAppender"><!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--><lockingModeltype="log4net.Appender.FileAppender+MinimalLock"/><!-- 不自动生成空白文件 --><lockingModeltype="Common.Helper.MinimalLockDeleteEmpty"/><!--目录路径,可以是相对路径或绝对路径--><paramname="File"value="log\\Error\\"/><!--文件名,按日期生成文件夹--><paramname="DatePattern"value="/yyyy-MM/&quot;Error_&quot;MM-dd-HH&quot;.log&quot;"/><!--追加到文件--><appendToFilevalue="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStylevalue="Composite"/><preserveLogFileNameExtensionvalue="true"/><!--写到一个文件--><staticLogFileNamevalue="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSizevalue="5MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackupsvalue="20"/><!--日志格式--><layouttype="log4net.Layout.PatternLayout"><paramname="ConversionPattern"value="%n【%d】:%m%n【源码信息】:%location%n【异常信息】:%exception%n"/></layout><!--限制只写信息日志--><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="ERROR"/><paramname="LevelMax"value="ERROR"/></filter></appender><appendername="AdminLogFileAppender_Ex_Fatal"type="log4net.Appender.RollingFileAppender"><!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--><lockingModeltype="log4net.Appender.FileAppender+MinimalLock"/><!-- 不自动生成空白文件 --><lockingModeltype="Common.Helper.MinimalLockDeleteEmpty"/><!--目录路径,可以是相对路径或绝对路径--><paramname="File"value="log\\Fatal\\"/><!--文件名,按日期生成文件夹--><paramname="DatePattern"value="/yyyy-MM/&quot;Fatal_&quot;MM-dd-HH&quot;.log&quot;"/><!--追加到文件--><appendToFilevalue="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStylevalue="Composite"/><preserveLogFileNameExtensionvalue="true"/><!--写到一个文件--><staticLogFileNamevalue="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSizevalue="5MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackupsvalue="20"/><!--日志格式--><layouttype="log4net.Layout.PatternLayout"><paramname="ConversionPattern"value="%n【%d】:%m%n【源码信息】:%location%n【异常信息】:%exception%n"/></layout><!--限制只写信息日志--><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="FATAL"/><paramname="LevelMax"value="FATAL"/></filter></appender><!-- 将日志输出到控制台 --><appendername="ConsoleAppender"type="log4net.Appender.ConsoleAppender"><layouttype="log4net.Layout.PatternLayout"><paramname="ConversionPattern"value="%n【[%5p][%d]】=> %m%n"/></layout><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="INFO"/><paramname="LevelMax"value="WARN"/></filter></appender><!-- 控制台异常日志 --><appendername="ConsoleAppender_Ex"type="log4net.Appender.ConsoleAppender"><layouttype="log4net.Layout.PatternLayout"><paramname="ConversionPattern"value="%n【[%5p][%d]】=> %m%n【异常信息】:%exception%n"/></layout><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="ERROR"/><paramname="LevelMax"value="FATAL"/></filter></appender><!-- 控制台颜色日志 --><appendername="ColoredConsoleAppender"type="log4net.Appender.ColoredConsoleAppender"><mapping><levelvalue="WARN"/><foreColorvalue="Yellow"/></mapping><layouttype="log4net.Layout.PatternLayout"><paramname="ConversionPattern"value="%n【[%5p][%d]】=> %m%n"/></layout><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="INFO"/><paramname="LevelMax"value="WARN"/></filter></appender><!-- 控制台颜色异常日志 --><appendername="ColoredConsoleAppender_Ex"type="log4net.Appender.ColoredConsoleAppender"><mapping><levelvalue="FATAL"/><foreColorvalue="White"/><backColorvalue="Red"/></mapping><mapping><levelvalue="ERROR"/><foreColorvalue="Red"/></mapping><layouttype="log4net.Layout.PatternLayout"><paramname="ConversionPattern"value="%n【[%5p][%d]】=> %m%n【异常信息】:%exception%n"/></layout><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="ERROR"/><paramname="LevelMax"value="FATAL"/></filter></appender><!-- 将日志写入到数据库 --><appendername="AdoNetAppender"type="log4net.Appender.AdoNetAppender"><!--BufferSize为缓冲区大小,只有日志记录达到设定值才会一块写入到数据库--><bufferSizevalue="1"/><!--postgresql需要的客户端控件--><connectionTypevalue="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/><connectionStringvalue="Data Source=.;Initial Catalog=DataCow;Integrated Security=True"/><commandTextvalue="insert into [UserLog]([LogKindID],[Operator],[LogContent]) values(@LogKindID,@Operator,@LogContent)"/><parameter><parameterNamevalue="@LogKindID"/><dbTypevalue="Int32"/><layouttype="Common.Helper.MyLayout"><conversionPatternvalue="%property{LogKindID}"/></layout></parameter><parameter><parameterNamevalue="@Operator"/><dbTypevalue="Int32"/><layouttype="Common.Helper.MyLayout"><conversionPatternvalue="%property{Operator}"/></layout></parameter><parameter><parameterNamevalue="@LogContent"/><dbTypevalue="String"/><!--长度不可以省略,否则不会输出--><sizevalue="2000000000"/><layouttype="Common.Helper.MyLayout"><conversionPatternvalue="%property{LogContent}"/></layout></parameter><filtertype="log4net.Filter.LevelRangeFilter"><paramname="LevelMin"value="INFO"/><paramname="LevelMax"value="INFO"/></filter></appender></log4net></configuration>

其中,你要知道几个重要的标签<log4net>、<root>、<logger>、<level>、<appender-ref>、<appender>:
其中配置几乎全写在<log4net>标签下;
<root>标签可以解读为全局配置;
<logger>可以理解为子类,继承<root>;
<appender-ref>是<appender>的关联桥梁,类似数据表的外键;
<appender>日志类型的详细配置在这里完成,最难配也是最复杂的一个标签;
上面标签具体什么应用,我配置文件上有写,并且可以看这篇大佬的博文
上面大佬博文也有配置参数(<layout>标签下的参数,仅支持此标签:%d、%m、%n、%location、%exception等)的使用,我就不写了,大家好好看那篇博文;

其中,我要讲的一些配置坑:
(1)数据库配置标签下的<parameter><dbType value=“String” />,这个数据类型,你要明白dbType数据类型、数据库数据类型与C#数据类型是怎么一一对应的(自己百度,或者直接看我参考的大佬的博文1,大佬的博文2)

(2)log4net日志框架每次都会生成很多配置的空白文件,为了不自动生成空白文件,我加了这个标签 <lockingModel type=“Common.Helper.MinimalLockDeleteEmpty”/>其中,Common.Helper.MinimalLockDeleteEmpty是我自己封装的log4net帮助类。

/// <summary>/// 避免生成空白文件/// </summary>publicclassMinimalLockDeleteEmpty:FileAppender.MinimalLock{publicoverridevoidReleaseLock(){base.ReleaseLock();var logFile =newFileInfo(CurrentAppender.File);if(logFile.Exists && logFile.Length <=0){
                logFile.Delete();}}}

(3)配数据库的不能乱改,要不会出很多问题,其中下面的不能乱配,要知道怎么配

<!--这个就别乱改了,我之前改了就写入不了--><connectionTypevalue="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/><!--这个就是常规的数据配置,不懂得,可以参考一下步骤:
1、用vs的工具,连接到数据库;
2、    点击数据名称,右下角会出现数据库的属性框;
3、选择“连接字符串”,复制值进行粘贴;
--><connectionStringvalue="Data Source=.;Initial Catalog=DataCow;Integrated Security=True"/>

2、程序配置文件

(1)配置日志调试文件: 配置过Log4net的同学都知道,内部的一些报错很难排查原因,所以,开发为了更加方便,我们一般要在开发前,将项目的配置文件配下,从而记录log4net的运行日志(记录在:Log4Net_Debug.txt文件)。我在Web.config文件下配置的,下面代码不是全部代码,直接将注释下的标签代码复制到自己项目的配置文件,千万不要直接复制粘贴,懂得都懂,代码如下:

<?xml version="1.0" encoding="utf-8"?><!--
  For more information on how to configure your ASP.NET application, please visit
  https://go.microsoft.com/fwlink/?LinkId=301880
  --><configuration><appSettings><!-- log4Net的运行Debug日志,log4net框架开发完毕可删除 --><addkey="log4net.Internal.Debug"value="true"/></appSettings><!-- log4Net的运行Debug日志,log4net框架开发完毕可删除 -->
    <<system.diagnostics><traceautoflush="true"><listeners><addname="textWriterTraceListener"type="System.Diagnostics.TextWriterTraceListener"initializeData="log\Debug\Log4Net_Debug.txt"/></listeners></trace></system.diagnostics></configuration>

(2)全局配置:在公共模块下的AssemblyInfo.cs类,加入下面代码:
在这里插入图片描述

//log4net框架配置/*
 * XmlConfiguratorAttribute
The log4net.Config.XmlConfiguratorAttribute Allows the XmlConfigurator to be configured using the following properties:

ConfigFile
If specified, this is the filename of the configuration file to use with the XmlConfigurator. This file path is relative to the application base directory (AppDomain.CurrentDomain.BaseDirectory).

This property cannot be used in conjunction with the ConfigFileExtension property.

ConfigFileExtension
If specified, this is the extension for the configuration file. The assembly file name is used as the base name with the this extension appended. For example if the assembly is loaded from the a file TestApp.exe and the ConfigFileExtension property is set to log4net then the configuration file name is TestApp.exe.log4net. This is equivalent to setting the ConfigFile property to TestApp.exe.log4net.

The path to the configuration file is build by using the application base directory (AppDomain.CurrentDomain.BaseDirectory), the assembly file name and the configuration file extension.

This property cannot be used in conjunction with the ConfigFile property.

Watch
If this flag is specified and set to true then the framework will watch the configuration file and will reload the config each time the file is modified.

If neither of the ConfigFile or ConfigFileExtension properties are specified, the application configuration file (e.g. TestApp.exe.config) will be used as the log4net configuration file.
 */[assembly:log4net.Config.XmlConfigurator(Watch =true, ConfigFile ="log4Net.config")]// 指定读取log4net 的配置文件

(3)log4Net.config文件放的位置: 这个文件不能乱放,一定要放对位置,当然,假如你直接将配置信息写到项目文件配置文件下,那就跟我的有点不一样了,我是独立出来的,这样比较好管理。这配置文件一定要放到项目启动项的下面,比如,webforme,mvc程序,直接放Web.config的同级目录,控制台程序,要放在 **.exe文件下面,一般在项目的Debug文件夹下。

3、日志帮助类的编写

经过以上,项目里应该差不多配置好了,接下来就要写日志帮助类了,这样才能正常调用并正常实现自己所需要的日志逻辑功能,下面我全部的日志帮助类代码:
帮助类:

usingCommon.Models;usinglog4net;usinglog4net.Appender;usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Linq;usingSystem.Reflection;usingSystem.Text;usingSystem.Threading.Tasks;namespaceCommon.Helper{/// <summary>/// 对应log4Net.config文件logger的name属性/// </summary>publicenumlog4NetConfigEnum{//文件日志
        Default_File=1,//默认文件日志
        Default_Ex_File,//默认文件异常日志
        Admin_File,//管理员权限文件日志
        Admin_Ex_File,//管理员权限异常文件日志//控制台日志
        ConsoleDefault,//默认控制台日志
        ConsoleDefault_Ex,//控制台异常日志
        ColoredConsoleDefault,//有颜色的控制台日志
        ColoredConsoleDefault_Ex,//有颜色的控制台异常日志//Sql日志
        DefaultLog_Sql                  //默认Sql数据库日志}/// <summary>/// 避免生成空白文件/// </summary>publicclassMinimalLockDeleteEmpty:FileAppender.MinimalLock{publicoverridevoidReleaseLock(){base.ReleaseLock();var logFile =newFileInfo(CurrentAppender.File);if(logFile.Exists && logFile.Length <=0){
                logFile.Delete();}}}publicabstractclassILogHelper<T>whereT:class{#region Log4NetpublicstaticILog iLog {get;set;}=GetLogConfig<T>();publicstaticvoidDebug(LogModel logModel){if(!iLog.IsDebugEnabled|| logModel==null)return;var ex = logModel.exception;var msg = logModel.LogContent;if(ex ==null){
                iLog.Debug(msg);}else{
                iLog.Debug(msg, ex);}}publicstaticvoidInfo(LogModel logModel){if(!iLog.IsInfoEnabled || logModel ==null)return;var ex = logModel.exception;var msg = logModel.LogContent;if(ex ==null){
                iLog.Info(msg);}else{
                iLog.Info(msg, ex);}}publicstaticvoidError(LogModel logModel){if(!iLog.IsErrorEnabled || logModel ==null)return;var ex = logModel.exception;var msg = logModel.LogContent;if(ex ==null){
                iLog.Error(msg);}else{
                iLog.Error(msg, ex);}}publicstaticvoidFatal(LogModel logModel){if(!iLog.IsFatalEnabled || logModel ==null)return;var ex = logModel.exception;var msg = logModel.LogContent;if(ex ==null){
                iLog.Fatal(msg);}else{
                iLog.Fatal(msg, ex);}}publicstaticvoidWarn(LogModel logModel){if(!iLog.IsWarnEnabled || logModel ==null)return;var ex = logModel.exception;var msg = logModel.LogContent;if(ex ==null){
                iLog.Warn(msg);}else{
                iLog.Warn(msg, ex);}}publicstaticILogGetLogConfig<T>(){var t =(T)Activator.CreateInstance(typeof(T));
            System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(t.GetType().TypeHandle);return iLog;}#endregion}#region 文件日志帮助类publicclassDefaultFileLogHelper:ILogHelper<DefaultFileLogHelper>{staticDefaultFileLogHelper(){
            ILogHelper<DefaultFileLogHelper>.iLog = LogManager.GetLogger(log4NetConfigEnum.Default_File.ToString());}}publicclassFileExceptionLogHelper:ILogHelper<FileExceptionLogHelper>{staticFileExceptionLogHelper(){
            ILogHelper<FileExceptionLogHelper>.iLog = LogManager.GetLogger(log4NetConfigEnum.Default_Ex_File.ToString());}}publicclassAdminFileLogHelper:ILogHelper<AdminFileLogHelper>{staticAdminFileLogHelper(){
            ILogHelper<AdminFileLogHelper>.iLog = LogManager.GetLogger(log4NetConfigEnum.Admin_File.ToString());}}publicclassAdminExceptionFileLogHelper:ILogHelper<AdminExceptionFileLogHelper>{staticAdminExceptionFileLogHelper(){
            ILogHelper<AdminExceptionFileLogHelper>.iLog = LogManager.GetLogger(log4NetConfigEnum.Admin_Ex_File.ToString());}}#endregion#region 数据库日志帮助类publicclassSqlLogHelper:log4net.Layout.PatternLayout{publicstaticILog iLog = LogManager.GetLogger(log4NetConfigEnum.DefaultLog_Sql.ToString());publicSqlLogHelper()=>newMyLayout();publicstaticBooleanInfo(LogModel logModel){if(!iLog.IsInfoEnabled || logModel ==null)returnfalse;

            System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(newSqlLogHelper().GetType().TypeHandle);
            iLog.Info(logModel);returntrue;}}publicclassMyLayout:log4net.Layout.PatternLayout{publicMyLayout(){this.AddConverter("property",typeof(PropertyPatternConverter));}}publicclassPropertyPatternConverter:log4net.Layout.Pattern.PatternLayoutConverter{protectedoverridevoidConvert(System.IO.TextWriter writer,log4net.Core.LoggingEvent loggingEvent){if(Option !=null){// Write the value for the specified keyWriteObject(writer, loggingEvent.Repository,LookupProperty(Option, loggingEvent));}else{// Write all the key value pairsWriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());}}/// <summary>/// 通过反射获取传入的日志对象的某个属性的值/// </summary>/// <param name="property"></param>/// <returns></returns>privateobjectLookupProperty(string property,log4net.Core.LoggingEvent loggingEvent){object propertyValue =string.Empty;PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);if(propertyInfo !=null)

                propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject,null);return propertyValue;}}#endregion#region 控制台日志帮助类publicclassConsoleLogHelper:ILogHelper<ConsoleLogHelper>{staticConsoleLogHelper(){
            ILogHelper<ConsoleLogHelper>.iLog = LogManager.GetLogger(log4NetConfigEnum.ConsoleDefault.ToString());}}publicclassConsoleExceptionLogHelper:ILogHelper<ConsoleExceptionLogHelper>{staticConsoleExceptionLogHelper(){
            ILogHelper<ConsoleExceptionLogHelper>.iLog = LogManager.GetLogger(log4NetConfigEnum.ConsoleDefault_Ex.ToString());}}publicclassColoredConsoleLogHelper:ILogHelper<ColoredConsoleLogHelper>{staticColoredConsoleLogHelper(){
            ILogHelper<ColoredConsoleLogHelper>.iLog = LogManager.GetLogger(log4NetConfigEnum.ColoredConsoleDefault.ToString());}}publicclassColoredConsoleExceptionLogHelper:ILogHelper<ColoredConsoleExceptionLogHelper>{staticColoredConsoleExceptionLogHelper(){
            ILogHelper<ColoredConsoleExceptionLogHelper>.iLog = LogManager.GetLogger(log4NetConfigEnum.ColoredConsoleDefault_Ex.ToString());}}#endregion}

Model类:

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceCommon.Models{publicclassLogModel{publiclong ID {get;set;}publicint LogKindID {get;set;}publicint Operator {get;set;}publicstring LogContent {get;set;}publicDateTime AddTime {get;set;}publicException exception {get;set;}=null;}}

代码疑点难点
(1)动态加载子类参数: 一般地,子类不能正常传参数给父类,并且最重要的是,上面帮助类用到的全是静态变量和方法,这个才是阻碍传参最麻烦的,这里就要用到相应的一个动态构造的方法,这样才能实现这个特殊功能,方法是在父类下,执行一个方法,并且让子类执行静态构造函数,给静态变量赋值。
(2)数据库的自定义字段配置: 绝大部分,写入数据库都要用到自定义字段,所以这个是必须要配的,不配的话就写入不了。
(3)配置文件下logger对应: LogManager.GetLogger(name),name是logger定义好的的name属性值。

通过上面步骤,已经全部配置好了,通过测试后,注释掉Web.config文件下的log4net日志配置就好。

标签: c# apache log4j

本文转载自: https://blog.csdn.net/weixin_44900027/article/details/128732197
版权归原作者 我不是店小二 所有, 如有侵权,请联系我们删除。

“Log4net详细教程”的评论:

还没有评论