SharePoint使用Log4Net

      日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点:它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug;一旦在程序中加入了Log 输出代码,程序运行过程中就能生成并输出日志信息而无需人工干预。另外,日志信息可以输出到不同的地方(控制台,文件等)以备以后研究之用。

Log4net就是为这样一个目的设计的,用于.NET开发环境的日志记录包.

Log4net可以配置在application所在的.config文件中,也可以在单独配置在一个.config文件中。

传统的Asp.net程序都会有一个web.config,我们可以把log4net的配置写在web.config中。

  • 在configuration节点下的configSections中添加对log4net的引用
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
  • 添加具体的log4net日志信息
<log4net>
    <logger name="logerror">
      <level value="ERROR" />
      <appender-ref ref="ErrorAppender" />
    </logger>
    <logger name="loginfo">
      <level value="INFO" />
      <appender-ref ref="InfoAppender" />
    </logger>
    <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="ErrorLog.log" />
      <param name="AppendToFile" value="true" />
      <param name="MaxSizeRollBackups" value="100" />
      <param name="MaximumFileSize" value="1MB" />
      <param name="RollingStyle" value="Size" />
      <param name="StaticLogFileName" value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
      </layout>
    </appender>
    <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="InfoLog.log" />
      <param name="AppendToFile" value="true" />
      <param name="MaxSizeRollBackups" value="100" />
      <param name="MaximumFileSize" value="1MB" />
      <param name="RollingStyle" value="Size" />
      <param name="StaticLogFileName" value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
      </layout>
    </appender>
  </log4net>

备注:上面的代码分别定义了记录Info和Error的Appender,可以满足大部分需求

Sharepoint由于它的特殊性,用户是不能随便改config文件,sharepoint都是以farm的方式安装部署的,也就是说会有多台WFE,如果每台都去改config是及其不合理的。

Log4net的灵活在于你可以定义一个单独的config文件,也就是说我们无需去改web.config。

  • 新建一个log4net.config文件,内容跟上面的一样
<log4net debug="true">
  <logger name="logerror">
    <level value="ERROR" />
    <appender-ref ref="ErrorRollingLogFileAppender" />
  </logger>
  <logger name="loginfo">
    <level value="INFO" />
    <appender-ref ref="RollingFileAppender" />
  </logger>
  <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value="C:\\Log\\%date{yyyyMMdd}-log.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="20" />
    <maximumFileSize value="5MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
  </appender>
  <appender name="ErrorRollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value="C:\\Log\\%date{yyyyMMdd}-error.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="yyyyMMdd" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
  </appender>
</log4net>

 备注:这里我们指定了日志的目录,如果没有指定,默认与application目录一致

  • 定义LogHelper公用类
public class LogHelper
    {
        //log4net日志专用
        public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
        public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");
       
        /// <summary>
        /// 普通的文件记录日志
        /// </summary>
        /// <param name="info"></param>
        public static void WriteLog(string info)
        {
            if (loginfo.IsInfoEnabled)
            {
                loginfo.Info(info);
            }
        }
        /// <summary>
        /// 错误日志
        /// </summary>
        /// <param name="info"></param>
        /// <param name="se"></param>
        public static void WriteLog(string info, Exception se)
        {
            if (logerror.IsErrorEnabled)
            {
                logerror.Error(info, se);
            }
        }
    }
  • 关联配置文件

Log4net提供log4net.Config.XmlConifguratorAttribute自定义属性,我们可以通过它来关联配置文件

//监视默认的配置文件,AppName.exe.config  
[assembly: log4net.Config.XmlConfigurator(Watch = true)]

//监视配置文件,AppName.exe.log4net  
[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "log4net", Watch = true)]

//使用配置文件log4net.config,不监视改变。
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "C:\\Log4net\\log4net.config")]

根据实际情况选择合适的配置方式,前面讲了sharepoint的特殊性,不是很方便去更改web.config,所以我们选择第三种配置,即关联一个外部的.config文件。

在项目部署的时候,只要把log4net.config部署到指定的目录即可。完整的LogHelper代码如下

//使用配置文件log4net.config,不监视改变。
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "C:\\Log4net\\log4net.config")]
namespace CommonService
{
    public class LogHelper
    {
        //log4net日志专用
        public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
        public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");
      
        /// <summary>
        /// 普通的文件记录日志
        /// </summary>
        /// <param name="info"></param>
        public static void WriteLog(string info)
        {
            if (loginfo.IsInfoEnabled)
            {
                loginfo.Info(info);
            }
        }
        /// <summary>
        /// 错误日志
        /// </summary>
        /// <param name="info"></param>
        /// <param name="se"></param>
        public static void WriteLog(string info, Exception se)
        {
            if (logerror.IsErrorEnabled)
            {
                logerror.Error(info, se);
            }
        }
    }
}
  • 使用Log功能
LogHelper.WriteLog("The Process completed.");
LogHelper.WriteLog("Error testing", new Exception("just for testing"));

 

log4net的强大远不止这些,本文只是针对项目开发中惯用的配置来做讲解,尤其是如果配置在sharepoint中使用。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。