• Log4net 写文件日志与数据库日志


    一、数据库日志表结构

    [sql] view plaincopy
     
    1. CREATE TABLE [dbo].[WebLog_Msg](  
    2.     [LogID] [int] IDENTITY(1,1) NOT NULL,  
    3.     [Date] [datetime] NOT NULL,  
    4.     [Thread] [nvarchar](255) NULL,  
    5.     [Level] [nvarchar](50) NULL,  
    6.     [Logger] [nvarchar](255) NULL,  
    7.     [Message] [nvarchar](2000) NULL,  
    8.     [Exception] [nvarchar](4000) NULL,  
    9.  CONSTRAINT [PK_WebLog_Msg] PRIMARY KEY CLUSTERED   
    10. (  
    11.     [LogID] ASC  
    12. ))  

    二、测试类库LoggHelper

    [csharp] view plaincopy
     
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Linq;  
    4. using System.Text;  
    5. using log4net;  
    6.   
    7. namespace LogHelper  
    8. {  
    9.     public class LoggHelper  
    10.     {  
    11.         //static LoggHelper()  
    12.         //{  
    13.         //    log4net.Config.XmlConfigurator.Configure();  
    14.         //}  
    15.   
    16.         private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(LoggHelper));  
    17.         public static void LogInfo()  
    18.         {  
    19.             log.Info("log日志getretertretrree");  
    20.         }  
    21.         public static void LogWarn()  
    22.         {  
    23.             log.Warn("log警告WARNaaaaaaaaaad;");  
    24.         }  
    25.         public static void LogFatal()  
    26.         {  
    27.             log.Fatal("log警告WARNaaaaaaaaaad;");  
    28.         }  
    29.         public static void LogError()  
    30.         {  
    31.             log.Error("log错误sfsfsfsdfafasdfdsfadffafdsaffasf><><>2eewewjklsfaaaaaaaaaaaaaaaaaaaaaaaaaaaaad;");  
    32.         }  
    33.     }  
    34. }  

    三、控制台测试项目

    [csharp] view plaincopy
     
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Linq;  
    4. using System.Text;  
    5. using LogHelper;  
    6.   
    7. namespace TestLog4Net  
    8. {  
    9.     class Program  
    10.     {  
    11.           
    12.         static void Main(string[] args)  
    13.         {  
    14.             log4net.Config.XmlConfigurator.Configure();  
    15.             try  
    16.             {                  
    17.                 LoggHelper.LogInfo();  
    18.                 LoggHelper.LogWarn();  
    19.                 LoggHelper.LogError();               
    20.                 LoggHelper.LogFatal();  
    21.                 Console.ReadLine();  
    22.   
    23.             }  
    24.             catch (Exception ex)  
    25.             {  
    26.                 Console.Write(ex);  
    27.             }  
    28.         }  
    29.     }  
    30. }  


    配置文件内容如下:

    [csharp] view plaincopy
     
    1. <?xml version="1.0"?>  
    2. <configuration>  
    3.   <!--Log4Net config section-->  
    4.   <configSections>  
    5.     <!--<sectionGroup name="common">  
    6.       <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />  
    7.     </sectionGroup>-->  
    8.     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>  
    9.   </configSections>  
    10.   <!--<common>  
    11.     <logging>  
    12.       <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">  
    13.         <arg key="configType" value="INLINE"/>  
    14.       </factoryAdapter>  
    15.     </logging>  
    16.   </common>-->  
    17.   <log4net>  
    18.     <root>  
    19.       <!--OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL-->  
    20.       <level value="ALL"/>  
    21.       <appender-ref ref="AdoNetAppender_SqlServer"/>  
    22.       <appender-ref ref="RollingLogFileAppender"/>  
    23.     </root>  
    24.     <!--<logger name="ErrorInfo">  
    25.       <level value="ALL" />  
    26.       <appender-ref ref="RollingLogFileAppender" />  
    27.     </logger>-->  
    28.     <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">  
    29.       <filter type="log4net.Filter.LevelRangeFilter">  
    30.         <levelMin value="Debug" />  
    31.         <levelMax value="Info" />  
    32.       </filter>  
    33.       <param name="File" value="logerrorInfo.txt"/>  
    34.       <param name="AppendToFile" value="true"/>  
    35.       <param name="MaxSizeRollBackups" value="10"/>  
    36.       <param name="MaximumFileSize" value="2MB"/>  
    37.       <param name="RollingStyle" value="Size"/>  
    38.       <param name="StaticLogFileName" value="true"/>  
    39.       <layout type="log4net.Layout.PatternLayout">  
    40.         <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>  
    41.       </layout>  
    42.     </appender>  
    43.     <appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">  
    44.       <filter type="log4net.Filter.LevelRangeFilter">  
    45.         <levelMin value="Warn" />  
    46.         <levelMax value="Fatal" />  
    47.       </filter>  
    48.       <bufferSize value="0" />  
    49.       <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />  
    50.       <connectionString value="server=XXXXX;database=WebLog;user id=UID;password=PSW;Connect Timeout=15;"/>  
    51.       <commandText value="INSERT INTO WebLog_Msg([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />  
    52.       <parameter>  
    53.         <parameterName value="@log_date" />  
    54.         <dbType value="DateTime" />  
    55.         <layout type="log4net.Layout.RawTimeStampLayout" />  
    56.       </parameter>  
    57.       <parameter>  
    58.         <parameterName value="@thread" />  
    59.         <dbType value="String" />  
    60.         <size value="255" />  
    61.         <layout type="log4net.Layout.PatternLayout">  
    62.           <conversionPattern value="%thread" />  
    63.         </layout>  
    64.       </parameter>  
    65.       <parameter>  
    66.         <parameterName value="@log_level" />  
    67.         <dbType value="String" />  
    68.         <size value="50" />  
    69.         <layout type="log4net.Layout.PatternLayout">  
    70.           <conversionPattern value="%level" />  
    71.         </layout>  
    72.       </parameter>  
    73.       <parameter>  
    74.         <parameterName value="@logger" />  
    75.         <dbType value="String" />  
    76.         <size value="255" />  
    77.         <layout type="log4net.Layout.PatternLayout">  
    78.           <conversionPattern value="%logger" />  
    79.         </layout>  
    80.       </parameter>  
    81.       <parameter>  
    82.         <parameterName value="@message" />  
    83.         <dbType value="String" />  
    84.         <size value="2000" />  
    85.         <layout type="log4net.Layout.PatternLayout">  
    86.           <conversionPattern value="%message" />  
    87.         </layout>  
    88.       </parameter>  
    89.       <parameter>  
    90.         <parameterName value="@exception" />  
    91.         <dbType value="String" />  
    92.         <size value="4000" />  
    93.         <layout type="log4net.Layout.ExceptionLayout" />  
    94.       </parameter>  
    95.     </appender>  
    96.   </log4net>  
    97.   <!--Log4Net config section end-->  
    98. </configuration>  

    四、运行结果

         1、文件      

    [plain] view plaincopy
     
    1. 2011-12-31 14:40:17,440 [10] INFO  LogHelper.LoggHelper [(null)] - log日志getretertretrree  


         2、数据库

    五、优化log4net在项目中的配置

        关注封装日志操作的类库LogHelper:

        

    在AssemblyInfo.cs文件中加入[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Configuration/Log4Net.config", Watch = true)],即加入log4net配置项。

    在文件Log4Net.config中配置如下:

    [html] view plaincopy
     
    1. <?xml version="1.0" encoding="utf-8" ?>  
    2. <configuration>  
    3.   <!--Log4Net config section-->  
    4.   <configSections>  
    5.     <!--<sectionGroup name="common">  
    6.       <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />  
    7.     </sectionGroup>-->  
    8.     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>  
    9.   </configSections>  
    10.   <!--<common>  
    11.     <logging>  
    12.       <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">  
    13.         <arg key="configType" value="INLINE"/>  
    14.       </factoryAdapter>  
    15.     </logging>  
    16.   </common>-->  
    17.   <log4net>  
    18.     <root>  
    19.       <!--OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL-->  
    20.       <level value="ALL"/>  
    21.       <appender-ref ref="AdoNetAppender_SqlServer"/>  
    22.       <appender-ref ref="RollingLogFileAppender"/>  
    23.     </root>  
    24.     <!--<logger name="ErrorInfo">  
    25.       <level value="ALL" />  
    26.       <appender-ref ref="RollingLogFileAppender" />  
    27.     </logger>-->  
    28.     <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">  
    29.       <param name="File" value="logerrorInfo.txt"/>  
    30.       <param name="AppendToFile" value="true"/>  
    31.       <param name="MaxSizeRollBackups" value="10"/>  
    32.       <param name="MaximumFileSize" value="2MB"/>  
    33.       <param name="RollingStyle" value="Size"/>  
    34.       <param name="StaticLogFileName" value="true"/>  
    35.       <layout type="log4net.Layout.PatternLayout">  
    36.         <!--"%d %t %p %l %m %n”:  
    37.   
    38.          1、%d输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss},输出类似:2005-7-19 17:49:27,刚好适合插入SQLServer;  
    39.   
    40.          2、%t  产生该日志事件的线程名;  
    41.   
    42.          3、%p 日志的log_level,如DEBUG、WARN或者INFO;  
    43.   
    44.          4、%c  输出所属的类目,通常就是所在类的全名,如“iNotes.Default”;  
    45.   
    46.          5、%m 日志的内容;  
    47.   
    48.          6、%l  输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。如write2database.main(write2database.java:33);  
    49.   
    50.          7、%n  输出一个回车换行符,Windows平台为“ ”,Unix平台为“ ”  
    51. -->  
    52.         <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>  
    53.       </layout>  
    54.     </appender>  
    55.     <appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">  
    56.       <filter type="log4net.Filter.LevelRangeFilter">  
    57.         <levelMin value="Warn" />  
    58.         <levelMax value="Fatal" />  
    59.       </filter>  
    60.       <bufferSize value="0" />  
    61.       <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />  
    62.       <connectionString value="server=XXXX;database=Weblog;user id=UID;password=PSW"/>  
    63.       <commandText value="INSERT INTO WebLog_Msg([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />  
    64.       <parameter>  
    65.         <parameterName value="@log_date" />  
    66.         <dbType value="DateTime" />  
    67.         <layout type="log4net.Layout.RawTimeStampLayout" />  
    68.       </parameter>  
    69.       <parameter>  
    70.         <parameterName value="@thread" />  
    71.         <dbType value="String" />  
    72.         <size value="255" />  
    73.         <layout type="log4net.Layout.PatternLayout">  
    74.           <conversionPattern value="%thread" />  
    75.         </layout>  
    76.       </parameter>  
    77.       <parameter>  
    78.         <parameterName value="@log_level" />  
    79.         <dbType value="String" />  
    80.         <size value="50" />  
    81.         <layout type="log4net.Layout.PatternLayout">  
    82.           <conversionPattern value="%level" />  
    83.         </layout>  
    84.       </parameter>  
    85.       <parameter>  
    86.         <parameterName value="@logger" />  
    87.         <dbType value="String" />  
    88.         <size value="255" />  
    89.         <layout type="log4net.Layout.PatternLayout">  
    90.           <conversionPattern value="%logger" />  
    91.         </layout>  
    92.       </parameter>  
    93.       <parameter>  
    94.         <parameterName value="@message" />  
    95.         <dbType value="String" />  
    96.         <size value="255" />  
    97.         <layout type="log4net.Layout.PatternLayout">  
    98.           <conversionPattern value="%message" />  
    99.         </layout>  
    100.       </parameter>  
    101.       <parameter>  
    102.         <parameterName value="@exception" />  
    103.         <dbType value="String" />  
    104.         <size value="4000" />  
    105.         <layout type="log4net.Layout.ExceptionLayout" />  
    106.       </parameter>  
    107.     </appender>  
    108.   </log4net>  
    109.   <!--Log4Net config section end-->  
    110. </configuration>  

    即把应用程序config文件下有关log4net的所有配置项移除放到单一文件Log4Net.config中,这样给应用程序的配置文件“瘦身”不少,呵呵!

    ok,编译类库LoggHelper(可在里面封装对log4net的所有操作),将控制台程序改为

    [csharp] view plaincopy
     
    1. static void Main(string[] args)  
    2.         {  
    3.             //log4net.Config.XmlConfigurator.Configure(); //注释掉  
    4.             try  
    5.             {                  
    6.                 LoggHelper.LogInfo();  
    7.                 LoggHelper.LogWarn();  
    8.                 LoggHelper.LogError();               
    9.                 LoggHelper.LogFatal();  
    10.                 Console.ReadLine();  
    11.   
    12.             }  
    13.             catch (Exception ex)  
    14.             {  
    15.                 Console.Write(ex);  
    16.             }  
    17.         }  

    运行,一切ok!

    附有关log4net的对数据库写日志的配置:

    http://logging.apache.org/log4net/release/config-examples.html

  • 相关阅读:
    DateTimePicker常用格式类型
    自定义TreeNode
    memoのPython环境配置
    关于隐式积分方程的一些问题
    Position Based Dynamics【译】
    memoのMac折腾记录
    20210425 助教一周小结(第十二周)
    20210328 助教一周小结(第八周)
    20210307 助教一周小结(第五周)
    20210404 助教一周小结(第九周)
  • 原文地址:https://www.cnblogs.com/Alex80/p/4377112.html
Copyright © 2020-2023  润新知