VisualStudio C#中使用Log4net输出不同类型的日志

news2025/1/21 3:00:43

20240514

By wdhuag


目录

前言:

参考:

安装Log4net包并引用:

创建log4net.config配置文件,属性要设置始终复制:

在AssemblyInfo.cs中加入配置:

 初始化时读取配置:

调用:

一个简单的例子:


前言:

Log4net输出不同类型的日志是基本操作,但是网上的举例注释太杂、实例太乱,这里做一个简化的例子。


参考:

Apache log4net – Apache log4net Manual: Configuration - Apache log4net

https://www.cnblogs.com/boise/p/18002739

https://www.cnblogs.com/amylis_chen/p/6069487.html

log4net各种Filter使用_log4net.filter.denyallfilter-CSDN博客

https://www.cnblogs.com/cdaq/p/5052055.html

https://www.cnblogs.com/nanfei/p/6542275.html


安装Log4net包并引用:


创建log4net.config配置文件,属性要设置始终复制:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <!--站点日志配置部分-->
  <log4net>

    <!--root节点,只能有一个,是所有logger对象的父节点-->
    <root>
      <!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
      <!--比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录-->
      <!--如果没有定义LEVEL的值,则缺省为DEBUG-->
      <level value="All" />
      <!--Appenders节点,定义日志的输出方式-->
      <appender-ref ref="InfoAppender" />
      <appender-ref ref="WarnAppender" />
      <appender-ref ref="ErrorAppender" />
      <appender-ref ref="DebugAppender" />
      <appender-ref ref="FatalAppender" />
    </root>

    <!--自定义logger节点-->
    <logger name="StationLog">
      <level value="ALL" />
      <appender-ref ref="StationAppender" />
      <!--additivity用于设置是否继承root节点,为false时root的appender执行后不会再执行logger的appender-->
      <additivity value="true"/>
    </logger>

    <logger name="SnLog">
      <level value="ALL" />
      <appender-ref ref="SnAppender" />
      <additivity value="true"/>
    </logger>

    <logger name="MesLog">
      <level value="ALL" />
      <appender-ref ref="MesAppender" />
      <additivity value="true"/>
    </logger>

    <!--RollingFileAppender将日志以回滚文件的形式写到文件中-->
    <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
      <!--当RollingStyle为Composite或Date,这里设置文件名格式-->
      <datePattern value="yyyyMM\\yyyyMMdd'.log'" />
      <!--多线程时采用最小锁定-->
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
      <!--文本编码-->
      <encoding value="utf-8" />
      <!--文件路径,运行文件目录.\  上一层..\-->
      <file type="log4net.Util.PatternString" value =".\日志\INFO\"/>
      <!--当文件存在时,是否在原文件上追加内容-->
      <appendToFile value="true" />
      <!--最大文件大小(可以使用KB,MB,GB为单位,默认为字节)-->
      <param name="MaxFileSize" value="10240"/>
      <!--	创建新文件的方式-->
      <rollingStyle value="Date" />
      <!--staticLogFileName为true时,RollingStyler的Date值将无效,且需要在file里指定文件名,所有日志都会记录在这个文件里-->
      <staticLogFileName value="false" />
      <!--最大行数-->
      <param name="MaxSizeRollBackups" value="100" />
      <!--日志输出格式,%m(message信息),%d{yyy-MM-dd HH:mm:ss }(datetime日期和格式),%r(runtime运行时间),%p(priority日志等级),%c(class类名),%t(thread线程id),%l(line行号),%f(file文件名)-->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%m" />
      </layout>
      <!--日志等级过滤器,value参数大写-->
      <filter type="log4net.Filter.LeveRangeFilter">
        <param name="levelMin" value="INFO"/>
        <param name="levelMax" value="INFO"/>
      </filter>
      <!--输出日志信息中包含特殊字符串才输出,AcceptOnMatch条件满足是否输出打印-->
      <filter type="log4net.Filter.StringMatchFilter">
        <param name="StringToMatch" value="Info"/>
        <param name="AcceptOnMatch" value="true"/>
      </filter>
      <!--Logger名称匹配才记录-->
      <filter type="log4net.Filter.LoggerMatchFilter">
        <loggerToMatch value="" />
      </filter>
      <!--输出日志信息中包含特殊字符串才输出,不设置这个就无法过滤-->
      <filter type="log4net.Filter.DenyAllFilter" />
    </appender>

    <appender name="WarnAppender" type="log4net.Appender.RollingFileAppender">
      <datePattern value="yyyyMM\\yyyyMMdd'.log'" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
      <encoding value="utf-8" />
      <file type="log4net.Util.PatternString" value =".\日志\INFO\"/>
      <appendToFile value="true" />
      <param name="MaxFileSize" value="10240"/>
      <rollingStyle value="Date" />
      <staticLogFileName value="false" />
      <param name="MaxSizeRollBackups" value="100" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%m" />
      </layout>
      <filter type="log4net.Filter.LeveRangeFilter">
        <param name="levelMin" value="INFO"/>
        <param name="levelMax" value="INFO"/>
      </filter>
      <filter type="log4net.Filter.StringMatchFilter">
        <param name="StringToMatch" value="Info"/>
        <param name="AcceptOnMatch" value="true"/>
      </filter>
      <filter type="log4net.Filter.LoggerMatchFilter">
        <loggerToMatch value="" />
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
    </appender>

    <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
      <datePattern value="yyyyMM\\yyyyMMdd'.log'" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
      <encoding value="utf-8" />
      <file type="log4net.Util.PatternString" value =".\日志\ERROR\"/>
      <appendToFile value="true" />
      <param name="MaxFileSize" value="10240"/>
      <rollingStyle value="Date" />
      <staticLogFileName value="false" />
      <param name="MaxSizeRollBackups" value="100" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%m" />
      </layout>
      <filter type="log4net.Filter.LeveRangeFilter">
        <param name="levelMin" value="ERROR"/>
        <param name="levelMax" value="ERROR"/>
      </filter>
      <filter type="log4net.Filter.StringMatchFilter">
        <param name="StringToMatch" value="Error"/>
        <param name="AcceptOnMatch" value="true"/>
      </filter>
      <filter type="log4net.Filter.LoggerMatchFilter">
        <loggerToMatch value="" />
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
    </appender>

    <appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
      <datePattern value="yyyyMM\\yyyyMMdd'.log'" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
      <encoding value="utf-8" />
      <file type="log4net.Util.PatternString" value =".\日志\DEBUG\"/>
      <appendToFile value="true" />
      <param name="MaxFileSize" value="10240"/>
      <rollingStyle value="Date" />
      <staticLogFileName value="false" />
      <param name="MaxSizeRollBackups" value="100" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%m" />
      </layout>
      <filter type="log4net.Filter.LeveRangeFilter">
        <param name="levelMin" value="DEBUG"/>
        <param name="levelMax" value="DEBUG"/>
      </filter>
      <filter type="log4net.Filter.StringMatchFilter">
        <param name="StringToMatch" value="Debug"/>
        <param name="AcceptOnMatch" value="true"/>
      </filter>
      <filter type="log4net.Filter.LoggerMatchFilter">
        <loggerToMatch value="" />
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
    </appender>

    <appender name="FatalAppender" type="log4net.Appender.RollingFileAppender">
      <datePattern value="yyyyMM\\yyyyMMdd'.log'" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
      <encoding value="utf-8" />
      <file type="log4net.Util.PatternString" value =".\日志\FATAL\"/>
      <appendToFile value="true" />
      <param name="MaxFileSize" value="10240"/>
      <rollingStyle value="Date" />
      <staticLogFileName value="false" />
      <param name="MaxSizeRollBackups" value="100" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%m" />
      </layout>
      <filter type="log4net.Filter.LeveRangeFilter">
        <param name="levelMin" value="FATAL"/>
        <param name="levelMax" value="FATAL"/>
      </filter>
      <filter type="log4net.Filter.StringMatchFilter">
        <param name="StringToMatch" value="Fatal"/>
        <param name="AcceptOnMatch" value="true"/>
      </filter>
      <filter type="log4net.Filter.LoggerMatchFilter">
        <loggerToMatch value="" />
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
    </appender>

    <appender name="StationAppender" type="log4net.Appender.RollingFileAppender">
      <datePattern value="yyyyMM\\yyyyMMdd'.log'" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
      <encoding value="utf-8" />
      <file type="log4net.Util.PatternString" value =".\日志\Station\"/>
      <appendToFile value="true" />
      <param name="MaxFileSize" value="10240"/>
      <rollingStyle value="Date" />
      <staticLogFileName value="false" />
      <param name="MaxSizeRollBackups" value="100" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%m" />
      </layout>
      <!--filter type="log4net.Filter.LeveRangeFilter">
        <param name="levelMin" value="INFO"/>
        <param name="levelMax" value="INFO"/>
      </filter-->
      <!--filter type="log4net.Filter.StringMatchFilter">
        <param name="StringToMatch" value="Info"/>
        <param name="AcceptOnMatch" value="true"/>
      </filter-->
      <filter type="log4net.Filter.LoggerMatchFilter">
        <loggerToMatch value="StationLog" />
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
    </appender>

    <appender name="SnAppender" type="log4net.Appender.RollingFileAppender">
      <datePattern value="yyyyMM\\yyyyMMdd'.log'" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
      <encoding value="utf-8" />
      <file type="log4net.Util.PatternString" value =".\日志\SN\"/>
      <appendToFile value="true" />
      <param name="MaxFileSize" value="10240"/>
      <rollingStyle value="Date" />
      <staticLogFileName value="false" />
      <param name="MaxSizeRollBackups" value="100" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%m" />
      </layout>
      <!--filter type="log4net.Filter.LeveRangeFilter">
        <param name="levelMin" value="INFO"/>
        <param name="levelMax" value="INFO"/>
      </filter-->
      <!--filter type="log4net.Filter.StringMatchFilter">
        <param name="StringToMatch" value="Info"/>
        <param name="AcceptOnMatch" value="true"/>
      </filter-->
      <filter type="log4net.Filter.LoggerMatchFilter">
        <loggerToMatch value="SnLog" />
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
    </appender>

    <appender name="MesAppender" type="log4net.Appender.RollingFileAppender">
      <datePattern value="yyyyMM\\yyyyMMdd'.log'" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
      <encoding value="utf-8" />
      <file type="log4net.Util.PatternString" value =".\日志\MES\"/>
      <appendToFile value="true" />
      <param name="MaxFileSize" value="10240"/>
      <rollingStyle value="Date" />
      <staticLogFileName value="false" />
      <param name="MaxSizeRollBackups" value="100" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%m" />
      </layout>
      <!--filter type="log4net.Filter.LeveRangeFilter">
        <param name="levelMin" value="INFO"/>
        <param name="levelMax" value="INFO"/>
      </filter-->
      <!--filter type="log4net.Filter.StringMatchFilter">
        <param name="StringToMatch" value="Info"/>
        <param name="AcceptOnMatch" value="true"/>
      </filter-->
      <filter type="log4net.Filter.LoggerMatchFilter">
        <loggerToMatch value="MesLog" />
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
    </appender>
  </log4net>
