(三)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的信息,甚至跳过…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
