背景
最近在最一些并发方式的测试,发现自己之前封装的一个日志插件报错,尽管在写日志时已经通过锁的方式进行了优化,但是依然无法解决并发时同一个文件同时访问情况,会频繁出现报错提示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#第三方日志插件log4net的配置文件详解的详细内容,更多关于c# log4net日志插件的资料请关注代码网其它相关文章!
发表评论