log4net配置及使用
log4net简介
log4net库是Apache log4j框架在Microsoft.NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。
log4net详解
Appenders
Appenders用来定义日志的输出方式,即日志要写到那种介质上去。
属性 | 说明 |
---|---|
AdoNetAppender | 将日志记录到数据库中。可以采用SQL和存储过程两种方式。 |
AnsiColorTerminalAppender | 将日志高亮输出到ANSI终端。 |
AspNetTraceAppender | 能用asp.net中Trace的方式查看记录的日志。 |
BufferingForwardingAppender | 在输出到子Appenders之前先缓存日志事件。 |
ConsoleAppender | 将日志输出到应用程序控制台。 |
EventLogAppender | 将日志写到Windows Event Log。 |
FileAppender | 将日志输出到文件。 |
ForwardingAppender | 发送日志事件到子Appenders。 |
LocalSyslogAppender | 将日志写到local syslog service (仅用于UNIX环境下)。 |
MemoryAppender | 将日志存到内存缓冲区。 |
NetSendAppender | 将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。 |
OutputDebugStringAppender | 将日志输出到Debuger,如果程序没有Debuger,就输出到系统Debuger。如果系统Debuger也不可用,将忽略消息。 |
RemoteSyslogAppender | 通过UDP网络协议将日志写到Remote syslog service。 |
RemotingAppender | 通过.NET Remoting将日志写到远程接收端。 |
RollingFileAppender | 将日志以回滚文件的形式写到文件中。 |
SmtpAppender | 将日志写到邮件中。 |
SmtpPickupDirAppender | 将消息以文件的方式放入一个目录中,像IIS SMTP agent这样的SMTP代理就可以阅读或发送它们。 |
TelnetAppender | 客户端通过Telnet来接受日志事件。 |
TraceAppender | 将日志写到.NET trace 系统。 |
UdpAppender | 将日志以无连接UDP数据报的形式送到远程宿主或用UdpClient的形式广播。 |
Filters
使用过滤器可以过滤掉Appender输出的内容
属性 | 说明 |
---|---|
DenyAllFilter | 阻止所有的日志事件被记录 |
LevelMatchFilter | 只有指定等级的日志事件才被记录 |
LevelRangeFilter | 日志等级在指定范围内的事件才被记录 |
LoggerMatchFilter | 与Logger名称匹配,才记录 |
PropertyFilter | 消息匹配指定的属性值时才被记录 |
StringMathFilter | 消息匹配指定的字符串才被记录 |
Layouts
Layout用于控制Appender的输出格式,可以是线性的也可以是XML。
属性 | 说明 |
---|---|
SimpleLayout | 简单输出格式,只输出日志级别与消息内容。 |
RawTimeStampLayout | 用来格式化时间,在向数据库输出时会用到。 |
ExceptionLayout | 需要给Logger的方法传入Exception对象作为参数才起作用,否则就什么也不输出。输出的时候会包含Message和Trace。 |
PatterLayout | 使用最多的一个Layout,能输出的信息很多 |
Loggers
Logger是直接和应用程序交互的组件。Logger只是产生日志,然后由它引用的Appender记录到指定的媒介,并由Layout控制输出格式。
日志的等级,它们由高到底分别为:OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL
在具体写日志时,一般可以这样理解日志等级:
- FATAL(致命错误):记录系统中出现的能使用系统完全失去功能,服务停止,系统崩溃等使系统无法继续运行下去的错误。例如,数据库无法连接,系统出现死循环。
- ERROR(一般错误):记录系统中出现的导致系统不稳定,部分功能出现混乱或部分功能失效一类的错误。例如,数据字段为空,数据操作不可完成,操作出现异常等。
- WARN(警告):记录系统中不影响系统继续运行,但不符合系统运行正常条件,有可能引起系统错误的信息。例如,记录内容为空,数据内容不正确等。
- INFO(一般信息):记录系统运行中应该让用户知道的基本信息。例如,服务开始运行,功能已经开户等。
- DEBUG (调试信息):记录系统用于调试的一切信息,内容或者是一些关键数据内容的输出。
log4net使用说明
引用log4net
在NuGet管理中直接搜索安装即可。
编写配置文件
个人常用的配置文件仅供参考。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<!-- Level的级别,由高到低 -->
<!-- None > Fatal > ERROR > WARN > DEBUG > INFO > ALL-->
<!-- 解释:如果level是ERROR,则在cs文件里面调用log4net的info()方法,则不会写入到日志文件中-->
<log4net>
<!--错误日志类-->
<logger name="logerror">
<!--日志类的名字-->
<level value="ALL" />
<!--定义记录的日志级别-->
<appender-ref ref="ErrorAppender" />
<!--记录到哪个介质中去-->
</logger>
<!--信息日志类-->
<logger name="loginfo">
<level value="ALL" />
<appender-ref ref="InfoAppender" />
</logger>
<!--错误日志附加介质-->
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质-->
<param name="File" value="Log\\LogError\\" />
<!--日志输出到exe程序这个相对目录下-->
<param name="AppendToFile" value="true" />
<!--输出的日志不会覆盖以前的信息-->
<param name="MaxSizeRollBackups" value="100" />
<!--备份文件的个数-->
<param name="MaxFileSize" value="10240" />
<!--当个日志文件的最大大小-->
<param name="StaticLogFileName" value="false" />
<!--是否使用静态文件名-->
<param name="DatePattern" value="yyyyMMdd".txt"" />
<!--日志文件名-->
<param name="RollingStyle" value="Date" />
<!--文件创建的方式,这里是以Date方式创建-->
<!--错误日志布局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="时间:%date %n线程ID[%thread]
%n日志级别:%-5level %n记录类:%logger %n扩展信息:%property
-%n异常:%exception %n错误描述:%n%message%newline%n"/>
</layout>
</appender>
<!--信息日志附加介质-->
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\LogInfo\\" />
<param name="AppendToFile" value="true" />
<param name="MaxFileSize" value="10240" />
<param name="MaxSizeRollBackups" value="100" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyyMMdd".txt"" />
<param name="RollingStyle" value="Date" />
<!--信息日志布局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="时间:%date %n线程ID[%thread]
%n日志级别:%-5level %n记录类:%logger %n扩展信息:%property
-%n异常:%exception %n错误描述:%n%message%newline%n"/>
</layout>
</appender>
</log4net>
</configuration>
其中layout节点的配置说明:
- %m(message):输出的日志消息;
- %n(newline):换行;
- %d(datetime):输出当前语句运行的时刻;
- %r(runtime):输出程序从运行到执行到当前语句时消耗的毫秒数;
- %t(threadid):当前语句所在的线程ID ;
- %p(priority): 日志的当前日志级别;
- %c(class):当前日志对象的名称;
- %L:输出语句所在的行号;
- %F:输出语句所在的文件名;
- %-10:表示最小长度为10,如果不够,则用空格填充
编写扩展方法
using System;
namespace Common
{
public class LogHelper
{
public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");
public static void WriteLog(string info)
{
if (loginfo.IsInfoEnabled)
{
loginfo.Info(info);
}
}
public static void WriteLog(string info, Exception ex)
{
if (logerror.IsErrorEnabled)
{
logerror.Error(info, ex);
}
}
}
}
在应用程序的主入口点中读取配置文件
using log4net.Config;
using System;
using System.IO;
using System.Windows.Forms;
namespace AppSettings
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
InitLog4Net();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new SettingsForm());
}
private static void InitLog4Net()
{
var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config");
XmlConfigurator.ConfigureAndWatch(logCfg);
}
}
}
程序中调用
引用上面的LogHelper
try
{
//需要检测异常的代码
}
catch (Exception ex)
{
LogHelper.WriteLog("自定义的描述信息", ex);
}
日志输出如下
文件结构
日志内容