using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net;
namespace Ahedu.Common
{
    public class LogHelper : ILog
    {
        private static readonly log4net.ILog _log = LogManager.GetLogger("RollingLogFileAppender");
        private static LogHelper _logger;
        public void Debug(string msg, Exception ex)
        {
            _log.Debug(msg, ex);
        }
        public void Error(string msg, Exception ex)
        {
            _log.Error(msg, ex);
        }
        public void Fatal(string msg, Exception ex)
        {
            _log.Fatal(msg, ex);
        }
        public void Info(string msg, Exception ex)
        {
            _log.Info(msg, ex);
        }
        public void Warn(string msg, Exception ex)
        {
            _log.Warn(msg, ex);
        }
        public static LogHelper CurrentLogger
        {
            get
            {
                if (_logger == null)
                {
                    _logger = new LogHelper();
                }
                return _logger;
            }
        }
    }
    public interface ILog
    {
        // Methods
        void Debug(string msg, Exception ex);
        void Error(string msg, Exception ex);
        void Fatal(string msg, Exception ex);
        void Info(string msg, Exception ex);
        void Warn(string msg, Exception ex);
    }
    public enum LogLevel
    {
        Info,
        Debug,
        Warn,
        Error,
        Fatal
    }
}
//-----------------------------------------web.config配置--------------------------------------
<log4net debug="false">
        <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
            <param name="File" value="D:\\AHEDUPortal_Logs\\log4.log" />
            <param name="datePattern" value="MM-dd HH:mm" />
            <param name="AppendToFile" value="true" />
            <layout type="log4net.Layout.PatternLayout">
                <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
            </layout>
        </appender>
        <appender name="HttpTraceAppender" type="log4net.Appender.ASPNetTraceAppender">
            <layout type="log4net.Layout.PatternLayout">
                <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
            </layout>
        </appender>
        <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
            <layout type="log4net.Layout.PatternLayout">
                <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
            </layout>
        </appender>
        <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
            <param name="File" value="D:\\AHEDUPortal_Logs\\Log-" />
            <param name="AppendToFile" value="true" />
            <param name="MaxSizeRollBackups" value="10" />
            <param name="MaximumFileSize" value="5MB" />
            <param name="DatePattern" value="yyyy-MM-dd".log"" />
            <param name="RollingStyle" value="Composite" />
            <param name="StaticLogFileName" value="false" />
            <layout type="log4net.Layout.PatternLayout">
                <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] <%X{auth}> - %m%n" />
            </layout>
        </appender>
        <root>
            <level value="DEBUG" />
            <appender-ref ref="RollingLogFileAppender" />
        </root>
    </log4net>
//===============================================================================
首先配置log4net.xml,一般当导入log4net.dll后,会自动生成一log4net.xml,但内容太多,不好改,就用下边这个了
1.添加如下节点
<!--log4net配置 BEGIN-->
<log4net>
    <!--定义输出到文件中-->
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
      <!--定义文件存放位置-->
      <file value="D:\\log4netfile.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="yyyyMMdd-HH:mm:ss" />
      <layout type="log4net.Layout.PatternLayout">
        <!--每条日志末尾的文字说明-->
        <footer value="by zjw" />
        <!--输出格式-->
        <!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
        <conversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" />
      </layout>
    </appender>
    <!--定义输出到控制台命令行中-->
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
    <!--定义输出到windows事件中-->
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
    <!--定义输出到数据库中,这里举例输出到Access数据库中,数据库为C盘的log4net.mdb-->
    <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
      <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:log4net.mdb" />
      <commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" />
      <!--定义各个参数-->
      <parameter>
        <parameterName value="@logDate" />
        <dbType value="String" />
        <size value="240" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="240" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logLevel" />
        <dbType value="String" />
        <size value="240" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="240" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="240" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
    </appender>
    <!--定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。-->
    <root>
      <!--文件形式记录日志-->
      <appender-ref ref="LogFileAppender" />
      <!--控制台控制显示日志-->
      <appender-ref ref="ConsoleAppender" />
      <!--Windows事件日志-->
      <appender-ref ref="EventLogAppender" />
      <!-- 如果不启用相应的日志记录,可以通过这种方式注释掉
      <appender-ref ref="AdoNetAppender_Access" />
      -->
    </root>
</log4net>
<!--log4net配置 END-->
2.新建一个全局使用的类Logger
/// <summary>
    /// 类,事件日志类。
    /// 单态封装log4net
    /// </summary>
    public class Logger
    {
        private static log4net.ILog log = null;
        private static object lockHelper = new object();
        public static log4net.ILog Log
        {
            get
            {
                if (log == null)
                    lock (lockHelper)
                        if (log == null)
                            log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
                return log;
            }
        }
    }
3、在Global.asax的Application_Start里加入如下代码
log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Server.MapPath("~")+@"\log4net.xml"));
log4net.xml为log4net的配置文件,"\log4net.xml"为配置文件相对于站点的路径
4.上面ok后, 就可以使用了.
方法是:
{
//处理信息
}
catch(Exception ex)
{
//出错后执行日志.IP如果是127.0.0.1可以不用写入日志.
Logger.Log.Error("错误来自:"+Request.UserHostAddress,ex);
}
注:如何防止自定义的logger和root重复写入日志
logger是从root继承而来,默认的用logger写的日志会被root重复写一份,如何防止这种情况呢,网上有人提出可以去掉root里的appender-ref,这不是一个好的解决方法,logger只是为了单独处理一些日志,大部分的日志还是要依靠root来完成。
其实log4net提供了一种很好的解决方式,断开logger与root的继承关系,只要在配置文件里的logger加上属性additivity="false"就可以了
 
                    
                     
                    
                 
                    
                 
                
 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号