c# log4net 日志的使用

news/2025/2/24 7:34:04/文章来源:https://www.cnblogs.com/ckrgd/p/18714715

参考:C# log4net的使用。输出的日志内容添加文件名和行号。_log4net 发布 输出的文件中行号-CSDN博客

 

1.NuGet增加log4net

 2.增加log4net.config文件

 log4net.config的内容如下,没有的功能可以搜一搜,设置 log4net.config的属性 复制到输出目录 设为始终复制

<?xml version="1.0" encoding="utf-8"?>
<configuration><configSections><section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/></configSections><!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低)--><log4net><!--调试信息--><logger name="InfoLog"><level value="ALL" /><appender-ref ref="InfoAppender" /></logger><!--错误信息--><logger name="ErrorLog"><level value="ALL" /><appender-ref ref="ErrorAppender" /></logger><!--Info日志附加介质--><appender name="InfoAppender" type="log4net.Appender.RollingFileAppender"><!--日志路径--><param name= "File" value= "Logs\"/><!--是否是向文件中追加日志--><param name= "AppendToFile" value= "true"/><!--log保留天数--><param name= "MaxSizeRollBackups" value= "100"/><!--写到一个文件--><staticLogFileName value="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSize value="200MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackups value="-1"/><!--日志文件名格式--><param name= "DatePattern" value= "yyyyMM\\yyyyMMdd'_InfoLog.log'"/><!--不以独占方式记录日志,仅在记录每个日志的最短时间内锁定,因为部署到服务器上遇到了文件被占用无法下载日志--><lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><!--日志根据日期滚动--><param name= "RollingStyle" value= "Date"/><!--日志文本格式--><layout type="log4net.Layout.PatternLayout"><!--%d  时间,等价于 date--><!--%t  线程--><!--%-5p  日志级别--><!--%C  出错类,等价于 class,可以使用:%class{1},如果给出了精度说明符,则只会打印类名中最右边的组件的相应数量。默认情况下,类名以完全限定形式输出。--><!--%L  出错行--><!--%M  方法名,等价于 method--><!--%m  日志信息,等价于 message--><!--%n  换行--><!--这种情况输出的类名方法名输出的是封装的类名<LogHelper>方法名每有意义--><!--<param name="ConversionPattern" value="**********%d 线程[%t] 日志级别[%p]**********%n类名:%C        方法名:%M - 第 [%L] 行%n消息:%m%n%n" />--><param name="ConversionPattern" value="**********%d 线程[%t] 日志级别[%p]**********%n消息:%m%n%n"/></layout></appender><!--Error日志附加介质--><appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender"><!--日志路径--><param name= "File" value= "Logs\"/><!--是否是向文件中追加日志--><param name= "AppendToFile" value= "true"/><!--log保留天数--><param name= "MaxSizeRollBackups" value= "100"/><!--日志文件名是否是固定不变的--><param name= "StaticLogFileName" value= "false"/><!--日志文件名格式--><param name= "DatePattern" value= "yyyyMM\\yyyyMMdd'_ErrorLog.log'"/><!--日志根据日期滚动--><param name= "RollingStyle" value= "Date"/><param name="MaxFileSize" value="1"/><!--日志文本格式--><layout type="log4net.Layout.PatternLayout"><!--%d  时间,等价于 date--><!--%t  线程--><!--%-5p  日志级别--><!--%C  出错类,等价于 class,可以使用:%class{1},如果给出了精度说明符,则只会打印类名中最右边的组件的相应数量。默认情况下,类名以完全限定形式输出。--><!--%L  出错行--><!--%M  方法名,等价于 method--><!--%m  日志信息,等价于 message--><!--%n  换行--><!--这种情况输出的类名方法名输出的是封装的类名<LogHelper>方法名每有意义--><!--<param name="ConversionPattern" value="**********%d 线程[%t] 日志级别[%p]**********%n类名:%C        方法名:%M - 第 [%L] 行%n消息:%m%n%n" />--><param name="ConversionPattern" value="**********%d 线程[%t] 日志级别[%p]**********%n消息:%m%n%n"/></layout></appender></log4net>
</configuration>

