zoukankan      html  css  js  c++  java
  • 浅谈Log4net在项目中如何记录日志

    一    引入背景

           在软件开发周期中,无论是开发中,或是测试中,或是上线后,选择合适的工具监控程序的运行状态至关重要,只有如此,才能更好地排查程序问题和检测程序性能问题等。本篇文章主要与大家分享,如何利用Log4net在项目中记录日志文件。在应用程序出现问题时,启用日志记录有助于解决问题。使用log4net,可以在运行时启用日志记录,而无需修改应用程序二进制文件。log4net是帮助程序员输出日志语句到各种输出目标的工具。

    log4net支持如下框架:

    • NET Standard 1.3 via .NET Core 1.0
    • Microsoft® .NET Framework 1.0
    • Microsoft .NET Framework 1.1
    • Microsoft .NET Framework 2.0
    • Microsoft .NET Framework 3.5
    • Microsoft .NET Framework 4.0
    • Microsoft .NET Framework 4.5
    • Microsoft .NET Framework 3.5 Client Profile
    • Microsoft .NET Framework 4.0 Client Profile
    • Microsoft .NET Compact Framework 1.0
    • Microsoft .NET Compact Framework 2.0
    • Mono 1.0
    • Mono 2.0
    • Mono 3.5
    • Mono 4.0
    • Microsoft Shared Source CLI 1.0
    • CLI 1.0 Compatible

    二    log4net概述

    (一)日志级别

    1.级别归纳

    2.级别比较

    (1)级别从低=>高排序:ALL<Debug<Info<Warn<Error<Fatal<OFF

    (2)日志不能记录低于最低级别的记录,如设置最低级别为Info,则低于Info的级别,都不能记录

    code

    测试结果

    3.利用Filter过滤级别

    除此之外,还能利用filter级别过滤,来设置将不同级别记录到相应文件,如将INFO级别信息记录到INFO文件中,将Error级别信息记录到Error文件中。

    配置文件

    后台代码

    static void Main(string[] args)
            {
                //Log4net几种提错类型
                //创建日志记录组件
                ILog  iLog = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
                try
                {
                    iLog.Debug("Debug", new Exception("Debug"));
                    iLog.Info("Info", new Exception("Info"));
                    iLog.Warn("Warn", new Exception("Warn"));
                    iLog.Error("Error", new Exception("Error"));
                    iLog.Fatal("Fatal", new Exception("Fatal"));
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }

    测试结果

    (二)级别继承

    级别继承很简单,归结为一句话:若本事设置了级别,则用自己的级别,若没设置级别,则继承离自己最近的级别。

    例子1

    例子2

     例子3

     例子4

    (三)日志输出形式

    1.输出文件形式归纳

    2.项目中常用的输出形式

    3.代码操作

    3.1.在Root中定义日志输出媒介

    <root>
          <level value="ALL" />
          <!--定义日志的输出媒介,如下定义四种方式-->
          <!--文件形式记录日志-->
          <appender-ref ref="LogFileInfoAppender" />
          <!--<appender-ref ref="LogFileErrorAppender" />-->
          <!--控制台显示日志-->
          <appender-ref ref="ConsoleAppender" />
          <!--Windows事件日志-->
          <appender-ref ref="EventLogAppender" />
           <!--数据库日志-->
          <appender-ref ref="AdoNetAppender_Oracle" />
    </root>

    3.2.配置具体的媒介,如下以文件形式为例

     <!--定义输出到文件中-->
        <appender name="LogFileInfoAppender" type="log4net.Appender.FileAppender">
          <!--定义文件存放位置-->
          <file value="E:/Log/log4netInfoLog.txt" />
          <appendToFile value="true" />
          <rollingStyle value="Date" />
          <datePattern value="yyyyMMdd-HH:mm:ss" />
          <!---定义布局模板-->
          <layout type="log4net.Layout.PatternLayout">
            <!--每条日志末尾的文字说明-->
            <footer value="by Alan_beijing" />
            <!--输出格式-->
            <!--样例:2008-03-26 13:42:32,111 [10] INFO  Log4NetDemo.MainClass [(null)] - info-->
            <conversionPattern value="记录时间:%date;文件名:%file;行号:%line;线程ID:[%thread];优先级:%priority;%newline
                                日志级别:%-5level;运行时间:%r;出错类:%logger property:[%property{NDC}];错误描述:%message" />
          </layout>
        </appender>

     3.3.后台代码

    class Program
        {
            static void Main(string[] args)
            {
                //Log4net几种提错类型
                //创建日志记录组件
                ILog  iLog = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
                try
                {
                    iLog.Debug("Debug", new Exception("Debug"));
                    iLog.Info("Info", new Exception("Info"));
                    iLog.Warn("Warn", new Exception("Warn"));
                    iLog.Error("Error", new Exception("Error"));
                    iLog.Fatal("Fatal", new Exception("Fatal"));
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
        }

    3.4.测试结果

    (四)定义日志输出格式

    1.常用输出格式归纳

     

    2.code及测试结果

    三   代码实例

     本示例是基于VS2017控制条程序写的。

    1.后台

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    using log4net;
    using System.Reflection;
    
    [assembly: log4net.Config.XmlConfigurator(Watch = true)]
    namespace Log4netDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                //Log4net几种提错类型
                //创建日志记录组件
                ILog  iLog = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
                try
                {
                    iLog.Debug("Debug", new Exception("Debug"));
                    iLog.Info("Info", new Exception("Info"));
                    iLog.Warn("Warn", new Exception("Warn"));
                    iLog.Error("Error", new Exception("Error"));
                    iLog.Fatal("Fatal", new Exception("Fatal"));
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
        }
    }

    2.配置文件

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <!--声明自定义节点-->
      <configSections>
        <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
      </configSections>
      <appSettings>
      </appSettings>
      <log4net>
        <root>
          <!--<level value="Info" />-->
          <level value="ALL" />
          <!--定义日志的输出媒介,如下定义四种方式-->
          <!--文件形式记录日志-->
          <!--<appender-ref ref="LogFile_MinLevel_Info" />-->
          <appender-ref ref="LogFileInfoAppender" />
          <appender-ref ref="LogFileErrorAppender" />
          <!--控制台显示日志-->
          <!--<appender-ref ref="ConsoleAppender" />-->
          <!--Windows事件日志-->
          <!--<appender-ref ref="EventLogAppender" />-->
           <!--数据库日志-->
          <!--<appender-ref ref="AdoNetAppender_Oracle" />-->
        </root>
        <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低)-->
        <logger name="log4netLevel">
          <!--<level value="ALL" />
          <level value="DEBUG" />-->
          <!--<level value="INFO" />-->
          <!--<level value="WARN" />
          <level value="ERROR" />-->
          <!--<level value="FATAL" />
          <level value="OFF" />-->
        </logger>
        <!--定义输出到文件中-->
        <!--<appender name="LogFile_MinLevel_Info" type="log4net.Appender.FileAppender">-->
        <appender name="LogFileInfoAppender" type="log4net.Appender.FileAppender">
          <!--定义文件存放位置-->
          <file value="E:/Log/log4netLogFile_Info.txt" />
          <appendToFile value="true" />
          <rollingStyle value="Date" />
          <datePattern value="yyyyMMdd-HH:mm:ss" />
          <!---定义布局模板-->
          <layout type="log4net.Layout.PatternLayout">
            <!--每条日志末尾的文字说明-->
            <footer value="by Alan_beijing" />
            <!--输出格式-->
            <!--样例:2008-03-26 13:42:32,111 [10] INFO  Log4NetDemo.MainClass [(null)] - info-->
            <conversionPattern value="记录时间:%date;文件名:%file;行号:%line;线程ID:[%thread];优先级:%priority;%newline
                                日志级别:%-5level;运行时间:%r;出错类:%logger property:[%property{NDC}];错误描述:%message" />
          </layout>
          <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="Info" />
            <param name="LevelMax" value="Info" />
          </filter>
        </appender>
        <appender name="LogFileErrorAppender" type="log4net.Appender.FileAppender">
          <!--定义文件存放位置-->
          <file value="E:/Log/llog4netLogFile_Error.txt" />
          <appendToFile value="true" />
          <rollingStyle value="Date" />
          <datePattern value="yyyyMMdd-HH:mm:ss" />
          <!--最大文件大小-->
          <maximumFileSize value="10MB" />
          <staticLogFileName value="false"/>
          <!---定义布局模板-->
          <layout type="log4net.Layout.PatternLayout">
            <!--每条日志末尾的文字说明-->
            <footer value="by Alan_beijing" />
            <!--输出格式-->
            <!--样例:2008-03-26 13:42:32,111 [10] INFO  Log4NetDemo.MainClass [(null)] - info-->
            <conversionPattern value="记录时间:%date;文件名:%file;行号:%line;线程ID:[%thread];优先级:%priority;%newline
                                日志级别:%-5level;运行时间:%r;出错类:%logger property:[%property{NDC}];错误描述:%message" />
          </layout>
           
          <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="Error" />
            <param name="LevelMax" value="Error" />
          </filter>
        </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>
      </log4net>
    
      <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
        </startup>
    </configuration>

    四  推荐链接

    【01】http://logging.apache.org/log4net/

    五  服务区

    有喜欢的朋友,可以看一下,不喜欢的的朋友,勿喷,谢谢!!

  • 相关阅读:
    洛谷 P1474 货币系统 Money Systems 题解
    洛谷 P5146 最大差值 题解
    洛谷 P1880 [NOI1995]石子合并 题解
    洛谷 P1063 能量项链 题解
    洛谷 P3385 【模板】负环 题解
    洛谷 P1522 牛的旅行 Cow Tours 题解
    洛谷 P2212 [USACO14MAR]浇地Watering the Fields 题解
    浅谈 C 语言中模块化设计的范式
    内联函数(Inline Functions)
    C++中全局变量的声明和定义
  • 原文地址:https://www.cnblogs.com/wangjiming/p/8600935.html
Copyright © 2011-2022 走看看