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

一、 什么是 log4net

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

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

二、C# 使用 log4net

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

三、添加 log4net 配置文件

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

具体内容如下:

<?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>

主要参数含义如下:

三、源码测试

我们可以添加一个日志类,专门用于输出日志打印,具体代码如下(注意: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 日志组件的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#实现Log4Net日志分类和自动维护实例

    本文实例讲述了C#实现Log4Net日志分类和自动维护的实现方法.分享给大家供大家参考.具体实现方法如下: 一.背景 在程序中,我们调试运行时信息,Log4Net是一个不错的解决方案.不知道是我用的不好,用到最后反而都不想看日志了.原因是因为我n个功能使用的默认的Logger来记录日志,这样以来,所有功能记录的信息都依赖同一个配置,于是所有的信息都在一个文件中,有时候查找起来,极其不方便. 我想,能不能按照功能分类呢?如果通过配置不同的logger,然后功能根据不同的LoggerName加载Il

  • C#控制台程序使用Log4net日志组件详解

    C#控制台程序使用Log4net日志组件,供大家参考,具体内容如下 1.Log4net一般都不陌生,但是在配置上不同类型的项目又不相同的地方比如C#控制台程序和C# MVCWeb项目,拿控制台项目为例 项目源码在文章底部 2.首先创建一个控制台程序,引入Log4net.dll --使用NuGet 3.进行一些简单的配置,在App.config文件中配置,如果大家没有App.config文件,可以通过在解决方案中,添加新建项→应用程序配置文件,进行添加. <?xml version="1.0

  • C#中四步轻松使用log4net记录本地日志的方法

    在这里,记录我在项目中使用log4net记录本地日志的步骤.在不会之前感觉很难,很神秘,一旦会了之后其实没那么难.其实所有的事情都是一样的,下面我就分享一下我使用log4Net的经验. 第一步:首先从Visual Studio中的Nuget包管理中搜索下载 Log4Net dll文件 如下图: 选择安装的项目(哪个类库中需要记录日志就勾选上) 第二步:打开配置文件 WinFrom就是 App.config Web就是 web.config 将以下配置信息加入 <configSections>

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

    一. 什么是 log4net Apache log4net 库是帮助程序员将日志语句输出到各种输出目标的工具,它是从Java中的Log4j迁移过来的一个.Net版的开源日志框架.log4net 的一个显著特征是分层记录器的概念,使用这些记录器可以有选择地控制任意粒度输出日志语句.主要特征如下: 支持多个框架 输出到多个日志记录目标 分层日志记录体系结构 XML 配置 动态配置 日志记录上下文 久经考验的架构 模块化和可扩展设计 高性能和灵活性 二.C# 使用 log4net 添加Nuget 包,

  • 基于Windows C++ 应用程序通用日志组件的使用详解

    引言 在如何记录程序日志方面,通常有三种选择: 1.采用Log4CXX等公共开源日志组件:这类日志组件的特点是跨平台且功能比较强大,例如可以把日志发往另一台服务器或记录到数据库中等:另外,可配置性较高,可以通过配置文件或程序代码对日志进行很多个性化设置.但从另外一个角度看,由于这些优点往往也导致了在使用方面的缺点.首先,对于一般应用程序来说,它们并不需要太多的功能,通常只需要把日志记录到文件或反馈到应用程序,功能太多反正让用户使用起来觉得繁琐还得背负很多从来都用不到的代码.其次,这类日志组件通常

  • 在.NET 6中使用日志组件log4net的方法

    本文将简单介绍在.NET 6中使用log4net的方法,具体见下文范例. 1.首先新建一个ASP.NET Core空项目 2.通过Nuget包管理器安装下面两个包 log4net Microsoft.Extensions.Logging.Log4Net.AspNetCore 3.在项目根目录下新建log4net的配置文件log4net.config,并将其设置为始终复制. <?xml version="1.0" encoding="utf-8" ?> &

  • C#使用日志组件log4net

    目录 一.概述 1.下载与版本 2.Log4net的结构 3.日志的级别 二.建立log4net配置文件 1.配置文件 2.Logger 3.Appender 4.PatternLayout中的转换模式 三.定义配置文件 1.在Winfrom中,在AssemblyInfo.cs中添加如下代码: 2.在asp.net中,在Global.asax文件中的Application_Start方法中增加: 四.调用log4net写日志 1.创建或获取日志对象 2.输出日志信息 五.更改Appender设置

  • express默认日志组件morgan的方法

    章节概览 morgan是express默认的日志中间件,也可以脱离express,作为node.js的日志组件单独使用.本文由浅入深,内容主要包括: morgan使用入门例子 如何将日志保存到本地文件 核心API使用说明及例子 进阶使用:1.日志分割 2.将日志写入数据库 源码剖析:morgan的日志格式以及预编译 入门例子 首先,初始化项目. npm install express morgan 然后,在basic.js中添加如下代码. var express = require('expre

  • 详解.Net core2.0日志组件Log4net、Nlog简单性能测试

    .Net core之Log4net.Nlog简单性能测试 比较log4net.nlog的文件写入性能(.netcore环境),涉及代码和配置如有不正确的地方,还请批评指正. 测试环境 开发工具: Vsual Studio 2017 15.3 框架版本: .net core 2.0 操作系统:window10 Enterprise 1703 硬件配置:CPU I3-4170 3.7GHz,内存 8G,固态硬盘 日志组件 log4net 2.0.8 nlog 5.0.0-beta10 测试用例 1.

  • .NET6在WebApi中使用日志组件log4net

    目录 1.安装依赖 2.配置文件 3.注册组件 4.使用 1.安装依赖 Microsoft.Extensions.Logging.Log4Net.AspNetCore 2.配置文件 <?xml version="1.0" encoding="utf-8" ?> <configuration> <!-- This section contains the log4net configuration settings --> <

  • C# 使用Log4net添加日志记录的方法

    目录 一.Log4net 二.使用日志库 1. 添加库 2. 配置log4net 3. 使用log4net 4. 结果 一.Log4net 官方网站:https://logging.apache.org/log4net/. 下载二进制dll库: 包中提供了针对各个版本的dll库: 二.使用日志库 1. 添加库 复制对应的库文件到项目中: 2. 配置log4net 2.1. 创建配置文件 添加后修改该文件设置: 2.2. 修改配置文件 替换文件为以下内容,设置为日志文件输出: <?xml vers

  • 详解.Net Core中的日志组件(Logging)

    1.介绍 Logging组件是微软实现的日志记录组件包括控制台(Console).调试(Debug).事件日志(EventLog)和TraceSource,但是没有实现最常用用的文件记录日志功能(可以用其他第三方的如NLog.Log4Net.之前写过NLog使用的文章). 2.默认配置 新建.Net Core Web Api项目,添加下面代码. [Route("api/[controller]")] public class ValuesController : Controller

随机推荐