</configuration>


在AssemblyInfo.cs中加入配置:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]


 初始化时读取配置:

//读取Log4net配置文件,默认选择root节点
private static readonly ILog _RootLog = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
//private static readonly ILog _RootLog = LogManager.GetLogger("root");
//选择自定义节点
private static readonly ILog _StationLog = LogManager.GetLogger("StationLog");
private static readonly ILog _SnLog = LogManager.GetLogger("SnLog");
private static readonly ILog _MesLog = LogManager.GetLogger("MesLog");


调用:

_RootLog.Info(text);
_RootLog.Warn(text);
_RootLog.Error(text);
_RootLog.Debug(text);
_RootLog.Fatal(text);
_StationLog.Info(text);
_SnLog.Info(text);
_MesLog.Info(text);


一个简单的例子:

度盘,提取码:mbj1 


END

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vueday1

1.作用&#xff1a;利用表达式进行插值&#xff0c;渲染到页面中 三元表达式、点语法、数组对应项&#xff0c;方法、点语法方法 1.使用的时候需要存在&#xff0c;需要在data里面声明&#xff0c;如果没有声明会报错 2.ifelse不能用 3.不能在标签属性中使用{{}}插值 <!DO…

sqlserver安装失败,提示“找不到数据库引擎启动句柄”的解决办法。

