右键项目,点击【管理NuGet程序包】,浏览中搜索【log4net】,下载安装即可。
注意:若要输出到PostgreSQL,需要使用v2.0.3版本。
我开始安装的v2.0.8,发现sql语句中无法解析参数,修改为低版本就好了。
<!-- 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>
添加帮助类
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个字符则以空格填充。