【C#】.net core 6.0 使用第三方日志插件Log4net,配置文件详细说明
欢迎来到《小5讲堂》
大家好,我是全栈小5。
这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解,
特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。
温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!
目录
- 背景
- 占位符
- 文件锁定
- 输出控制台
- 简单输出
- 详细输出
- 输出到文档
- 自定义文件名
- 文件大小
- 相关文章
背景
最近在最一些并发方式的测试,发现自己之前封装的一个日志插件报错,
尽管在写日志时已经通过锁的方式进行了优化,但是依然无法解决并发时同一个文件同时访问情况,
会频繁出现报错提示xxx.txt文件正在被另一个进程访问而不无法操作。
基于这个原因,暂时没有想好很好的优化方案,从而考虑使用第三方优秀日志插件来解决并发情况。
本篇文章主要来分析下Log4net日志插件的配置文件信息。
占位符
在 log4net 中,占位符是在日志输出时使用,它们会被实际的值替换。
在 .NET Core 6.0 中使用 log4net,可以在 layout 元素的 ConversionPattern 属性中使用如下占位符:
1.%date
输出日志时间戳,格式为 yyyy-MM-dd HH:mm:ss,fff。
2.%level
输出日志级别,如 INFO、DEBUG、WARN、ERROR、FATAL。
3.%logger
输出日志记录器名称。
4.%message
输出日志消息。
5.%exception
输出异常信息。
6.%identity
输出当前用户(或线程)身份标识。
7.%username
输出当前 Windows 用户名。
8.%property{key}
输出指定键名的 log4net 属性值。
9.%method
输出正在运行的方法名。
10.%line
输出正在运行的方法的行号。
11.%class
输出正在运行的方法所在的类名。
12.%file
输出正在运行的方法所在的文件名。
文件锁定
在 log4net 配置中,
lockingModel 标签用于定义日志文件的锁定行为,它会影响多个线程或进程同时对日志文件进行写入操作时的行为。
lockingModel 标签有两种常用的值可以选择:
1.FileAppender.MinimalLock
使用这种锁定模式时,文件会被用于写入期间短暂地锁定。这可以确保写入操作是原子的,但在某些情况下可能会影响性能。
2.FileAppender.ExclusiveLock
这是默认的锁定模式,它会独占文件,直到写入操作完成。这种锁定模式会确保在写入期间不会有其他进程或线程可以访问日志文件,但可能会影响并发性能。
lockingModel 标签允许你根据实际情况选择合适的锁定行为,以确保日志文件的完整性和并发访问的效率。
通常情况下,默认的 ExclusiveLock 模式能够满足大多数需求,但在特定情况下,你可能需要根据系统性能和并发访问的情况来选择合适的锁定模式。
输出控制台
简单输出
1)appender标签
name,自定义命名,用于后面ref使用
type,类型,log4net.Appender.ConsoleAppender,控制台类型
2)Layout标签
type,类型,log4net.Layout.PatternLayout
3)conversionPattern标签
value,输出值格式,占位符,时间、线程、等级、日志器名称、日志信息、换行
<?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%line" /></layout></appender><root><level value="DEBUG" /><appender-ref ref="ConsoleAppender" /></root>
</log4net>
%date [%thread] %-5level %logger - %message%newline
2024-03-11 16:04:58,871 [1] DEBUG Core6TestResouce.SqlHelper - Debug message
详细输出
<?xml version="1.0" encoding="utf-8" ?>
<log4net><appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"><layout type="log4net.Layout.PatternLayout"><conversionPattern value="时间:%date,日志等级:%level,日志记录器名称:%logger,输出日志信息:%message,输出异常信息:%exception,身份标识:%identity,用户名:%username,属性值:%property{key},方法名:%method,行号:%line,类名:%class,文件名:%file" /></layout></appender><root><level value="DEBUG" /><appender-ref ref="ConsoleAppender" /></root>
</log4net>
时间:2024-03-11 16:12:49,888,
日志等级:DEBUG,
日志记录器名称:Core6TestResouce.SqlHelper,
输出日志信息:Debug message,
输出异常信息:,
身份标识:,
用户名:HLH-20220711RIK\Administrator,
属性值:(null),
方法名:Test,
行号:15,
类名:Core6TestResouce.SqlHelper,
文件名:G:\Core6TestResouce\Core6TestResouce\SqlHelper.cs
输出到文档
1)appender标签
name,自定义命名,用于后面ref使用
type,类型,log4net.Appender.FileAppender,文件类型
2)file标签
value,路径值,logs\logfile.txt
3)appendToFile标签
value,值,true,追加内容的方式到文本文档里
4)lockingModel标签
2)Layout标签
type,类型,log4net.Layout.PatternLayout
3)conversionPattern标签
value,输出值格式,占位符,时间、线程、等级、日志器名称、日志信息、换行
<?xml version="1.0" encoding="utf-8" ?>
<log4net><appender name="FileAppender" type="log4net.Appender.FileAppender"><file value="logs\logfile.txt" /><appendToFile value="true" /><lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date [%thread] %-5level %logger - %message%line" /></layout></appender><root><level value="DEBUG" /><appender-ref ref="FileAppender" /></root>
</log4net>
自定义文件名
在 .NET Core 6.0 中使用 log4net,可以通过配置文件中的 元素来设置日志文件的路径和文件名。
1)file标签
type,类型,log4net.Util.PatternString,设置时间匹配类型
value,路径值,logs%date{yyyyMMddHH}.log
2)下面是一个示例的 log4net 配置文件片段,演示如何将日志文件存储在按时间组织的文件夹中,并自定义日志文件名
<?xml version="1.0" encoding="utf-8" ?>
<log4net><appender name="FileAppender" type="log4net.Appender.FileAppender">logs2024M3d11<file type="log4net.Util.PatternString" value="logs\%date{yyyyMMddHH}.log" /><appendToFile value="true" /><lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date [%thread] %-5level %logger - %message - %line" /></layout></appender><root><level value="DEBUG" /><appender-ref ref="FileAppender" /></root>
</log4net>
文件大小
1)rollingStyle标签
创建日志文件的方式,可选值:Date(日期)、文件大小(Size、,混合(Composite)
2)maximumFileSize标签
单个文件大小。单位:KB|MB|GB
3)maxSizeRollBackups标签
最多保留的文件数,设为"-1"则不限
<?xml version="1.0" encoding="utf-8" ?>
<log4net><!--定义日志级别--><root><level value="FATAL"/><level value="ERROR"/><level value="WARN"/><level value="INFO"/><level value="DEBUG"/><appender-ref ref="FATALAppender" /><appender-ref ref="ERRORAppender" /><appender-ref ref="WARNAppender" /><appender-ref ref="INFOAppender" /><appender-ref ref="DebugAppender" /></root><!--严重错误日志--><appender name="FATALAppender" type="log4net.Appender.RollingFileAppender"><file type="log4net.Util.PatternString" value="logs\Fatal\%date{yyyyMMddHH}.log" /><appendToFile value="true" /><rollingStyle value="Size" /><maximumFileSize value="100KB"/><maxSizeRollBackups value="-1"/><lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date [%thread] %-5level %logger - %message - %line" /></layout></appender><!--调试日志--><appender name="DebugAppender" type="log4net.Appender.RollingFileAppender"><file type="log4net.Util.PatternString" value="logs\Debug\%date{yyyyMMddHH}.log" /><appendToFile value="true" /><rollingStyle value="Size" /><maximumFileSize value="100KB"/><maxSizeRollBackups value="-1"/><lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date [%thread] %-5level %logger - %message - %line" /></layout></appender>
</log4net>
相关文章
【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),代码实现篇
【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),流程描述篇
【C#】约瑟夫原理举例2个代码实现
【C#】List泛型数据集如何循环移动,最后一位移动到第一位,以此类推
【C#】获取文本中的链接,通过正则表达式的方法获取以及优化兼容多种格式
温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。
相关文章:

