.NET 7(C#)配置使用log4net日志框架的方法

log4net 是一个高效、灵活且广泛使用的日志记录库,专门用于 .NET 框架。它是 Apache 的一个开源项目Apache log4j框架在Microsoft .NET平台的实现。log4net 旨在提供一个简单、易用但功能强大的日志系统。本文主要介绍.NET 7 中配置使用log4net,以及相关示例代码。

1、安装引用log4net

使用log4net需要安装引用log4net,若是 ASP.NET Core 项目,则需要安装 Microsoft.Extensions.Logging.Log4Net.AspNetCore

1)log4net

在Nuget管理程序中,搜索 "log4net",然后点击安装。

2)Microsoft.Extensions.Logging.Log4Net.AspNetCore

在Nuget管理程序中,搜索 "Microsoft.Extensions.Logging.Log4Net.AspNetCore",然后点击安装。

2、log4net 配置文件

log4net 中配置文件可以使用XML格式的, 具体如下,

1)配置说明

配置项

类型

描述

rollingAppender

log4net.Appender.RollingFileAppender

滚动文件记录器,

用于将日志写入文件。

file

String

日志文件的路径和名称。

appendToFile

Boolean

是否追加内容到现有文件。

lockingModel

log4net.Appender.FileAppender+MinimalLock

文件锁定模型,

用于多线程环境。

rollingStyle

Composite

滚动文件的样式,

如按大小或日期。

datePattern

String

备份文件的日期格式。

maxSizeRollBackups

Int

最大备份文件数量。

maximumFileSize

String

单个文件的最大大小。

staticLogFileName

Boolean

是否使用静态日志文件名。

filter

log4net.Filter.LevelRangeFilter

日志级别范围过滤器。

layout

log4net.Layout.PatternLayout

日志的布局格式。

AdoNetAppender_SqlServer

log4net.Appender.AdoNetAppender

用于将日志写入SQL Server的记录器。

bufferSize

Int

缓冲区大小,

控制写入数据库的频率。

connectionType

String

数据库连接的类型。

connectionString

String

数据库连接字符串。

commandText

String

写入数据库的SQL命令文本。

priority

String

根记录器的优先级。

level

String

根记录器的日志级别。

appender-ref

String

引用的记录器名称。

2)Appender

类型

描述

log4net.Appender.AdoNetAppender

使用准备好的语句或存储过程将日志记录事件写入数据库。

log4net.Appender.AnsiColorTerminalAppender

将颜色突出显示的日志事件写入 ANSI 终端窗口。

log4net.Appender.AspNetTraceAppender

将日志记录事件写入 ASP 跟踪上下文。

然后可以在 ASP 页的末尾或在 ASP 跟踪页上呈现这些。

log4net.Appender.BufferingForwardingAppender

在将事件转发给子附加程序之前缓冲记录事件。

log4net.Appender.ColoredConsoleAppender

将日志记录事件写入应用程序的控制台。

事件可能会进入标准我们的流或标准错误流。

事件可能具有为每个级别定义的可配置文本和背景颜色。

log4net.Appender.ConsoleAppender

将日志记录事件写入应用程序的控制台。

事件可能会进入标准我们的流或标准错误流。

log4net.Appender.DebugAppender

将日志事件写入 .NET 系统。

log4net.Appender.EventLogAppender

将日志记录事件写入 Windows 事件日志。

log4net.Appender.FileAppender

将日志记录事件写入文件系统中的文件。

log4net.Appender.ForwardingAppender

将日志记录事件转发给子附加程序。

log4net.Appender.LocalSyslogAppender

将日志记录事件写入本地 syslog 服务(仅限 UNIX)。

log4net.Appender.MemoryAppender

将日志记录事件存储在内存缓冲区中。

log4net.Appender.NetSendAppender

将日志事件写入 Windows Messenger 服务。

这些消息显示在用户终端的对话框中。

log4net.Appender.OutputDebugStringAppender

将日志记录事件写入调试器。如果应用程序没有调试器,

系统调试器会显示该字符串。

如果应用程序没有调试器并且系统调试器未激活,

则忽略该消息。

log4net.Appender.RemoteSyslogAppender

使用 UDP 网络将日志记录事件写入远程系统日志服务。

log4net.Appender.RemotingAppender

使用 .NET 远程处理将日志记录事件写入远程接收器。

log4net.Appender.RollingFileAppender

将日志记录事件写入文件系统中的文件。

RollingFileAppender 可以配置为根据日期

或文件大小限制记录到多个文件。

