欢迎来到《小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#】获取文本中的链接,通过正则表达式的方法获取以及优化兼容多种格式
温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。