【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#】获取文本中的链接,通过正则表达式的方法获取以及优化兼容多种格式

温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。

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

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

相关文章

基于大模型的 Agent 进行任务规划的10种方式

本文首发自博客 基于大模型的 Agent 进行任务规划的10种方式 基于大模型的 Agent 基本组成应该包含规划&#xff08;planning)&#xff0c;工具&#xff08;Tools)&#xff0c;执行(Action)&#xff0c;和记忆(Memory)四个方面&#xff0c;上一篇中重点讲了进行长记忆管理的 8…

MFC 添加MFC类方法

1、打开工程目录的"类视图" 2、工程名右键添加"MFC类" 3、填写"类名"并选择“基类”CDialog&#xff0c;对话框ID填写添加好的对话框ID

Vue3 前端生成随机id( 生成 UUID )

效果展示 封装工具&#xff08;代码展示&#xff09; 重新创建一个文件**/utils/someTools.js**&#xff0c;并在里面写入如下代码。 function Tools() {}Tools.prototype.guid function () {return xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx.replace(/[xy]/g, function (c) {v…

Junit4入门之什么是单元测试?

干了一年多的后端了&#xff0c;从来没有了解过单元测试。虽然我知道测试不仅仅是测试们的任务&#xff0c;后端也要进行自测来保证自己的代码的可用性&#xff0c;但我一直都只是用postman来实施的&#xff0c;调用调通了即可。虽然我也知道Junit是用于测试的软件&#xff0c;…

汽车屏类产品(五):仪表Cluster常用芯片i.MX117x

前言: 仪表一般就是指方向盘前面那个表盘。做仪表的芯片最主要需要支持显示Display,而仪表的主要排版布局多种多样,但是主旨显示内容不尽相同。 仪表需求: 1、rpm转速表盘 仪表Cluster一般会有转速表盘rpm,单位一般是x1000,大部分汽车仪表范围就是0~8,也就是最高8000…

【Vue3】深入理解Vue3路由器的工作原理to的两种写法

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

大数据 - HBase《一》- Hbase基本概念

目录 1.1. Hbase简介 1.2 Hbase,Hive, Mysql对比 1.3 Hbase数据模型 &#x1f959;region(区域) &#x1f959;rowkey(行键) &#x1f959;列族&#xff08;column family) &#x1f959;列&#xff08;column Qualifier) &#x1f959;版本&#xff08;version)-默认按…

Sui与数据平台ZettaBlock达成合作,为其公测提供数据

Sui一向以闪电般的速度、无限水平扩展著称&#xff0c;现已迅速成为DeFi活动的重要场所。近期&#xff0c;数据平台ZettaBlock宣布在其开创性的Web3数据平台发布中&#xff0c;选择Sui作为基础集成合作伙伴之一。在ZettaBlock的开放测试版发布之际&#xff0c;构建者和开发者将…

【node】初识node以及fs操作,path操作以及http操作(一)

1、不同浏览器使用不同的javaScript引擎 chrome > v8 Firefox > OdinMonkey&#xff08;奥丁猴&#xff09; safri > JSCore IE浏览器>Chakra(查克拉) 2、node是一个基于chrome v8引擎的javaScript运行环境 浏览器是JavaScript的前端运行环境&#xff0c;…

AcrelEMS-MED医院综合能效管理平台在医院电力中的应用

彭姝麟 Acrelpsl 0引言 全医院是公共服务组织&#xff0c;其机构的特殊性决定了医院在提供医疗服务的同时&#xff0c;也需要发挥榜样作用&#xff0c;通过进行能源管理系统的应用&#xff0c;为医院的电力使用和能源消耗进行好的管理&#xff0c;从而减少电能消耗&#xff0…

Web端3D图形引擎HOOPS Commuicator如何实现BIM轻量化?

面对建筑信息模型&#xff08;BIM&#xff09;中复杂大型模型的挑战&#xff0c;如何实现轻量化&#xff0c;并使其能在Web端流畅运行是我们需要解决的问题。而HOOPS Communicator正可凭借其出色的Web端3D模型敏捷解决性&#xff0c;为我们提供强有力的支撑。 HOOPS Communica…

【四】【算法分析与设计】贪心算法的初见

455. 分发饼干 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff0c;都有…

阿里云数据盘挂载目录

1、先登录服务器创建新目录aaa 2、云盘都快照备份下。后续操作完核实无误了&#xff0c;您根据您需求删除快照就行&#xff0c; 然后登录服务器内执行&#xff1a; fdisk -l lsblk blkid ll /aaa 3、执行&#xff1a;&#xff08;以下命令是进行数据盘做ext4文件系统并挂载到…

tigramite教程(五)使用TIGRAMITE 进行自助聚合和链接置信度量化

使用TIGRAMITE 进行自助聚合和链接置信度量化 自助聚合&#xff08;Bagging&#xff09;和置信度估计例子数据生成模型基本的PCMCIBagged-PCMCI使用优化后的pc_alpha进行自举聚合使用优化的pc_alpha进行CMIknn的自举聚合 TIGRAMITE是一个用于时间序列分析的Python模块。它基于P…

Elastic Stack--04--ES中的检索方式、Query DSL

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.ES中的检索方式第一种方式GET bank/_search # 检索bank下的所有信息&#xff0c;包括 type 和 docsGET bank/_search?q*&sortaccount_number:asc 第二种方式…

Redis经典面试题-卷2

前言 继续上一篇《Redis经典面试题-卷1》&#xff0c;今天整理一下关于redis的第2卷面试题。废话不多说&#xff0c;直接看干货 热Key问题 如果单单从工作的角度的话&#xff0c;面试官一般会问下面两个内容&#xff1a; 什么是热Key问题&#xff1f;如何解决热key问题&…

Android 摄像头等比例缩放 摄像头画面比例

在拍摄照片的时候我们往往会在后期进行二次构图&#xff0c;在裁剪的时候有不同的相片长宽比供我们选择&#xff0c;不同的长宽比带给观众的感受也不一样。这里为大家介绍一下照片拍摄中常用到长宽比例。 3&#xff1a;2(6&#xff1a;4) 这张照片是用Canon 50D拍摄的&#xf…

收藏贴!6个谈薪小技巧,助你拿到满意薪资

Salesforce的就业市场一直在迅猛发展&#xff0c;对Salesforce专业人士的需求持续不断&#xff0c;对优秀人才的需求更大。 本篇文章总结了6个谈薪小技巧&#xff0c;可以帮助SF从业者、求职者拿到满意的薪资。 01 了解市场价格 首先&#xff0c;需要了解当前就业市场的情况…

【Linux】进程控制与进程调度

Linux进程介绍 进程的基本概念 Linux是多用户、多任务的操作系统。在这样的环境中&#xff0c;各种计算机资源的分配和管理都是以进程为单位进行的。 Linux操作系统包括三种不同类型的进程&#xff1a; 1&#xff09;交互进程&#xff1a;一种由Shell启动的进程。交互进程既可…

十、软考-系统架构设计师笔记-软件架构演化和维护

1、软件架构演化 软件架构的演化和维护的目的是为了使软件能够适应环境的变化而进行的纠错性修改和完善性修改。软件架构的演化和维护过程是一个不断迭代的过程&#xff0c;通过演化和维护&#xff0c;软件架构逐步得到完善&#xff0c;以满足用户需求。软件架构的演化就是软件…
最新文章