log4net配置+全局異常抓取防遺忘整理

1 引用log4net.dllhtml

 

2 在web的根目錄下添加config配置文件 log4net.configweb

 

3 配置 log4net.config數據庫

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4Net" />
  </configSections>
  <log4net debug="true">

    <root>
      <level value="ALL" />
      <appender-ref ref="LogFileAppenderByDate" />
      <appender-ref ref="AdoNetAppender" />
    </root>

    <logger name="WebLogger">
      <!--配置日誌的級別,低於此級別的就不寫到日誌裏面去-->
      <level value="DEBUG" />

    </logger>

    <!--按日期分割日誌文件 一天一個-->
    <appender name="LogFileAppenderByDate" type="log4net.Appender.RollingFileAppender,log4net" >

      <!--是否續寫-->
      <param name="AppendToFile" value="true" />
      <!--最小鎖定模型以容許多個進程能夠寫入同一個文件-->
      <param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock" />
      <param name="StaticLogFileName" value="true" />
      <!--保存路徑-->
      <param name="File" value="Log\\" />
      <param name="DatePattern" value="yyyy-MM-dd.LOG" />
      <param name="StaticLogFileName" value="false" />
      <param name="RollingStyle" value="Date" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d,%c%nLog:%m%n-----------------------------------------%n%n" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="DEBUG" />
        <param name="LevelMax" value="DEBUG" />
      </filter>
    </appender>

    <!--按日誌容量分割日誌文件 10KB一個-->
    <appender name="LogFileAppenderBySize" type="log4net.Appender.RollingFileAppender" >
      <!--是否續寫-->
      <param name="AppendToFile" value="true" />
      <!--最小鎖定模型以容許多個進程能夠寫入同一個文件-->
      <param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock" />

      <param name="StaticLogFileName" value="true" />

      <!--按照文件的大小進行變換日誌文件-->
      <param name="RollingStyle" value="Size" />
      <param name="File" value="log.txt" />
      <!--單個文件最大數量 好像只有在 按Size分割時有效-->
      <param name="MaximumFileSize" value="200KB"/>
      <!--保留的log文件數量 超過此數量後 自動刪除以前的   好像只有在 按Size分割時有效-->
      <param name="MaxSizeRollBackups" value="2" />

      <param name="StaticLogFileName" value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="發生時間:%d %n事件級別:%level %n相關類名:%c%n程序文件:%F 第%L行%n日誌內容:%m%n-----------------------------------------%n%n" />
      </layout>
    </appender>

    <!--記錄日誌到數據庫-->
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="1" />
      <!--緩衝大小-->
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="Data Source=.\SQLEXPRESS;Initial Catalog=CVDS;User ID=sa;Password=sasa" />
      <commandText value="INSERT INTO Log([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
      <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
    </appender>

    <!-- 控制檯前臺顯示日誌 -->
    <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
      <mapping>
        <level value="ERROR" />
        <foreColor value="Red, HighIntensity" />
      </mapping>
      <mapping>
        <level value="Info" />
        <foreColor value="Green" />
      </mapping>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%n%date{HH:mm:ss,fff} [%-5level] %m" />
      </layout>

      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="Info" />
        <param name="LevelMax" value="Fatal" />
      </filter>
    </appender>



  </log4net>
</configuration>

4 配置Global.asaxapp

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(Server.MapPath("log4net.config")));//log4net
        }

5 在AssemblyInfo.cs中添加ide

 