3.创建LogHelper.cs类

using System.Diagnostics;
using System.IO;
using log4net;[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4net\\log4net.config", Watch = true)]namespace TestLog4net.Log4net
{/// <summary>/// 日志助手类/// </summary>internal class LogHelper{private static ILog InfoLog = LogManager.GetLogger("InfoLog");private static ILog ErrorLog = LogManager.GetLogger("ErrorLog");//Debug Info Warn Error方法 在日志里体现在日志级别上/// <summary>/// 写日志/// </summary>/// <param name="message">日志信息</param>

      public static void WriteInfoLog(string message)
      {
        InfoLog.Info(AppendClassLine(message));
      }

/// <summary>/// 写错误日志/// </summary>/// <param name="message">日志信息</param>public static void WriteErrorLog(string message){ErrorLog.Error(AppendClassLine(message));}/// <summary>/// 给日志信息附加所在文件名和行/// </summary>/// <param name="msg">日志信息</param>/// <returns>附加后的日志信息</returns>static string AppendClassLine(string msg){string logStr = msg;try{//测试了一下这个new StackTrace(true) 10w次耗时1.3秒,性能可以接收啊//这个原理是读pdb文件,也许大项目读这个文件会更耗时StackTrace st = new StackTrace(true);StackFrame sf = st.GetFrame(2);logStr = $"{msg} [{Path.GetFileName(sf.GetFileName())}:{sf.GetFileLineNumber().ToString()}]";}catch{logStr = $"{msg} [没找到文件名和所在行]";}return logStr;}}
}

这里的new StackTrace(true)性能测试代码如下

using System;
using System.Diagnostics;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){const int iterations = 100000;// 测试 new StackTrace(false) 的性能var stopwatch1 = Stopwatch.StartNew();for (int i = 0; i < iterations; i++){var stackTrace = new StackTrace(false);}stopwatch1.Stop();Console.WriteLine($"new StackTrace(false) 耗时: {stopwatch1.ElapsedMilliseconds} 毫秒");// 测试 new StackTrace(true) 的性能var stopwatch2 = Stopwatch.StartNew();for (int i = 0; i < iterations; i++){var stackTrace = new StackTrace(true);}stopwatch2.Stop();Console.WriteLine($"new StackTrace(true) 耗时: {stopwatch2.ElapsedMilliseconds} 毫秒");}}
}

4.日志调用

using TestLog4net.Log4net;namespace TestLog4net
{internal class Program{static void Main(string[] args){LogHelper.WriteInfoLog("info日志");LogHelper.WriteErrorLog("error日志");}}
}

5.日志效果

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方DeepSeek接入),建议收藏!

在当今数字化时代,AI编程助手已成为提升开发效率的利器。DeepSeek作为一款强大的AI模型,凭借其出色的性能和开源免费的优势,成为许多开发者的首选。今天,就让我们一起探索如何将DeepSeek接入PyCharm,实现高效、智能的AI编程。 1、为什么选择DeepSeek + PyCharm? DeepSeek…

解锁互动新体验:专业互动小游戏开发,打造你的专属爆款

在移动互联网时代,互动小游戏以其轻量化、强社交、易传播的特性,成为了品牌营销、用户引流、产品推广的利器。无论是电商平台的趣味促销,还是教育机构的寓教于乐,亦或是线下门店的引流获客,互动小游戏都能以其独特的魅力,吸引用户参与,提升品牌影响力。 然而,想要打造一…

超详细,DeepSeep 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方DeepSeek接入),建议收藏!

在当今数字化时代,AI编程助手已成为提升开发效率的利器。DeepSeek作为一款强大的AI模型,凭借其出色的性能和开源免费的优势,成为许多开发者的首选。今天,就让我们一起探索如何将DeepSeek接入PyCharm,实现高效、智能的AI编程。 1、为什么选择DeepSeek + PyCharm? DeepSeek…