【C#】.net core 6.0 使用第三方日志插件Log4net,配置文件详细说明
欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。…...

第十四届蓝桥杯省赛真题 Java 研究生 组【原卷】
文章目录 发现宝藏【考生须知】试题 A: 特殊日期试题 B: 与或异或试题 C: 棋盘试题 D: 子矩阵试题 E : \mathrm{E}: E: 互质数的个数试题 F: 小蓝的旅行计划试题 G: 奇怪的数试题 H: 太阳试题 I: 高塔试题 J \mathrm{J} J : 反异或 01 串 发现宝藏 前些天发现了一个巨牛的人…...

adb shell input text 输入中文
由于adb 不支持中文输入(不支持 Unicode),需要使用虚拟键盘绕一圈。 可以直接参考和使用: https://github.com/senzhk/ADBKeyBoard # 通用方式 adb shell am broadcast -a ADB_INPUT_TEXT --es msg 赞 # mac/linux 支持 base64…...

Rudolf and the Ball Game
传送门 题意 思路 暴力枚举每一个妆台的转换条件 code #include<iostream> #include<cstdio> #include<stack> #include<vector> #include<algorithm> #include<cmath> #include<queue> #include<cstring> #include<ma…...

计算机毕业设计-基于大数据技术下的高校舆情监测与分析
收藏和点赞,您的关注是我创作的动力 文章目录 概要 一、研究背景与意义1.1背景与意义1.2 研究内容 二、舆情监测与分析的关键技术2.1 robot协议对本设计的影响2.2 爬虫2.2.1 工作原理2.2.2 工作流程2.2.3 抓取策略2.3 scrapy架构2.3.1 scrapy:开源爬虫架…...