6 調用spa

 

   public class LogHelper
    {
        //定義信息的二次處理
        public static event Action<string> OutputMessage;
        private static StackFrame sf = new StackTrace().GetFrame(2);//0爲自己方法,1爲調用方法,2爲上一級調用方法
        private static string methodName = sf.GetMethod().Name;//方法名
        private static string calssName = sf.GetMethod().ReflectedType.Name;//類名
        //ILog對象
        private static readonly ILog log = LogManager.GetLogger(sf.GetMethod().DeclaringType);

        #region 定義信息二次處理方式
        private static void HandMessage(object Msg)
        {
            if (OutputMessage != null)
            {
                OutputMessage(Msg.ToString());
            }
        }
        private static void HandMessage(object Msg, Exception ex)
        {
            if (OutputMessage != null)
            {
                OutputMessage(string.Format("{0}:{1}", Msg.ToString(), ex.ToString()));
            }
        }
        private static void HandMessage(string format, params object[] args)
        {
            if (OutputMessage != null)
            {
                OutputMessage(string.Format(format, args));
            }
        }
        #endregion

        #region 封裝Log4net
        public static void Debug(object message)
        {
            HandMessage(message);
            if (log.IsDebugEnabled)
            {
                log.Debug(message);
            }
        }
        public static void Debug(object message, Exception ex)
        {
            HandMessage(message, ex);
            if (log.IsDebugEnabled)
            {
                log.Debug(message, ex);
            }
        }
        public static void DebugFormat(string format, params object[] args)
        {
            HandMessage(format, args);
            if (log.IsDebugEnabled)
            {
                log.DebugFormat(format, args);
            }
        }

        //-----如下方法暫時不用,註釋掉------
        /*
        public static void Error(object message)
        {
            HandMessage(message);
            if (log.IsErrorEnabled)
            {
                log.Error(message);
            }
        }
        public static void Error(object message, Exception ex)
        {
            HandMessage(message, ex);
            if (log.IsErrorEnabled)
            {
                log.Error(message, ex);
            }
        }
        public static void ErrorFormat(string format, params object[] args)
        {
            HandMessage(format, args);
            if (log.IsErrorEnabled)
            {
                log.ErrorFormat(format, args);
            }
        }
        public static void Fatal(object message)
        {
            HandMessage(message);
            if (log.IsFatalEnabled)
            {
                log.Fatal(message);
            }
        }
        public static void Fatal(object message, Exception ex)
        {
            HandMessage(message, ex);
            if (log.IsFatalEnabled)
            {
                log.Fatal(message, ex);
            }
        }
        public static void FatalFormat(string format, params object[] args)
        {
            HandMessage(format, args);
            if (log.IsFatalEnabled)
            {
                log.FatalFormat(format, args);
            }
        }
        public static void Info(object message)
        {
            HandMessage(message);
            if (log.IsInfoEnabled)
            {
                log.Info(message);
            }
        }
        public static void Info(object message, Exception ex)
        {
            HandMessage(message, ex);
            if (log.IsInfoEnabled)
            {
                log.Info(message, ex);
            }
        }
        public static void InfoFormat(string format, params object[] args)
        {
            HandMessage(format, args);
            if (log.IsInfoEnabled)
            {
                log.InfoFormat(format, args);
            }
        }
        public static void Warn(object message)
        {
            HandMessage(message);
            if (log.IsWarnEnabled)
            {
                log.Warn(message);
            }
        }
        public static void Warn(object message, Exception ex)
        {
            HandMessage(message, ex);
            if (log.IsWarnEnabled)
            {
                log.Warn(message, ex);
            }
        }
        public static void WarnFormat(string format, params object[] args)
        {
            HandMessage(format, args);
            if (log.IsWarnEnabled)
            {
                log.WarnFormat(format, args);
            }
        }
        */
        #endregion
    }
loghelper

 

7 全局異常處理debug

添加一個自定義過濾器3d

    public class MyExceptionFileAttribute : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            base.OnException(filterContext);
            //處理錯誤消息,將其跳轉到一個頁面
            LogHelper.Debug(filterContext.Exception.ToString());
            //頁面跳轉到錯誤頁面
            // filterContext.HttpContext.Response.Redirect("/Error.cshtml");
        }
    }

  

註冊過濾器日誌

    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
            filters.Add(new MyExceptionFileAttribute());
        }
    }

完事code

相關文章
相關標籤/搜索