log4net.Appender.SmtpAppender

将日志记录事件发送到电子邮件地址。

log4net.Appender.SmtpPickupDirAppender

将 SMTP 消息作为文件写入拾取目录。

然后可以通过 SMTP 代理

(例如 IIS SMTP 代理)读取和发送这些文件。

log4net.Appender.TelnetAppender

客户端通过 Telnet 连接以接收日志记录事件。

log4net.Appender.TraceAppender

将日志记录事件写入 .NET 跟踪系统。

log4net.Appender.UdpAppender

使用 UdpClient 将日志事件作为

无连接 UDP 数据报发送到远程主机或多播组。

3)log4net.Appender.RollingFileAppender

<?xml version="1.0" encoding="utf-8"?>
<log4net>

	<appender name="rollingAppender" type="log4net.Appender.RollingFileAppender">
		<file value="log4\app.log" />
	
		<appendToFile value="true" />
		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

		<!-- 可以为:Once|Size|Date|Composite -->
		<!-- Composite为Size和Date的组合 -->
		<rollingStyle value="Composite" />

		<!-- 当备份文件时,为文件名加的后缀 -->
		<datePattern value="yyyyMMdd.TXT" />

		<!-- 日志最大个数,都是最新的 -->
		<!-- rollingStyle节点为Size时,只能有value个日志 -->
		<!-- rollingStyle节点为Composite时,每天有value个日志 -->
		<maxSizeRollBackups value="20" />

		<!-- 可用的单位:KB|MB|GB -->
		<maximumFileSize value="3MB" />

		<!-- true时当前最新日志文件名永远为file配置项中的名字 -->
		<staticLogFileName value="true" />

		<!-- 输出级别的日志 -->
		<filter type="log4net.Filter.LevelRangeFilter">
			<param name="LevelMin" value="ALL" />
			<param name="LevelMax" value="FATAL" />
		</filter>
		<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
		</layout>

		<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
		</layout>

	</appender>
	<root>
		<!-- 控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF -->
		<!-- OFF:0 -->
		<!-- FATAL:FATAL -->
		<!-- ERROR: ERROR,FATAL -->
		<!-- WARN: WARN,ERROR,FATAL -->
		<!-- INFO: INFO,WARN,ERROR,FATAL -->
		<!-- DEBUG: INFO,WARN,ERROR,FATAL -->
		<!-- ALL: DEBUG,INFO,WARN,ERROR,FATAL -->
		<priority value="ALL"/>

		<level value="INFO"/>
		<appender-ref ref="rollingAppender" />
	</root>
</log4net>

2)log4net.Appender.ConsoleAppender

<?xml version="1.0" encoding="utf-8"?>
<log4net>

  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>

	<root>
		<!-- 控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF -->
		<!-- OFF:0 -->
		<!-- FATAL:FATAL -->
		<!-- ERROR: ERROR,FATAL -->
		<!-- WARN: WARN,ERROR,FATAL -->
		<!-- INFO: INFO,WARN,ERROR,FATAL -->
		<!-- DEBUG: INFO,WARN,ERROR,FATAL -->
		<!-- ALL: DEBUG,INFO,WARN,ERROR,FATAL -->
		<priority value="ALL"/>

		<level value="INFO"/>
		<appender-ref ref="ConsoleAppender" />
	</root>
</log4net>

3)log4net.Appender.SmtpAppender

<?xml version="1.0" encoding="utf-8"?>
<log4net>

  <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
    <to value="to@example.com" />
    <from value="from@example.com" />
    <subject value="Log4Net Error" />
    <smtpHost value="smtp.example.com" />
    <bufferSize value="512" />
    <lossy value="false" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>

	<root>

		<!-- 控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF -->
		<!-- OFF:0 -->
		<!-- FATAL:FATAL -->
		<!-- ERROR: ERROR,FATAL -->
		<!-- WARN: WARN,ERROR,FATAL -->
		<!-- INFO: INFO,WARN,ERROR,FATAL -->
		<!-- DEBUG: INFO,WARN,ERROR,FATAL -->
		<!-- ALL: DEBUG,INFO,WARN,ERROR,FATAL -->
		<priority value="ALL"/>

		<level value="INFO"/>
		<appender-ref ref="log4net.Appender.SmtpAppender" />
	</root>
</log4net>

3、log4net配置及使用示例

下面是log4net的配置文件配置及使用,如下,

using Microsoft.OpenApi.Models;

using NLog.Web;

var builder = WebApplication.CreateBuilder(args);

// 配置log4net