WPF使用LiveCharts画图时,横坐标转换成时间
一、背景 使用LiveCharts画图时,横坐标通常为数值类型,要转换成时间等自定义类型,需要用到Formatter进行类型转换。 示例使用MVVM模式编写 二、View代码 关键是设置LabelFormatter属性 <lvc:CartesianChart Series"{Binding Series…...

Qt客户端开发的技术难点
在Qt客户端开发中,可能会遇到一些技术难点,这些难点可能与UI设计、性能优化、跨平台兼容性等方面有关。以下是一些可能的技术难点,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作…...

杰理AD155儿童玩具语音集成电路
一、杰理AD155集成电路是由杰理科技设计、开发和销售的一款产品,AD15系列 SoC 芯片支持以下特性: 工作电压:2.0V-5.5V主频可达120MHz的32bitCPU,片上集成20K字节SRAM,8K字节ICache支持最多2路解码同时运行,支持F1A/A/…...

git bash 命令行反应慢、卡顿(定位出根本原因)
参考该博主: https://blog.csdn.net/weixin_50212044/article/details/131575987?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-131575987-blog-130024908.235v43pc_blog_bottom_relevance_base4&spm1001.210…...

Android 启动service(Kotlin)
一、使用startForegroundService()或startService()启用service **Activity //启动service val intent: Intent Intent(ServiceActivitythis,MyService::class.java) //Build.VERSION_CODES.O 26 // Android8以后,不允许后台启动Service i…...

Windows蓝牙驱动开发之模拟HID设备(一)(把Windows电脑模拟成蓝牙鼠标和蓝牙键盘等设备)
by fanxiushu 2024-03-14 转载或引用请注明原作者 把Windows电脑模拟成蓝牙鼠标和蓝牙键盘,简单的说,就是把笨重的PC电脑当成鼠标键盘来使用。 这应该是一个挺小众的应用,但有时感觉也应该算比较好玩吧, 毕竟实现一种一般人都感觉…...

LlamaParse: 高效的PDF文件RAG解析工具
LlamaParse: 高效的PDF文件RAG解析工具 通过Thomas Reid的深入探索,LlamaParse成为了目前我所见最优秀的RAG实现用PDF解析器。基于AI的技术,尤其在处理像SEC Q10这样的复杂文件时表现出色,这些文件通常包含文本、数字及其组合构成的表格&…...

platform设备注册驱动模块的测试
一. 简介 上一篇文章编写了 platform设备注册代码,文章地址如下: 无设备树platform驱动实验:platform设备注册代码实现-CSDN博客 本文继续无设备树platform驱动实验,本文对编译好的 设备注册程序进行测试,测试所实…...

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:ListItemGroup)
该组件用来展示列表item分组,宽度默认充满List组件,必须配合List组件来使用。 说明: 该组件从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。该组件的父组件只能是List。 使用说明 当List…...

Docker:常用命令
文章目录 docker作用常用指令 docker 作用 Docker 是一种容器化平台,可以让开发者打包应用程序及其依赖项,并以容器的形式进行发布、交付和运行。 Docker 的一些主要作用: 应用程序隔离:Docker 使用容器技术,将应用程…...

如何搭建“Docker Registry私有仓库,在CentOS7”?
1、下载镜像Docker Registry docker pull registry:2.7.1 2、运行私有库Registry docker run -d -p 5000:5000 -v ${PWD}/registry:/var/lib/registry --restartalways --name registry registry:2.7.1 3、拉取镜像 docker pull busybox 4、打标签,修改IP&#x…...

DBA面试题:MySQL缓存池LRU算法做了哪些改进?
下图是MySQL(MySQL5.7版本)体系架构图 MySQL的InnoDb Buffer Pool 缓冲池是主内存中的一个区域,用来缓存InnoDB在访问表和索引时的数据。对于频繁使用的数据可以直接从内存中访问,从而加快处理速度。如果一台服务器专用作MySQL数据…...