机台设备数据采集方案:打破数据孤岛,实现数据资源有效配置!

机台设备上的数据种类丰富多样,机台设备数据采集对于监测机台状态、优化生产过程以及进行故障诊断等都具有重要意义,可以提高设备的运行效率和生产效益。对于汽车零部件企业而言,会涉及以下机台设备数据采集需求: 1、生产设备: 冲压设备:如压力机等,用于金属板材的冲压成…

天猫精灵功能开发

AliGenie技能应用平台 消息中心咨询答疑文档中心zhwnw新人必看教程新人必看教程10分钟带你创建一个技能应用,4堂课掌握语音技能开发能力快速实现欢迎回复需要时间:10min实现单轮、多轮对话需要时间:20min切换意图,参数传递需要时间:15min开发屏显页面需要时间:20min课程介…

2025年企业数字化转型必备工具——文件摆渡系统深度解析

在数字化转型的过程中,企业需要优化各类信息流转、提升协作效率、确保数据安全以及合规性。文件摆渡系统作为一个核心工具,承担着文件传输、共享、管理和归档等多重任务,对于企业的信息化建设至关重要。本文将深度解析文件摆渡系统如何助力企业数字化转型。一、文件摆渡系统…

西门子S7 1200PLC使用modbusTCP通讯协议连接北京万维盈创数采仪,并做均值计算,WINCC上进行显示

现场有一套CEMS,数采仪使用的是北京万维盈创产品,需要和中控室西门子S7 1200PLC通讯,考虑到通讯协议兼容性,使用modbusTCP协议。数采仪IP地址设置成192.168.0.130,这是网络中没有其他设备使用的IP地址,万维盈创数采仪通讯协议和IP地址设置方法参考下面的链接,其他厂家数…

Blazor开发框架KnownPro-创建新项目

摘要本文主要介绍如何使用Known专业版创建新项目。操作步骤登录Known专业版VIP会员管理系统。 进入首页,点击【创建项目】按钮。弹出创建项目对话框,填写项目ID、名称和数据库类型(默认SQLite),点【确定】按钮后,等待后台生成完成并下载zip文件。提示创建成功。解压zip文件…

如何给本地部署的DeepSeek投喂数据,让他更懂你

写在前面 在上一篇文章中,我们说了怎么在本地部署DeepSeek。对本地部署DeepSeek感兴趣的小伙伴看过来。 本地部署 DeepSeek:小白也能轻松搞定! 话说回来了,为啥要本地部署呢? ① 在使用DeepSeek中,经常会出现服务器繁忙,请稍后再试。 ② 不想让个人隐私数据暴露出去 ③ …

Maven入门,读完这篇就够了

Maven 项⽬⽣命周期 Maven从项⽬的三个不同的⻆度,定义了三套⽣命周期,三套⽣命周期是相互独⽴的,它们之间不会相互影响。清理⽣命周期(Clean Lifecycle):该⽣命周期负责清理项⽬中的多余信息,保持项⽬资源和代码的整洁性。⼀般拿来清空directory(即⼀般的target)⽬录下的…

【第四期书生大模型实战营】L0G3000 Git 基础知识

闯关任务 任务1: 破冰活动:自我介绍 每位参与者提交一份自我介绍。 提交地址:https://github.com/InternLM/Tutorial 的 class 分支~命名格式为 <id>.md,其中 <id> 是您的报名问卷UID。 文件路径应为 ./icamp4/。 【大家可以叫我】内容可以是 GitHub 昵称、微信…

读算法简史:从美索不达米亚到人工智能时代15读后总结与感想兼导读

读算法简史:从美索不达米亚到人工智能时代15读后总结与感想兼导读1. 基本信息 算法简史:从美索不达米亚到人工智能时代克里斯布利克利 著中信出版集团股份有限公司,2024年9月出版1.1. 读薄率 书籍总字数18.6万字,笔记总字数51653字。 读薄率51653186000≈27.77% 1.2. 读厚方…