C#使用log4net输出日志到文件&控制台&PostgreSQL

项目环境

  • VS2017
  • log4net v2.0.3
  • PostgreSQL v3.0

引用log4net

右键项目,点击【管理NuGet程序包】,浏览中搜索【log4net】,下载安装即可。

注意:若要输出到PostgreSQL,需要使用v2.0.3版本。

我开始安装的v2.0.8,发现sql语句中无法解析参数,修改为低版本就好了。


添加配置文件

  • 右键项目,添加配置文件【log4net.config】;
  • 将配置文件的属性设置为【如果较新则复制】;
  • 在配置文件的【configuration】节点下添加配置信息:
  <!-- Level的级别,由高到低 -->
  <!-- None > Fatal > ERROR > WARN > DEBUG > INFO > ALL-->
  <!-- 解释:如果level是ERROR,则在cs文件里面调用log4net的info()方法,则不会写入到日志文件中-->
  <log4net>
    <!--错误日志类-->
    <logger name="error">
      <!--定义记录的日志级别-->
      <level value="ALL" />
      <!--输出到文件-->
      <appender-ref ref="ErrorAppender" />
      <!--输出到控制台-->
      <appender-ref ref="ColoredConsoleAppender"/>
      <!--输出到数据库-->
      <appender-ref ref="AdoNetAppender_PGSQL"/>
    </logger>
    <!--信息日志类-->
    <logger name="info">
      <level value="ALL" />
      <appender-ref ref="InfoAppender" />
      <appender-ref ref="ColoredConsoleAppender"/>
      <appender-ref ref="AdoNetAppender_PGSQL"/>
    </logger>
    <!--调试日志类-->
    <logger name="debug">
      <level value="ALL" />
      <appender-ref ref="DebugAppender" />
      <appender-ref ref="ColoredConsoleAppender"/>
      <appender-ref ref="AdoNetAppender_PGSQL"/>
    </logger>
    <!--错误日志附加介质:输出到文件-->
    <!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质-->
    <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
      <!--日志输出到exe程序这个相对目录下-->
      <file value="Log\\" />
      <!--输出的日志不会覆盖以前的信息-->
      <appendToFile value="true" />
      <!--备份文件的个数-->
      <maxSizeRollBackups value="100" />
      <!--单个日志文件的最大大小-->
      <maxFileSize value="10240" />
      <!--是否使用静态文件名-->
      <staticLogFileName value="false" />
      <!--日志文件名-->
      <datePattern value="'Error_'yyyyMMdd'.txt'" />
      <!--文件创建的方式,这里是以Date方式创建-->
      <rollingStyle value="Date" />
      <!--错误日志布局-->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%newline%date [Thread: %thread] %newline%message %newline"/>     
      </layout>
    </appender>
    <!--信息日志附加介质:输出到文件-->
    <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
      <file value="Log\\" />
      <appendToFile value="true" />
      <maxFileSize value="10240" />
      <maxSizeRollBackups value="100" />
      <staticLogFileName value="false" />
      <datePattern value="'Info_'yyyyMMdd'.txt'" />
      <rollingStyle value="Date" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%newline%date [Thread: %thread] %message %newline"/>
      </layout>
    </appender>
    <!--调试日志附加介质:输出到文件-->
    <appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
      <file value="Log\\" />
      <appendToFile value="true" />
      <maxFileSize value="10240" />
      <maxSizeRollBackups value="100" />
      <staticLogFileName value="false" />
      <datePattern value="'Debug_'yyyyMMdd'.txt'" />
      <rollingStyle value="Date" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%newline%date [Thread: %thread] %message %newline"/>
      </layout>
    </appender>
    <!--日志附加介质:输出到控制台-->
    <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
      <mapping>
        <level value="ERROR" />
        <foreColor value="White" />
        <backColor value="Red, HighIntensity" />
      </mapping>
      <mapping>
        <level value="DEBUG" />
        <foreColor value="White" />
        <backColor value="Green" />
      </mapping>
      <mapping>
        <level value="INFO" />
        <foreColor value="White" />
        <!--<backColor value="Yellow" />-->
      </mapping>
      <layout type="log4net.Layout.PatternLayout">
        <!--%data格式为yyyy-MM-dd HH:mm:ss,sss-->
        <conversionPattern value="%date{yyyy'-'MM'-'dd HH':'mm':'ss} [%-5level] %message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="Debug"/>
        <param name="LevelMax" value="Fatal"/>
      </filter>
    </appender>
    <!--日志附加介质:输出到PostgreSQL-->
    <appender name="AdoNetAppender_PGSQL" type="log4net.Appender.AdoNetAppender">
      <!--缓存大小,日志达到多少条记录后写入数据库-->
      <bufferSize value="1" />
      <!--postgresql需要的客户端控件-->
      <connectionType value="Npgsql.NpgsqlConnection, Npgsql, Version=4.1.3.1, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"/>
      <connectionString value="Server=localhost;Database=test;Userid=postgres;Password=postgres;" />
      <!--log4net 2.0.3版本可以解析日志参数,2.0.8版本无法解析,故降低版本-->
      <commandText value="INSERT INTO log (logdate,loglevel,thread,message,exception) VALUES (:log_date, :log_level, :thread, :message, :exception);" />
      <!--日志时间-->
      <parameter>
        <parameterName value=":log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout"/>
        <!--<layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss}" />-->
      </parameter>
      <!--日志等级-->
      <parameter>
        <parameterName value=":log_level" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <!--线程-->
      <parameter>
        <parameterName value=":thread" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread" />
        </layout>
      </parameter>
      <!--自定义日志类名称-->
      <!--<parameter>
        <parameterName value=":logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>-->
      <!--日志消息-->
      <parameter>
        <parameterName value=":message" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
      <!--异常信息-->
      <parameter>
        <parameterName value=":exception" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.ExceptionLayout"/>
      </parameter>
    </appender>
  </log4net>