idea+vim+pycharm的块选择快捷键
平时开发的时候,有的时候我们想用矩形框住代码,或者想在某列上插入相同字符 例如下图所示,我想在22-24行的前面插入0000 1. Idea的快捷键:option 鼠标 2. Pycharm的快捷键:shift option 鼠标 2. Vim 块选择 v/V/c…...

ansible 部署FATE集群单边场景
官方文档: https://github.com/FederatedAI/AnsibleFATE/blob/main/docs/ansible_deploy_FATE_manual.md https://github.com/FederatedAI/AnsibleFATE/blob/main/docs/ansible_deploy_two_sides.md gitee详细文档: docs/ansible_deploy_one_side.md…...

融入Facebook的世界:探索数字化社交的魅力
融入Facebook的世界,是一场数字化社交的奇妙之旅。在这个广袤的虚拟社交空间中,人们可以尽情展现自己、分享生活,与全球朋友、家人和同事保持紧密联系,共同探索社交互动的乐趣与魅力。让我们深入了解这个世界的魅力所在࿱…...

stm32-定时器输出比较PWM
目录 一、输出比较简介 二、PWM简介 三、输出比较模式实现 1.输出比较框图(以通用定时器为例) 2.PWM基本结构 四、固件库实现 1.程序1:PWM呼吸灯 2.程序2:PWM驱动直流电机 3.程序3:控制舵机 一、输出比较简介 死区生成和互补输出一般…...

Redis对过期key的删除策略
假设设置了一批 key 只能存活 1 个小时,那么 1 小时后,redis 是怎么对这批 key 进行删除的? 定期删除 惰性删除 定期删除: redis是默认每隔100ms就随机抽取一些设置了过期时间的key,检查是否过期,如果过期就删除。…...

http的body格式
body数据都通常放在 HTTP 请求的 body 部分。 在 HTTP 请求中,Content-Type 头用于指示 body 中的数据格式。例如,对于 x-www-form-urlencoded 格式的数据,通常会设置 Content-Type: application/x-www-form-urlencoded,而对于 fo…...

Java Web开发从0到1
文章目录 总纲第1章 Java Web应用开发概述1.1 程序开发体系结构1.1.1 C/S体系结构介绍1.1.2 B/S体系结构介绍1.1.3 两种体系结构的比较1.2 Web应用程序的工作原理1.3 Web应用技术1.3.1 客服端应用技术1.3.2 服务端应用技术1.4 Java Web应用的开发环境变量1.5 Tomcat的安装与配置…...

002——编译鸿蒙(Liteos -a)
目录 一、鸿蒙是什么 二、Kconfig 2.1 概述 2.2 编译器 2.3 make使用 本文章引用了很多韦东山老师的教程内容,算是我学习过程中的笔记吧。如果侵权请联系我。 一、鸿蒙是什么 这里我补充一下对鸿蒙的描述 这张图片是鸿蒙发布时使用的,鸿蒙是一个很…...

Ansible--详解
目录 一、Ansible核心组件 二、Ansible配置 1.配置案例 (1)管理安装ansible (2)管理机分发公匙 (3)配置管理 (4)测试连接 2.命令说明 三、playbook剧本编写 1.playbook模板…...

Django和Mysql数据库
Django学习笔记 Django和Mysql数据库 Django开发操作数据库更简单,内部提供了ORM框架。 1)安装mysqlclient pip3 install mysqlclient2)ORM ORM可以帮助我们做两件事: 1.创建、修改、修改数据库中的表(不用写sql语句)[不能创…...

[蓝桥杯]-最大的通过数-CPP-二分查找、前缀和
目录 一、题目描述: 二、整体思路: 三、代码: 一、题目描述: 二、整体思路: 首先要知道不是他们同时选择序号一样的关卡通关,而是两人同时进行两个入口闯关。就是说两条通道存在相同关卡编号的的关卡被通…...

安卓UI面试题 26-30
26. Window和DecorView是什么?DecorView又是如何和Window建立联系的?Window是 WindowManager 最顶层的视图,它负责背景(窗口背景)、Title之类的标准的UI元素, Window是一个抽 象类,整个Android系统中, PhoneWindow是 Window的唯一实现类。 至于 DecorView,它是一个顶级 …...

CPU、GPU、IPU、NPU、TPU、LPU、MCU、MPU、SOC、DSP、FPGA、ASIC、GPP、ECU、
CPU: 中央处理器(Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit)。 它的功能主要是解释计算机指令以及处理计算机软件…...