日志

日志是一种可以追踪软件运行时发生事件的方法,开发人员可以向代码中调用日志记录相关的方法来表明发生了某些事情。

日志的种类有很多,本文主要介绍Log4net。

Log4net是一个从Java版的log4J移植过来的日志框架,可以简化日志的记录。Log4net是.net 下一个开源的日志记录组件。Log4net 将日志划分为不同等级,以不同格式,输出到不同的媒介。

  1. 级别: (日志级别从低到高)
    1. trace:跟踪信息
    2. debug:调试信息。  典型的应用场景:问题诊断
    3. info:普通的输出信息。 记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
    4. warn:警告信息。  当某些不期望的事情发生时记录的信息(如:磁盘可用空间较低),但是此时应用程序还是正常运行的。
    5. error:错误信息 。 由于一个严重的问题导致某些功能不能正常运行时记录的信息
    6. fatal:致命性的错误。 整个系统即将/完全崩溃
  2. 特殊级别:
    1. all:全部显示
    2. off:全部不显示

滚动日志:日志存储有限定值,总是替换最老的日志文件。

栗子:限定存储200个日志文件,当201个文件要进来存储的时候就要把第一个日志文件替换掉从而实现存储。

Appenders用来定义日志的输出方式,即日志要写到那种介质上去。

appender:可以把日志输出到控制台,文件,数据库,ftp服务器,甚至可以把日志输出到邮件,短信等。不同的输出场景就是不同的appender,可以添加多个appender,可以设定不同的级别使用不同的appender。

日志的作用
  • 通过记录和分析日志可以了解一个系统或软件程序运行情况是否正常
  • 可以在应用程序出现故障时快速定位问题,同时方便故障分析
  • 如果应用的日志信息足够详细和丰富,还可以用来做用户行为分析

日志应用实例:

1、在VS中建立一个控制台应用程序,要用log4net,需要在项目中应用Log4net的包,本项目中应用的是V2.0.8版本。

Log4net日志_IT

安装完成之后,发现app_config中并没有自动帮我们配置好,需要自己手动进行配置:

Log4net日志_IT_02

然后在configuration节点下配置如下:

 <!--sophia 添加 2019年2月26日14:23:53-->
  <log4net>
    <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->      <!--等级:左高右低-->
    <!-- Set root logger level to ERROR and its appenders -->
    <root>
      <level value="DEBUG" />    <!--高于debug日志的日志信息都会被记录下来-->
      <appender-ref ref="RollingFileTracer" />
    </root>
    <!-- Print only messages of level DEBUG or above in the packages -->
    <appender name="RollingFileTracer" type="log4net.Appender.RollingFileAppender,log4net">   <!--将日志以回滚文件的形式写到文件中-->
      <param name="File" value="App_Data/Log/" />    <!--生成的日志文件的位置-->
      <param name="AppendToFile" value="true" />   <!--附加文件-->
      <param name="RollingStyle" value="Date" />   <!--根据日期来进行滚动-->
      <param name="MaxSizeRollBackups" value="10" />  <!--最多允许保存10个日志文件-->
      <param name="MaximumFileSize" value="1MB" />  <!--每个文件最大的大小为1MB-->
      <param name="DatePattern" value="&quot;Logs_&quot;yyyyMMdd&quot;.txt&quot;" />  <!--设置生成的日志文件的格式--> 
      <param name="StaticLogFileName" value="false" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
      </layout>
    </appender>
  </log4net>

完整的APP_config文件内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <!--一定要在头部添加-Sophia-2019年2月26日14:44:05-->
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>

    <!--sophia 添加 2019年2月26日14:24:25-->
  <!--<configSections>
    <sectionGroup name="coreSettings" type="CodeCarvings.Piczard.Configuration.CoreS">
      <section name="coreSettings" type="CodeCarvings.Piczard.ConfigurationSectionHandler,CodeCarvings"/>
    </sectionGroup>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>-->

  <!--sophia 添加 2019年2月26日14:23:53-->
  <log4net>
    <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->      <!--等级:左高右低-->
    <!-- Set root logger level to ERROR and its appenders -->
    <root>
      <level value="DEBUG" />    <!--高于debug日志的日志信息都会被记录下来-->
      <appender-ref ref="RollingFileTracer" />
    </root>
    <!-- Print only messages of level DEBUG or above in the packages -->
    <appender name="RollingFileTracer" type="log4net.Appender.RollingFileAppender,log4net">   <!--将日志以回滚文件的形式写到文件中-->
      <param name="File" value="App_Data/Log/" />    <!--生成的日志文件的位置-->
      <param name="AppendToFile" value="true" />   <!--附加文件-->
      <param name="RollingStyle" value="Date" />   <!--根据日期来进行滚动-->
      <param name="MaxSizeRollBackups" value="10" />  <!--最多允许保存10个日志文件-->
      <param name="MaximumFileSize" value="1MB" />  <!--每个文件最大的大小为1MB-->
      <param name="DatePattern" value="&quot;Logs_&quot;yyyyMMdd&quot;.txt&quot;" />  <!--设置生成的日志文件的格式--> 
      <param name="StaticLogFileName" value="false" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
      </layout>
    </appender>
  </log4net>

</configuration>

2、程序启动时,要从APP.config/Web.config中加载log4net的配置,所以在program.cs中切勿遗漏此行代码:

log4net.Config.XmlConfigurator.Configure();

在主函数中添加不同种类的日志,让其输出:

using log4net;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ZSZ;


namespace ZSZ.test
{
   public class Program
    {
       public static void Main(string[] args)
        {
            // string s = CommonHelper.CreateVerifyCode(4);
            log4net.Config.XmlConfigurator.Configure();   //项目启动,从APP.config/Web.config中加载log4net的配置
            ILog log= LogManager.GetLogger(typeof(Program));//传入类名
            log.Debug("飞行高度1000米");
            log.Warn("油压不足");
            log.Error("引擎失灵");
            log.DebugFormat("当前数据有问题,{0}","aaaaa");
            log.Debug("超载");
            log.Warn("硬件故障");
            log.Error("方向盘失灵");

            try
            {
                SqlConnection conn = new SqlConnection();
                conn.Open();
            }
            catch (Exception ex)
            {
                log.Error("连接数据库失败",ex);
            }

            Console.WriteLine("ok");
            Console.ReadKey();
        }
    }
}

由于配置文件中定义的日志输出路径为:bin文件——>debug文件——>App_Data——>Log文件下,启动程序,打开此路径会发现新生成了一个新的文件夹logs_20180301.txt

Log4net日志_IT_03

打开日志文件,内容显示如下:

Log4net日志_IT_04