(三)Apache log4net™ 手册 -演示
0、引言
在开始本文之前,推荐您首先阅读 Apache log4net™ 手册中有关 介绍 与 配置 的相关内容。本文将通过实践分别为您演示如何使用 Visual Studio 2022 在 .NET Framework 项目和 .NET 项目下配置并使用 Log4Net。
1、为 .NET Framework 项目配置 Log4Net
1.1、先决条件
- 一个简单的 .NET Framework 项目(比如:控制台应用(.NET Framework))
1.2、引用 Log4Net NuGet 包
-
在 1.1 小节中,笔者创建了一个新的 .NET Framework 控制台项目。解决方案名称为 “Log4NetDemo”, 项目名称为 “ConsoleApp4DotNetFramework”:

项目目标框架为 .NET Framework 4.8.1
-
前往 Visual Studio 菜单栏的【工具】-【NuGet 包管理器】-【管理解决方案的 NuGet 程序包】:

-
在打开的标签页中切换到【浏览】页面,搜索 “Log4Net” 并选中;在右方的配置页面勾选要安装的项目,点击【安装】按钮:

-
安装完成后,可以看到解决方案资源管理器内新增了一个
package.config文件:
内容如下:
1.3、配置 Log4Net
-
完成 1.2 小节的内容后,在解决方案资源管理器内右击项目名称,点击【添加】-【新建项】。在打开的对话框中搜索找到“应用程序配置文件” C# 项,修改文件名为
log4net.config,点击【添加】:
-
在解决方案资源管理器内右击
log4net.config,点击【属性】,将“复制到输出目录”属性的值修改为“如果较新则复制”:
-
双击打开
log4net.config文件,将其修改为以下内容并保存:<?xml version="1.0" encoding="utf-8" ?> <log4net><!-- 定义一个控制台 appender --><appender name="Console" type="log4net.Appender.ConsoleAppender"><!-- 日志输出格式 --><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%5level [%thread] (%file:%line) - %message%newline" /></layout></appender><!-- 定义一个文件 appender --><appender name="RollingFile" type="log4net.Appender.RollingFileAppender"><!-- 保存文件的名称 --><file value="example.log" /><appendToFile value="true" /><!-- 文件的编码方式 --><param name="Encoding" value="UTF-8"/><!-- 每个文件的大小 --><maximumFileSize value="100KB" /><!-- 保存文件数量 --><maxSizeRollBackups value="2" /><!-- 日志输出格式 --><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%level %thread %logger - %message%newline" /></layout></appender><!-- 定义 root logger 的配置 --><root><!-- 定义 root logger 的日志级别 --><level value="ALL" /><!-- 引用 Console appender --><appender-ref ref="Console" /><!-- 引用 RollingFile appender --><appender-ref ref="RollingFile" /></root> </log4net> -
在解决方案资源管理器内展开项目下的
Properties属性文件夹,可以看到下属有一个AssemblyInfo.cs的文件,双击打开该文件:
-
在该文件的末尾附加如下内容并保存:
// 指定log4net 的配置文件 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
1.4、测试 Log4Net
-
在解决方案资源管理器内双击打开
Program.cs,将其修改为以下内容并保存:using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp4DotNetFramework {internal class Program{// 定义一个静态 logger 变量,其引用名为 "Program" 的 Logger 实例private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));static void Main(string[] args){log.Debug("开始调试");log.Info("Entering application.");log.Warn("警告");log.Error("错误", new Exception("异常信息"));log.Fatal("致命错误", new Exception("异常信息"));Console.ReadKey();}} } -
运行项目,将得到以下输出:

-
在应用程序的基目录将会生成一个名为
example.log的日志文件,内容如下:
2、为 .NET 项目配置 Log4Net
2.1、先决条件
- 一个简单的 .NET 项目(比如:使用 Visual Studio 创建 .NET 控制台应用程序)。
2.2、引用 Log4Net NuGet 包
-
在 2.1 小节中,笔者在解决方案 “Log4NetDemo” 中继续新建了一个 .NET 控制台项目, 项目名称为 “ConsoleApp4DotNet”。设置该项目为启动项目:

目标框架为 .NET 6.0
-
前往 Visual Studio 菜单栏的【工具】-【NuGet 包管理器】-【管理解决方案的 NuGet 程序包】:

-
在打开的标签页中切换到【已安装】页面,选中 “Log4Net”;在右方的配置页面勾选要安装的项目,点击【安装】按钮:

-
安装完成后,在解决方案资源管理器内双击项目名称打开项目(
.csproj)文件,可以看到项目文件中添加了对 Log4Net NuGet 包的引用:
package.configorPackageReference?
2.3、配置 Log4Net
-
完成 2.2 小节的内容后,在解决方案资源管理器内右击项目名称,点击【添加】-【新建项】。在打开的对话框中搜索找到“应用程序配置文件” C# 项,修改文件名为
log4net.config,点击【添加】:
-
在解决方案资源管理器内右击
log4net.config,点击【属性】,将“复制到输出目录”属性的值修改为“如果较新则复制”:
-
双击打开
log4net.config文件,将其修改为以下内容并保存:<?xml version="1.0" encoding="utf-8" ?> <log4net><!-- 定义一个控制台 appender --><appender name="Console" type="log4net.Appender.ConsoleAppender"><!-- 日志输出格式 --><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%5level [%thread] (%file:%line) - %message%newline" /></layout></appender><!-- 定义一个文件 appender --><appender name="RollingFile" type="log4net.Appender.RollingFileAppender"><!-- 保存文件的名称 --><file value="example.log" /><appendToFile value="true" /><!-- 文件的编码方式 --><param name="Encoding" value="UTF-8"/><!-- 每个文件的大小 --><maximumFileSize value="100KB" /><!-- 保存文件数量 --><maxSizeRollBackups value="2" /><!-- 日志输出格式 --><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%level %thread %logger - %message%newline" /></layout></appender><!-- 定义 root logger 的配置 --><root><!-- 定义 root logger 的日志级别 --><level value="ALL" /><!-- 引用 Console appender --><appender-ref ref="Console" /><!-- 引用 RollingFile appender --><appender-ref ref="RollingFile" /></root> </log4net> -
由于 .NET Core 项目中,
AssemblyInfo.cs文件是自动生成的。所以我们无法在解决方案树内找到该文件。我们可以选择关闭自动生成(参考这里),手动创建。不过还是算了,让我们直接使用编程方式指定 log4net 的配置文件吧(见下一节)。AssemblyInfo.cs(参考这里以及这里),最后使用 assembly-level attribute 来配置 log4net
2.4、测试 Log4Net
-
在解决方案资源管理器内双击打开
Program.cs,将其修改为以下内容并保存:public class Program {// 定义一个静态 logger 变量,其引用名为 "Program" 的 Logger 实例private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));static void Main(string[] args){// 使用 XmlConfigurator 直接读取 XML 文件并使用它来配置 log4netlog4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));log.Debug("开始调试");log.Info("Entering application.");log.Warn("警告");log.Error("错误", new Exception("异常信息"));log.Fatal("致命错误", new Exception("异常信息"));} } -
运行项目,将得到以下输出:

-
在应用程序的基目录将会生成一个名为
example.log的日志文件,内容如下:
相关文章:
(三)Apache log4net™ 手册 -演示
0、引言 在开始本文之前,推荐您首先阅读 Apache log4net™ 手册中有关 介绍 与 配置 的相关内容。本文将通过实践分别为您演示如何使用 Visual Studio 2022 在 .NET Framework 项目和 .NET 项目下配置并使用 Log4Net。 1、为 .NET Framework 项目配置 Log4Net 1.1…...
VScode远程root权限调试
尝试诸多办法无法解决的情况下,允许远程登陆用户直接以root身份登录 编辑sshd_config文件 sudo vim /etc/ssh/sshd_config 激活配置 注释掉PermitRootLogin without-password,即#PermitRootLogin without-password 增加一行:PermitRootLo…...
【ARM CoreLink 系列 7 -- TZC-400控制器简介】
文章目录 背景介绍1.1 TZC-400 简介1.2 TZC-400 使用示例1.3 TZC-400 interfaces1.3.1 FPID1.3.2 NSAID Regionregion 检查规则 1.4 Features1.5 Register summary1.6 TZC-400和TZPC和TZASC区别 背景介绍 为了确保内存能够正确识别总线的信号控制位,新增一个TrustZ…...
【C++】-c++11的知识点(中)--lambda表达式,可变模板参数以及包装类(bind绑定)
💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …...
浅析倾斜摄影三维模型(3D)几何坐标精度偏差的几个因素
浅析倾斜摄影三维模型(3D)几何坐标精度偏差的几个因素 倾斜摄影是一种通过倾斜角度较大的相机拍摄建筑物、地形等场景,从而生成高精度的三维模型的技术。然而,在进行倾斜摄影操作时,由于多种因素的影响,导致…...
【广州华锐互动】智轨列车AR互动教学系统
智轨列车,也被称为路面电车或拖电车,是一种公共交通工具,它在城市的街头巷尾提供了一种有效、环保的出行方式。智轨列车的概念已经存在了很长时间,但是随着科技的发展,我们现在可以更好地理解和欣赏它。通过使用增强现…...
驾驶数字未来:汽车业界数字孪生技术的崭新前景
随着数字化时代的到来,汽车行业正经历着前所未有的变革。数字孪生技术,作为一种前沿的数字化工具,正在为汽车行业带来革命性的影响,不仅改变着汽车制造和维护的方式,也为消费者带来了前所未有的体验。让我们一起探讨&a…...
JVM 性能调优参数
JVM分为堆内存和非堆内存 堆的内存分配用-Xms和-Xmx -Xms分配堆最小内存,默认为物理内存的1/64; -Xmx分配最大内存,默认为物理内存的1/4。 非堆内存分配用-XX:PermSize和-XX:MaxPermSize -XX:PermSize分配非堆最小内存,默认为物理…...
11在SpringMVC中响应到浏览器的数据格式,@ResponseBody注解和@RestController复合注解的功能详解
响应数据/转发或重定向页面 参考文章数据交换的常见格式,如JSON格式和XML格式 服务器将接收到请求处理完以后需要将处理结果告知给浏览器即响应,通常有响应要转发/重定向到的页面和响应数据(文本数据/json数据)两种方式 如果控制器方法返回值类型为void并且没有通过response…...
go 流程控制之switch 语句介绍
go 流程控制之switch 语句介绍 文章目录 go 流程控制之switch 语句介绍一、switch语句介绍1.1 认识 switch 语句1.2 基本语法 二、Go语言switch语句中case表达式求值顺序2.1 switch语句中case表达式求值次序介绍2.2 switch语句中case表达式的求值次序特点 三、switch 语句的灵活…...
sql 时间有偏差的解决方法
测试功能的时候发现记录的创建时间不对,死活对不上,下意识的以为是服务器时间有偏差,后来排查发现存入表中的时间是正常的,但是查询展示出来的时间是不对的,就去排查可能是查询sql格式化时间有问题,果不其然…...
Apache Lucene 7.0 - 索引文件格式
Apache Lucene 7.0 - 索引文件格式 文章目录 Apache Lucene 7.0 - 索引文件格式介绍定义反向索引字段类型段文档数量索引结构概述文件命名文件扩展名摘要锁文件 原文地址 介绍 这个文档定义了在这个版本的Lucene中使用的索引文件格式。如果您使用的是不同版本的Lucene…...
GEE:使用中文做变量和函数名写GEE代码
作者:CSDN _养乐多_ 啊?最近在编写GEE代码的时候,无意中发现 JavaScript 已经能够支持中文字符作为变量名和函数名,这个发现让我感到非常兴奋。这意味着以后在编程过程中,我可以更自由地融入中文元素,不再…...
针对量化交易SDK的XTP的初步摸索
这东西只要是调用API实现自动交易股票的,就不可能免费的接口。 并且用这些接口实现自动交易还得 归证券公司监管。比如 xtp出自 中泰证券,那么如果用xtp实现自动交易股票的软件,具体操作实盘的时候 不能跑再自己的电脑上,必须跑在…...
Unity编辑器从PC平台切换到Android平台下 Addressable 加载模型出现粉红色,类似于材质丢失的问题
Unity编辑器在PC平台下使用Addressable加载打包好的Cube,运行发现能正常显示。 而在切换到Android平台下,使用Addressable时加载AB包,生成Cube对象时,Cube模型呈现粉红色,出现类似材质丢失的问题。如下图所示。 这是…...
CSS 边框
CSS 边框属性 CSS边框属性允许你指定一个元素边框的样式和颜色。 在四边都有边框 红色底部边框 圆角边框 左侧边框带宽度,颜色为蓝色 边框样式 边框样式属性指定要显示什么样的边界。 border-style属性用来定义边框的样式 border-style 值: none: 默认无边框…...
Docker逃逸---CVE-2020-15257浅析
一、产生原因 在版本1.3.9之前和1.4.0~1.4.2的Containerd中,由于在网络模式为host的情况下,容器与宿主机共享一套Network namespace ,此时containerd-shim API暴露给了用户,而且访问控制仅仅验证了连接进程的有效UID为0ÿ…...
Python学习 day03(注意事项)
数据容器 列表...
vue中的生命周期有什么,怎么用
Vue.js 的生命周期(lifecycle)是指 Vue 实例从创建到销毁的整个过程。Vue.js 常用的生命周期包括: beforeCreate:在实例被创建之前调用,此时组件的数据观测和事件机制都未被初始化。created:在实例创建完成…...
论文阅读:ECAPA-TDNN
1. 提出ECAPA-TDNN架构 TDNN本质上是1维卷积,而且常常是1维膨胀卷积,这样的一种结构非常注重context,也就是上下文信息,具体而言,是在frame-level的变换中,更多地利用相邻frame的信息,甚至跳过…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
