文章出處

廢話少說,先上代碼 log4net Demo

好的系統都有日志,log4net 是我在.net平臺下用過最爽的日志庫,簡單易用、功能強大。

  • 基于配置(配置很簡單,一看就明,通用,拷去即用);
  • 可同時保存日志到文件、數據庫、控制臺輸出;
  • 分門別類保存日志文件(消息、警告、錯誤、異常保存到不同的文件/文件夾下);
  • 使用后臺線程;
簡單配置:
  • Nuget安裝log4net;
  • 配置log4net:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <log4net>
    <!-- 文件保存日志 -->
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <!--日志路徑: 兼容相對路徑和絕對路徑 -->
      <param name= "File" value= "Log\simple\"/>
      <!--是否是向文件中追加日志-->
      <param name= "AppendToFile" value= "true"/>
      <!--保留天數-->
      <param name= "MaxSizeRollBackups" value= "10"/>
      <!--日志文件名是否固定不變的-->
      <param name= "StaticLogFileName" value= "false"/>
      <!--日志文件名格式為:20170112.log-->
      <param name= "DatePattern" value= "yyyyMMdd&quot;.log&quot;"/>
      <!--日志根據日期滾動-->
      <param name= "RollingStyle" value= "Date"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%date{yyyy-MM-dd HH:mm:ss.fff} %-5p %m%n" />
      </layout>
    </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>

    <root>
      <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
      <level value="all" />
      <appender-ref ref="ColoredConsoleAppender"/>
      <appender-ref ref="RollingFileAppender"/>
    </root>
  </log4net>
</configuration>

截圖

控制臺

文件

復雜配置:分門別類、同時保存日志到文件、數據庫

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

  <log4net>
    <!-- 信息日志類 -->
    <logger name="loginfo">
      <level value="ALL" />
      <appender-ref ref="AdoNetAppender" />
      <appender-ref ref="InfoAppender" />
    </logger>
    <!-- 警告日志類 -->
    <logger name="logwarn">
      <level value="ALL" />
      <appender-ref ref="WarnAppender" />
    </logger>
    <!-- 錯誤日志類-->
    <logger name="logerror">
      <level value="ALL" />
      <appender-ref ref="AdoNetAppender" />
      <appender-ref ref="ErrorAppender" />
    </logger>
    <!-- 異常日志類-->
    <logger name="logfatal">
      <level value="ALL" />
      <appender-ref ref="AdoNetAppender" />
      <appender-ref ref="FatalAppender" />
    </logger>

    <!-- 文件保存日志 -->
    <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
      <!--日志路徑: 兼容相對路徑和絕對路徑 -->
      <param name= "File" value= "Log\complex\info\"/>
      <!--是否是向文件中追加日志-->
      <param name= "AppendToFile" value= "true"/>
      <!--保留天數-->
      <param name= "MaxSizeRollBackups" value= "10"/>
      <!--日志文件名是否固定不變的-->
      <param name= "StaticLogFileName" value= "false"/>
      <!--日志文件名格式為:20170112.log-->
      <param name= "DatePattern" value= "yyyyMMdd&quot;.log&quot;"/>
      <!--日志根據日期滾動-->
      <param name= "RollingStyle" value= "Date"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%date{yyyy-MM-dd HH:mm:ss.fff} %-5p %m%n" />
      </layout>
    </appender>

    <appender name="WarnAppender" type="log4net.Appender.RollingFileAppender">
      <param name= "File" value= "Log\complex\warn\"/>
      <param name= "AppendToFile" value= "true"/>
      <param name= "MaxSizeRollBackups" value= "10"/>
      <param name= "StaticLogFileName" value= "false"/>
      <param name= "DatePattern" value= "yyyyMMdd&quot;.log&quot;"/>
      <param name= "RollingStyle" value= "Date"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%date{yyyy-MM-dd HH:mm:ss.fff} %-5p %m%n" />
      </layout>
    </appender>

    <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
      <param name= "File" value= "Log\complex\error\"/>
      <param name= "AppendToFile" value= "true"/>
      <param name= "MaxSizeRollBackups" value= "10"/>
      <param name= "StaticLogFileName" value= "false"/>
      <param name= "DatePattern" value= "yyyyMMdd&quot;.log&quot;"/>
      <param name= "RollingStyle" value= "Date"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%date{yyyy-MM-dd HH:mm:ss.fff} %-5p %m%n" />
      </layout>
    </appender>

    <appender name="FatalAppender" type="log4net.Appender.RollingFileAppender">
      <param name= "File" value= "Log\complex\fatal\"/>
      <param name= "AppendToFile" value= "true"/>
      <param name= "MaxSizeRollBackups" value= "10"/>
      <param name= "StaticLogFileName" value= "false"/>
      <param name= "DatePattern" value= "yyyyMMdd&quot;.log&quot;"/>
      <param name= "RollingStyle" value= "Date"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%date{yyyy-MM-dd HH:mm:ss.fff} %-5p %m%n" />
      </layout>
    </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>

    <!-- 數據庫保存 -->
    <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=.;initial catalog=test_log;integrated security=true" />
      <commandText value="INSERT INTO log([userid],[level],[ip],[msg],[exception]) VALUES (@userid,@level,@ip, @msg,@exception)" />
      <parameter>
        <parameterName value="@userid"/>
        <dbType value="Int64"/>
        <size value="64"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%X{userid}"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@level" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@ip" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%X{ip}" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@msg" />
        <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>

  </log4net>
</configuration>

上面的AdoNetAppender附加器,是把日志保存到數據庫,日志表設計:

CREATE TABLE [log](
id BIGINT IDENTITY(1,1) PRIMARY KEY,
userid BIGINT,
[level] NVARCHAR(8),
[ip] NVARCHAR(16),
msg NVARCHAR(1024),
[exception] NTEXT,
[date] DATETIME DEFAULT CURRENT_TIMESTAMP
)

截圖

根據配置名生成的文件夾

基于日期生成的文件

生成的異常日志

日志保存到數據庫

Log4net中的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的形式廣播。

ConversionPattern相關參數設置

%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個字符則以空格填充。
下面以一個實際的例子來說明問題,比如在配置中有“%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline”,那么實際的日志中會是如下格式:
“記錄時間:2010-11-17 16:16:36,561 線程ID:[9] 日志級別:文件:所在行ERROR 出錯類:Log4NetDemo.Program property:[(null)] - 錯誤描述:error
System.Exception: 在這里發生了一個異常,Error Number:2036084948”

廢話少說,線上代碼 log4net Demo


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()