Why use Log4net?
The log4net framework is based on Apache log4j™, see http://logging.apache.org/log4j/ for more information on log4j. The log4net framework, source code, binaries, documentation, examples and related materials are published under the terms of the Apache License, Version 2.0, a copy of which has been included with this distribution in the LICENSE.txt file.
日志级别
level定义记录的日志级别,就是说,你要记录哪个级别以上的日志,级别由低往高依次是:
- ALL
- DEBUG
- INFO
- WARN
- ERROR
- FATAL
- None
Appender
- AdoNetAppender:利用ADO.NET记录到数据库的日志。
- AnsiColorTerminalAppender:在ANSI 窗口终端写下高亮度的日志事件。
- AspNetTraceAppender:能用asp.net中Trace的方式查看记录的日志。
- BufferingForwardingAppender:在输出到子Appenders之前先缓存日志事件。
- ConsoleAppender:将日志输出到控制台。
- EventLogAppender:将日志写到Windows Event Log.
- FileAppender:将日志写到文件中。
- LocalSyslogAppender:将日志写到local syslog service (仅用于UNIX环境下).
- MemoryAppender:将日志存到内存缓冲区。
- NetSendAppender:将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。
- RemoteSyslogAppender:通过UDP网络协议将日志写到Remote syslog service。
- RemotingAppender:通过.NET Remoting将日志写到远程接收端。
- RollingFileAppender:将日志以回滚文件的形式写到文件中。
- SmtpAppender:将日志写到邮件中。
- TraceAppender:将日志写到.NET trace 系统。
- UdpAppender:将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。
消息格式化
- %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个字符则以空格填充
日志筛选
log4net里面的filter类常用的为:
- DenyAllFilter 拒绝所用的日志输出
<filter type="log4net.Filter.LevelMatchFilter">
<param name="LevelToMatch" value="DEBUG" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
上面的配置是如果日志的输出级别不符合DEBUG要求的话,则不输出任何日志。
- LevelMatchFilter 这个类里面有两个属性,一个是LevelToMatch这个属性是你要匹配输出日志的级别,比如:
<filter type="log4net.Filter.LevelMatchFilter">
<param name="LevelToMatch" value="DEBUG" />
</filter>
这样的话,只有级别是DEBUG的日志才能输出。 另外这个类还有一个重要的属性就是AcceptOnMatch这个属性是设置如果这个条件匹配的话,是否接受输出打印,比如说:
<filter type="log4net.Filter.LevelMatchFilter">
<param name="LevelToMatch" value="DEBUG" />
</filter>
<filter type="log4net.Filter.StringMatchFilter">
<param name="StringToMatch" value="debug" />
</filter>
如果日志的级别为DEBVG的话,也就是说符合了第一个Filter的条件,日志就输出,则StringMatchFilter就不执行了。如果这样写的话,就会继续向下执行过滤:
<filter type="log4net.Filter.LevelMatchFilter">
<param name="LevelToMatch" value="DEBUG" />
<AcceptOnMatch value="false"></AcceptOnMatch>
</filter>
<filter type="log4net.Filter.StringMatchFilter">
<param name="StringToMatch" value="debug" />
</filter>
如果这样写的话,即使第一个Filter符合了条件则第二个Filter也会继续执行。
- LevelRangeFilter 配置文件是这样的:
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="ERROR" />
</filter>
- LoggerMatchFilter 配置文件是这样的:
<filter type="log4net.Filter.LoggerMatchFilter">
<param name="LoggerToMatch" value="Client" />
</filter>
- StringMatchFilter 配置文件是这样的:
<filter type="log4net.Filter.StringMatchFilter">
<param name="StringToMatch" value="/blog/Client.Program" />
</filter>
How use Log4?
基本配置
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net-net-1.0"/>
</configSections>
<log4net>
<appender name="LogRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\" />
<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" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value=" %n===================================================================
%nTIME:%d [%t] %nLEVEL:%-5p %n%m" />
</layout>
</appender>
<root>
<!--文件形式记录日志-->
<level value="ALL"/>
<appender-ref ref="LogRollingFileAppender" />
</root>
</log4net>
通用类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace Common
{
public class LogHelper
{
public static log4net.ILog GetLog()
{
log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
return log;
}
public static void Error(Exception error)
{
log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
log.Error(error.Message+Environment.NewLine+error.ToString()+Environment.NewLine+error.StackTrace);
}
public static void Error(string content)
{
log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
log.Error(content);
}
public static void Info(string content)
{
log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
log.Info(content);
}
public static void InfoXml(string title, string xml)
{
log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
try
{
string result = FormatXml(xml);
log.Info(title + Environment.NewLine + result);
}
catch (Exception error)
{
log.Info(title + Environment.NewLine + xml + Environment.NewLine + "格式化XML显示失败:" + error.Message);
}
}
public static string FormatXml(string sUnformattedXml)
{
XmlDocument xd = new XmlDocument();
xd.LoadXml(sUnformattedXml);
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
XmlTextWriter xtw = null;
try
{
xtw = new XmlTextWriter(sw);
xtw.Formatting = Formatting.Indented;
xtw.Indentation = 1;
xtw.IndentChar = '\t';
xd.WriteTo(xtw);
}
finally
{
if (xtw != null)
xtw.Close();
}
return sb.ToString();
}
}
}