builder.Logging.AddLog4Net("log4net.Config");
builder.Services.AddControllers();


app.UseDefaultFiles();
app.UseStaticFiles();
app.MapControllers();

app.Run();

使用示例:

using Microsoft.AspNetCore.Mvc;
using UtilityWeb.API.Services;
using UtilityWeb.Core;

using UtilityWeb.Tools;

namespace UtilityWeb.API.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

        private readonly ILogger<WeatherForecastController> _logger;


        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<string> Get([FromServices] UtilityWebContext context,
            [FromServices] IUser userService,
            [FromServices] SwaggerService swaggerService)
        {
            _logger.LogError("error message");
            return new List<string>() { _logger.ToString() };
            
        }
    }
}

4、log4net 与NLog 对比

特性

NLog

log4net

性能

在高性能场景下表现更好,

特别是异步日志记录方面。

性能稳定,

但可能在某些高性能需求下逊色于NLog。

配置

灵活和动态的配置选项,

支持代码配置和外部文件配置。

通常基于 XML 文件配置,

功能强大但可能复杂。

扩展性

提供良好的支持,

易于添加自定义逻辑。

支持自定义扩展,

但可能不如NLog直观。

API

更现代和易于使用。

功能强大但可能对初学者较复杂。

文档

拥有广泛的文档和社区支持。

长期的用户基础,

但更新和社区活跃度可能不如NLog。

特性

支持结构化日志、

条件日志记录等高级功能。

提供丰富的日志记录功能,

但在现代日志需求上可能不够灵活。

成熟度

较新,但已稳定且不断更新。

较早开发的日志库,

具有更成熟的特性。

推荐

需要高性能、现代化API

或特定高级功能。

项目已使用log4net

或需要稳定且经过验证的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/270650.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pci_enable_device()

前言 在 PCI 总线下&#xff0c;当 PCIe 设备和 PCIe 驱动匹配后&#xff0c;就会执行驱动的 probe() 函数来初始化设备&#xff0c;以让设备正常运行。 在 probe() 函数中&#xff0c;最先做的事情就是执行 pci_enable_device() 来使能设备。如果设备都无法使能的话&#xff…

MES系统是什么?MES系统的功能有哪些?

在现代制造业的快速发展中&#xff0c;所有规模的企业都面临着类似的挑战&#xff1a;如何提高生产效率、确保产品质量、减少浪费、降低成本&#xff0c;同时迅速响应市场变化。而在这个过程中&#xff0c;传统企业管理往往有以下几个典型痛点&#xff1a; 纸质文件堆叠如山&a…

框架面试题

文章目录 1. spring中的bean是线程安全的吗2. 事务的实现--AOP3. 项目中用到的AOP4.spring中事务的失效场景5. Bean的生命周期6.spring中的循环引用问题7. springMVC的执行流程8. springboot自动装配原理9. 常见注解10 Mybatis11 Mybatis一二级缓存 1. spring中的bean是线程安全…

约束-练习题

练习1 已经存在数据库test04_emp&#xff0c;两张表emp2和dept2 CREATE DATABASE test04_emp; use test04_emp; CREATE TABLE emp2( id INT, emp_name VARCHAR(15) ); CREATE TABLE dept2( id INT, dept_name VARCHAR(15) );题目: 向表emp2的id列中添加PRIMARY KEY约束向表d…

前端---css 的介绍

1. css 的定义 css(Cascading Style Sheet)层叠样式表&#xff0c;它是用来美化页面的一种语言。 没有使用css的效果图 使用css的效果图 2. css 的作用 美化界面, 比如: 设置标签文字大小、颜色、字体加粗等样式。控制页面布局, 比如: 设置浮动、定位等样式。 3. css 的基本语…

【2024 行人重识别最新进展】ReID3D:首个关注激光雷达行人 ReID 的工作!

【2024 行人重识别最新进展】ReID3D&#xff1a;首个关注激光雷达行人 ReID 的工作&#xff01; 摘要&#xff1a;数据集&#xff1a;方法模型&#xff1a;多任务预训练&#xff1a;ReID Network&#xff1a; 实验结果&#xff1a;结论&#xff1a; 来源&#xff1a;Arxiv 2023…

[Linux] MySQL数据库之事务

一、事务的概念 事务就是一组数据库操作序列&#xff08;包含一个或者多个 SQL 操作命令&#xff09;&#xff0c;事务会把所有 操作看作是一个不可分割的整体向数据库系统提交或撤消操作&#xff0c;所有操作要么都执行&#xff0c;要么都不执行。 事务是一种机制、一个操作序…