使用log4net记录日志

添加帮助类

using log4net;
using System;

//注意下面的语句一定要加上,指定log4net使用log4net.config文件来读取配置信息
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
namespace MyLog
{
    public class Logger
    {
        /// 
        /// 错误日志
        /// 
        private static readonly ILog logError = LogManager.GetLogger("error");

        /// 
        /// 信息日志
        /// 
        private static readonly ILog logInfo = LogManager.GetLogger("info");

        /// 
        /// 调试日志
        /// 
        private static readonly ILog logDebug = LogManager.GetLogger("debug");
        
        /// 
        /// 输出信息日志
        /// 
        /// 消息
        public static void Info(string message)
        {
            if (logInfo.IsInfoEnabled)
            {
                logInfo.Info(message);
            }
        }

        /// 
        /// 输出调试日志
        /// 
        /// 调试信息
        public static void Debug(string message)
        {
            if (logDebug.IsDebugEnabled)
            {
                logDebug.Debug(message);
            }
        }

        /// 
        /// 输出调试日志
        /// 
        /// 异常信息
        public static void Debug(Exception ex)
        {
            if (logDebug.IsDebugEnabled)
            {
                logDebug.Debug(ex.Message.ToString() + "/r/n" + ex.Source.ToString() + "/r/n" +
                    ex.TargetSite.ToString() + "/r/n" + ex.StackTrace.ToString());
            }
        }

        /// 
        /// 输出错误日志
        /// 
        /// 错误信息
        public static void Error(Exception ex)
        {
            if (logError.IsErrorEnabled)
            {
                logError.Error(ex.Message, ex);
            }
        }

        /// 
        /// 输出错误日志
        /// 
        /// 消息
        /// 错误信息
        public static void Error(string message, Exception ex)
        {
            if (logError.IsErrorEnabled)
            {
                logError.Error(message, ex);
            }
        }
    }
}

在需要的地方直接调用即可。


输出样式说明

  • %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
  • %n(new line):换行
  • %d(datetime):输出当前语句运行的时刻
  • %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
  • %t(thread id):当前语句所在的线程ID
  • %p(priority):日志的当前优先级别,即DEBUG、INFO、WARN…等
  • %c(class):当前日志对象的名称,例如:
  • %f(file):输出语句所在的文件名。
  • %l(line):输出语句所在的行号。
  • %数字:表示该项的最小长度,如果不够,则用空格填充,如%-5level表示level的最小宽度是5个字符,如果实际长度不够5个字符则以空格填充。

参考资料

  • C#使用log4net记录日志
  • log4net控制台输出
  • 使用log4net日志输出到数据库MySQL
  • log4net日志写入postgresql数据库
  • Apache log4net Config Examples

你可能感兴趣的:(C#)