欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# 使用 log4net 日志组件的方法

程序员文章站 2022-03-24 10:36:35
一、 什么是 log4net apache log4net 库是帮助程序员将日志语句输出到各种输出目标的工具,它是从java中的log4j迁移过来的一个.net版的开源日志框架。log4net 的一个...

一、 什么是 log4net 

      apache log4net 库是帮助程序员将日志语句输出到各种输出目标的工具,它是从java中的log4j迁移过来的一个.net版的开源日志框架。log4net 的一个显著特征是分层记录器的概念,使用这些记录器可以有选择地控制任意粒度输出日志语句。主要特征如下:

  • 支持多个框架
  • 输出到多个日志记录目标
  • 分层日志记录体系结构
  • xml 配置
  • 动态配置
  • 日志记录上下文
  • 久经考验的架构
  • 模块化和可扩展设计
  • 高性能和灵活性   

二、c# 使用 log4net

       添加nuget 包,搜索到“log4net”后 ,选择安装,具体如下图所示:

C# 使用 log4net 日志组件的方法

三、添加 log4net 配置文件

 使用 log4net需要我们配置log4net的配置文件,目前,配置文件是用 xml 编写的。一般有两种方式,一种是使用og4net自动生成的 “log4net.xml”进行配置,另一种是直接嵌入到运行程序的 app.config 文件中。   C# 使用 log4net 日志组件的方法

 具体内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <configsections>
  <section name="log4net" type="log4net.config.log4netconfigurationsectionhandler, log4net"/>
 </configsections>
 <startup>
  <supportedruntime version="v4.0" sku=".netframework,version=v4.5" />
 </startup>
 <log4net>
  <!-- off, fatal, error, warn, info, debug, all -->
  <!-- set root logger level to error and its appenders -->
  <root>
   <level value="all" />
   <appender-ref ref="sysappender" />
  </root>
  <!-- print only messages of level debug or above in the packages -->
  <logger name="weblogger">
   <level value="debug" />
  </logger>
  <appender name="sysappender" type="log4net.appender.rollingfileappender,log4net">
   <param name="file" value="log/" />
   <param name="appendtofile" value="true" />
   <param name="rollingstyle" value="date" />
   <param name="datepattern" value="'demo_'yyyy_mm_dd-hh'.log'" />
   <param name="staticlogfilename" value="false" />
   <param name="rollingstyle" value="composite" />
   <layout type="log4net.layout.patternlayout,log4net">
    <param name="conversionpattern" value="%date [th=%3thread] [line:%5l] [%-5level] %message%newline"/>
   </layout>
  </appender>
  <appender name="consoleapp" type="log4net.appender.consoleappender,log4net">
   <layout type="log4net.layout.patternlayout,log4net">
    <param name="conversionpattern" value="%d [%t] %-5p %c - %m%n" />
   </layout>
  </appender>
 </log4net>
</configuration>

主要参数含义如下:

C# 使用 log4net 日志组件的方法

三、源码测试

       我们可以添加一个日志类,专门用于输出日志打印,具体代码如下(注意:log4net目前暂时不支持通过配置文件进行文件删除,可通过配置文件设置文件个数与大小进行覆盖备份文件。因此,自动删除日志需要代码实现):

public static class logutil
  {
    private static log4net.ilog log { get; } = log4net.logmanager.getlogger("log");

    /// <summary>
    /// 日志加载设置
    /// </summary>
    /// <param name="execonfigfile">日志配置文件名称</param>
    /// <param name="day">保留天数,-1表示不删除</param>
    public static void configure(string execonfigfile,int day=-1)
    {
      log4net.config.xmlconfigurator.configure(new system.io.fileinfo(execonfigfile));
      if (day == -1) return;
      var files = new system.io.directoryinfo("log").getfiles();
      foreach (var file in files)
      {
        // 定时删除日志文件
        if ((datetime.now - file.creationtime).totaldays > day)
        {
          file.delete();
        }
      }
    }

    private static string getmethodname(int skipframes = 2)
    {
      try
      {
        // 这里忽略skipframes层堆栈,也就忽略了当前方法getmethodname,以及调用此方法的方法,这样拿到的就正好是外部调用打印日志所在函数的方法信息
        var method = new stackframe(skipframes).getmethod();
        var properties =
          method?.declaringtype?.getproperties(
            bindingflags.instance |
            bindingflags.static |
            bindingflags.public |
            bindingflags.nonpublic);
        var property = properties?.where(p => p.getgetmethod(true) == method || p.getsetmethod(true) == method)
          .firstordefault();

        var name = $"{method?.declaringtype?.tostring().split('.').last()}.{method?.name}";
        return property == null
          ? $"{name,-50}"
          : $"{property.name,-50}";
      }
      catch (exception e)
      {
        return "error to get calling method";
      }
    }
    private static string nowarp(string msg)
    {
      return msg?.replace("\r\n", " ").replace("\n", " ");
    }
    private static string wrapexception(string msg, exception e)
    {
      var builder = new stringbuilder(msg);
      builder.append("\t[").append(e.message).append("]");
      if (e.innerexception != null)
      {
        builder.append(" --> [").append(e.innerexception.message).append("]");
      }

      return builder.tostring();
    }




    public static void debug(string msg)
    {
      log.debug(msg);
    }
    public static void debug(string msg, exception e)
    {
      log.debug(wrapexception(msg, e), e);
    }

    public static void info(string msg)
    {
      log.info(msg);
    }
    public static void info(string msg, exception e)
    {
      log.info(wrapexception(msg, e), e);
    }

    public static void warn(string msg)
    {
      log.warn(msg);
    }
    public static void warn(string msg, exception e)
    {
      log.warn(wrapexception(msg, e), e);
    }

    public static void error(string msg)
    {
      log.error(msg);
    }
    public static void error(string msg, exception e)
    {
      log.error(wrapexception(msg, e), e);
    }

    public static void fatal(string msg)
    {
      log.fatal(msg);
    }
    public static void fatal(string msg, exception e)
    {
      log.fatal(wrapexception(msg, e), e);
    }
  }

 测试代码如下:

static void main(string[] args)
    {
      try
      {
        string execonfigfile = $"{appdomain.currentdomain.basedirectory}//log4netdemo.exe.config";

        if (file.exists(execonfigfile) == false)
        {
          throw new exception($"应用程序配置文件 [{execonfigfile}] 不存在,无法加载日志 log4net 的配置");
        }

        logutil.configure(execonfigfile,1);
        logutil.info("====================================== log4netdemo started, log4net setup...");
        logutil.warn("程序启动入参不合理");
        logutil.error("程序启动失败");

        console.readkey();
      }
      catch (exception ex)
      {
        console.writeline(ex);
        logutil.error("程序加载失败",ex);
      }
    }

运行程序后,实际输出效果如下:

C# 使用 log4net 日志组件的方法

以上就是c# 使用 log4net 日志组件的方法的详细内容,更多关于c# 使用 log4net 日志组件的资料请关注其它相关文章!