Java 基础学习(十七)多线程高级

1 多线程并发安全&#xff08;续&#xff09; 1.1 synchronized方法 1.1.1 synchronized方法 与同步代码块不同&#xff0c;同步方法将子线程要访问的代码放到一个方法中&#xff0c;在该方法的名称前面加上关键字synchronized即可&#xff0c;这里默认的锁为this&#xff0…

短视频矩阵系统的崛起和影响

近年来&#xff0c;短视频矩阵系统已经成为了社交媒体中的一股新势力。这个新兴的社交媒体形式以其独特的魅力和吸引力&#xff0c;迅速吸引了大量的用户。这个系统简单来说就是将海量短视频整合在一个平台上&#xff0c;使用户可以方便地观看和分享好玩有趣的短视频。 短视频…

测试员有必要转测试开发吗?

为什么很多公司都在招测试开发&#xff1f; 质量保证和软件稳定性&#xff1a;测试开发人员在软件开发生命周期中扮演着关键的角色&#xff0c;他们负责编写和执行测试代码&#xff0c;以确保软件的质量和稳定性。他们可以帮助发现和修复潜在的问题和缺陷&#xff0c;提高软件…

短视频矩阵系统源码是如何运作的?

在当今数字化时代&#xff0c;短视频已经成为人们日常生活中的重要娱乐方式。而为了更好地满足用户需求以及提升使用体验&#xff0c;短视频平台需要依靠一个强大而高效的短视频矩阵系统。那么&#xff0c;这个系统又是如何运作的呢&#xff1f; 首先&#xff0c;短视频矩阵系…

[机器人-1]:开源MIT Min cheetah机械狗设计(一):系统方案及硬件解析

目录 一、MIT Min cheetah机械狗系统设计 1.1 指标需求 1.2 系统框图 1&#xff09;腿部硬件构成&#xff1a;机械狗每条腿 (共四条腿&#xff09; 2&#xff09; 数据通信转换板部分 2 STM32 * 2 CAN * (4 * 3)&#xff1a;FOC算法 3&#xff09;UP board 计算机板卡硬件…

【C++】explicit关键字

explicit关键字通常用于声明构造&#xff0c;是为了防止编译器进行隐式类型转换。 当加上explicit关键字后&#xff0c;只能显示的调用构造函数

Android---Kotlin 学习009

继承 在 java 里如果一个类没有被 final 关键字修饰&#xff0c;那么它都是可以被继承的。而在 kotlin 中&#xff0c;类默认都是封闭的&#xff0c;要让某个类开放继承&#xff0c;必须使用 open 关键字修饰它&#xff0c;否则会编译报错。此外在子类中&#xff0c;如果要复写…

09-为Java开疆拓土的ZGC深度剖析

文章目录 引言ZGC出现背景STW带来的问题手机系统(Android) 显示卡顿证券交易系统实时性要求大数据平台(Hadoop集群性能) 垃圾回收器的发展 ZGC介绍ZGC中JVM内存布局和设计为什么这么设计&#xff1f; ZGC支持NUMA&#xff08;了解即可&#xff09; ZGC的核心概念指针着色技术&a…

智能优化算法应用:基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工蜂鸟算法4.实验参数设定5.算法结果6.…

Redis源码精读:字符串

文章目录 前言代码位置核心类型SDS结构获取sds字符串的元数据的宏获取字符串长度重新设置sds长度创建字符串感悟最后 前言 Redis中实现了sds&#xff08;simple dynamic string&#xff09;这种字符串&#xff0c;它比c语言标准库的char*字符串更加实用 代码位置 src/sdc.h …

Ascon加解密算法分析

参数定义 加密架构图 整个过程是在处理320bits的数据&#xff0c;所以在最开始需要对原始的数据进行一个初始化&#xff0c;获得320bits的数据块&#xff0c; 图里看到的pa和pb都是在做置换&#xff08;对320bits的数据进行一个置换&#xff09; 置换&#xff08;Permutation&…

不可能得到的最短骰子序列

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 给你一个长度为 n 的整数数组 rolls 和一个整数 k 。你扔一个 k 面的骰子 n 次&#xff0c;…

Vue 封装echarts饼状图(Pie)组件

目的&#xff1a;减少重复代码&#xff0c;便于维护 效果显示&#xff1a; 组件代码 <template><div class"ldw-data-content-box"><div class"ldw-chilren-box"><div class"title"><div>{{ title }}</div>…
最新文章