安装sqlserver2012和sqlserver2016时&#xff0c;一直提示“找不到数据库引擎启动句柄”。 解决方法&#xff1a; 执行“setup.exe”时&#xff0c;使用管理员权限启动&#xff0c;就不再报这个错误。 此外还有个SQL Server (MSSQLSERVER) 服务无法启动的问题 解决方法&…

【Linux系统编程】第十八弹---进程状态(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、操作系统进程 1.1、进程背景 1.2、进程如何在CPU上运行的&#xff1f; 1.2、进程状态 2、Linux的进程状态 2.1、如何描…

【Mongodb】增删改查

Mongodb Mongodb介绍Mongodb核心概念数据库集合文档 安装Mongodb运行地址步骤1步骤2&#xff08;新起一个cmd&#xff09; 命令行交互数据库命令集合命令文档命令 Mongoose设置运行命令 字段类型字段值验证 Mongoose新增文档Mongoose删除文档Mongoose更新文档Mongoose读取文档条…

自集成式 HTTP 代理方案

前言 大部分程序员&#xff0c;想必都会有一个常用的抓包代理工具&#xff1b; 但在座的各位&#xff0c;可曾见过这样一款集成在 Web 应用中的代理工具&#xff1f; ​&#xff0c;时长00:45 它是明显区别于传统代理工具的&#xff0c;有以下特性&#xff1a; 零安装、零配…

什么?免费使用GPT-4o?

⭐简单说两句⭐ ✨ 正在努力的小叮当~ &#x1f496; 超级爱分享&#xff0c;分享各种有趣干货&#xff01; &#x1f469;‍&#x1f4bb; 提供&#xff1a;模拟面试 | 简历诊断 | 独家简历模板 &#x1f308; 感谢关注&#xff0c;关注了你就是我的超级粉丝啦&#xff01; &a…

十一、 进行个人信息保护认证的流程是怎样的?

2022 年 11 月 18 日&#xff0c;国家市场监督管理总局和国家网信办发布的《认证公告》以及附件《认证规则》&#xff0c;对开展个人信息保护认证的流程进行了细节说明&#xff0c;包括认证委托、技术验证、现场审核、认证结果评价和批准等环节。《认证公告》指出“从事个人信息…

越来越真的Deepfake再次引起网安界的关注

当地时间5月6日&#xff0c;全球网络安全领域最受关注的年度盛会 RSAC 2024在美国旧金山隆重开幕。当天&#xff0c;被誉为“安全圈奥斯卡”的创新沙盒大赛也决出了冠军&#xff0c;Reality Defender凭借其创新性的深度伪造&#xff08;Deepfake&#xff09;检测平台摘得桂冠&a…

合合信息携手业界专家,解码数据资产管理方法与入表的关键路径

随着财政部印发的《企业数据资源相关会计处理暂行规定》提出企业数据资产入表相关办法&#xff0c;《数据资产评估指导意见》中进一步规范数据资产评估行为&#xff0c;细化数据资产评估操作要求&#xff0c;对解决数据要素市场建设中的“数据赋值”难题提供了有效方案。数据资…

直播预约丨《袋鼠云大数据实操指南》No.2:实时开发,如何成为数据智能化的有效驱动力

近年来&#xff0c;新质生产力、数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮&#xff0c;持续冲击并革新着企业数字化转型的观念视野&#xff0c;昭示着一个以数据为核心驱动力的新时代正稳步启幕。 面对这些引领经济转型的新兴概念&#xff0c;为了更好地服务于客户…

HCIA和HCIP区别大吗?小白请看这

华为认证以其专业性和实用性受到了业界的广泛认可。 HCIA、HCIP、HCIP这三个级别&#xff0c;你会选哪个&#xff1f;IE含金量不用多说&#xff0c;IA还是IP&#xff0c;你会纠结吗。 但面对这两个级别的认证&#xff0c;初学者或者“小白”们可能会感到困惑&#xff1a;两者…

【资源分享】EViews13-最好用的计算经济学工具

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

【论文复刻】堆叠柱状图+饼图

复刻了一下这篇论文里的fig2c&#xff1a;Impacts of COVID-19 and fiscal stimuli on global emissions and the Paris Agreement | Nature Climate Change 效果图&#xff1a; 主要步骤&#xff1a; 1. 数据准备&#xff1a;随机赋值 2. 图像绘制&#xff1a;绘制堆叠柱状…

邓闲小——生存、生活、生命|真北写作

人生有三个层次∶生存、生活、生命。 生存就是做必须做的事。生存的模式是邓&#xff0c;是交易&#xff0c;是买卖。别人需要的东西&#xff0c;你生产出来&#xff0c;卖给他。哪怕这个东西没啥用&#xff0c;也可以卖&#xff0c;情绪也可以卖。你需要的东西&#xff0c;你花…

e行64位V11.17.4 安卓全局虚拟定位APP

e行最新版11.17.4 支持全局虚拟位置 小米手机 百度地图 高德地图 实测成功 其他app自测 不一定支持所有app 下载&#xff1a;https://www.123pan.com/s/HAf9-tsyCh.html

人员密集场所电气火灾预警系统 对设备漏电、短路、发热进行监测预警

谢继东15821713522 安科瑞Acrelcloud-6000安全用电管理平台是针对我国当前电气火灾事故频发而创新的一套电气火灾预警和预防管理系统.系统通过物联网技术对电气引发火灾的主要因素&#xff08;导线温度、电流、电压和漏电流&#xff09;进行不间断的数据跟踪与统计分析&#xf…

【 第一性原理计算方法及应用】

第一性原理计算方法及应用述

河南地区评政工师 需要发网络文章和刊登论文要求是什么

河南省政工师评审文件是《河南省企业思想政治工作人员专业职务评定办法》豫企政职&#xff08;2010&#xff09;1号。该文件将河南省政工师职称划分为助理政工师、政工师、高级政工师、教授级高级政工师四类。其中&#xff0c;每一个级别的政工师都需要发表相关文件&#xff0c…

基于uniapp+vue3+ts小程序项目实战之项目初始化

&#x1f680; 作者 &#xff1a;“二当家-小D” &#x1f680; 博主简介&#xff1a;⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人&#xff0c;8年开发架构经验&#xff0c;精通java,擅长分布式高并发架构,自动化压力测试&#xff0c;微服务容器化k…

混淆矩阵实战

2.实战 1.加载数据 #加载数据 import pandas as pd import numpy as np data pd.read_csv(data_class_raw.csv) data.head()2.data.loc得到样本属性&#xff0c;并进行样本数据可视化 #可视化数据 %matplotlib inline from matplotlib import pyplot as plt#define X and y…