Log4Net 生成多个文件、文件名累加解决方法

简介: Log4Net 生成多个文件、文件名累加解决方法 项目中的WCF服务里采用Log4Net用来记录异常日志,但部署后,生成的日志会出现多个累加文件,如下图: WCF是寄宿在IIS上,包含了5个SVC服务。

Log4Net 生成多个文件、文件名累加解决方法

项目中的WCF服务里采用Log4Net用来记录异常日志,但部署后,生成的日志会出现多个累加文件,如下图:

WCF是寄宿在IIS上,包含了5个SVC服务。打开日志文件,发现记录的引发异常的Thread ID都不一样,猜测是多线程读写日志文件,

配置信息里指定文件的被占用后,重新建立了新的日志文件,删除日志文件也会出现警告信息:

解决方法:

在appender节点里添加:

<param name="lockingModel"  type="log4net.Appender.FileAppender+MinimalLock" />

lockingModel 属性的详细信息可看 Log4Net SDK 中的描述。

很不解的是:type中 FileAppender+MinimalLock 为何要用 '+' 来做连接符,换成'.'的时候却不行。

 

完整Log4Net配置信息:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net-net-1.0"/> </configSections> <log4net> <!--日志对象根设置--> <root> <!--定义Level级别,若没定义,默认为Debug--> <level value="ERROR"/> <!--定义日志对象使用的appender,通过appeder-ref来注册--> <appender-ref ref="LogFileAppender"/> </root> <!--定义具体的logger对象 通过调用LogManager.GetLogger(“wcflog”)函数,你可以检索具有该名字的日志。如果LogManager.GetLogger(…)打开的不是预定义的日志对象,则该日志对象会继承根日志对象的属性。知道了这一点,我们可以说,其实<logger>标签并不是必须的--> <logger name="wcflog" additivity="true"> <!--additivity 是否确认子日志对象继承父日志对象的appender列表,默认为True:确认--> <!--注意优先级,优先级低的要放在后面--> <level value="INFO" /> <level value="DEBUG"/> </logger> <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" > <!--配置在root注册的appender-ref具体属性--> <param name="File" value="log//"/> <param name="StaticLogFileName" value="false" /> <param name="DatePattern" value="yyyy-MM-dd.LOG" /> <param name="AppendToFile" value="true"/> <!--按照文件的大小进行变换日志文件--> <param name="RollingStyle" value="Date" /> <!--单个文件最大数量--> <param name="MaximumFileSize" value="1000KB"/> <!--保留的log文件数量 超过此数量后 自动删除之前的 --> <param name="MaxSizeRollBackups" value="100" /> <!--最小锁定模型以允许多个进程可以写入同一个文件--> <param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" /> <!--type属性,定义类型--> <layout type="log4net.Layout.PatternLayout"> <!--定义日志会话(logger session)开始输出的文字--> <param name="Header" value="异常开始记录 :"/> <!--定义日志会话(logger session)结束输出的文字--> <!--<param name="Footer" value="[Footer]\r\n"/>--> <!--输出信息的模式: --> <param name="ConversionPattern" value="%n时间 : %d 线程ID:[%t] %-5p 当前对象名称:%c - %m%n"/> </layout> <!--过滤器,只需要min和max之间的级别--> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="DEBUG"/> <param name="LevelMax" value="ERROR"/> </filter> </appender> </log4net> </configuration>

 

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
Oracle 关系型数据库 Linux
Oracle 19c Centos7 静默安装记录整理 2
Oracle 19c Centos7 静默安装记录整理
|
Web App开发 PHP Apache
手把手教你用owncloud搭建属于自己的云盘
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 owncloud是一个开源的云盘解决方案,我们可以用owncloud快速地搭建起我们自己私有的云盘,这样文件地安全性和云盘地可靠性都有保证,对于公司和个人都是非常有用的。
9374 0
|
Java Spring 容器
在Feign接口中返回泛型类型——自定义Decoder
前几天对接了一套第三方接口,所有接口的请求地址一样,请求参数和响应结果中有很多共同的字段,所以就想把这些字段都抽出来,Feign定义的接口直接返回泛型类型。
在Feign接口中返回泛型类型——自定义Decoder
|
6月前
|
存储 自然语言处理 算法
大模型应用:基于千问大模型 + 图算法:可追溯知识图谱问答系统构建.83
本文介绍“图算法+大模型”双引擎智能问答方案:用PageRank、最短路径等图算法处理关系推理与知识验证,由千问大模型负责自然语言理解与生成,实现可信、可溯源、强推理的高可靠问答,破解幻觉、推理弱、不可溯三大难题。
751 7
|
9月前
|
机器学习/深度学习 存储 人工智能
AI 智能体开发的更新
AI智能体更新已迈入全生命周期自适应优化阶段:知识库实时同步、模型无损升级、工具自主发现、策略即代码、快照回滚机制五位一体,实现分钟级响应与秒级恢复,兼顾敏捷性与稳定性。(239字)
|
数据采集 机器学习/深度学习 人工智能
2026年具身智能商业化浪潮前瞻:开发者工具与软件生态的万亿级掘金图谱
在具身智能执行器和传感器等硬件成本持续下降的背景下,真正驱动其大规模商业化爆发的,并非单一的硬件产品,而是其背后的软件与生态系统。正如互联网的价值最终体现在软件应用与服务上,具身智能的商业价值正在从传统的“硬件产品销售”转向“软件与服务订阅”。RaaS等创新商业模式的兴起,正是这一趋势的直接体现。这里我们将深入剖析2026年具身智能领域,特别是围绕数据采集、训练和任务开发的软件工具与服务所蕴藏的万亿级商业机遇,为开发者与投资者描绘一幅详尽的掘金图谱。
1511 0
|
机器学习/深度学习 自然语言处理 计算机视觉
YOLOv8改进 | 2023 | 给YOLOv8换个RT-DETR的检测头(重塑目标检测前沿技术)
YOLOv8改进 | 2023 | 给YOLOv8换个RT-DETR的检测头(重塑目标检测前沿技术)
1358 0
|
存储 小程序 前端开发
微信小程序健康管理系统的开发与实现(一)
微信小程序健康管理系统的开发与实现
1072 0
|
存储 监控 数据挖掘
Kylin使用心得与实战经验分享
本文详细介绍了Apache Kylin的使用方法及其在大数据分析中的优势。首先,Kylin是一款基于Hadoop和Spark的开源分布式分析引擎,通过预计算技术实现亚秒级的交互式查询响应,大幅提高数据分析效率。接着,文章阐述了Kylin的核心特点,包括高效多维分析能力和预计算与实时查询的平衡。然后,详细说明了环境搭建、配置步骤及示例代码,展示了如何配置HBase存储后端。在数据建模与优化部分,讲解了星型模型和雪花模型的选择,以及分区策略和索引优化技巧。
|
机器学习/深度学习 人工智能 算法
给图片悄悄加上像素级水印:防止AI「抄袭」艺术作品的方法找到了
给图片悄悄加上像素级水印:防止AI「抄袭」艺术作品的方法找到了
687 0