日志记录

使用log4的日志记录

Posted by YangLong on May 3, 2017

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&quot;.txt&quot;" />
      <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();
        }
    }

}