C#一个完整的Log4net使用实例

.net log4net m(message),输出的日志消息%n(newline),换行%d(datetime),输出当前语句运行的时刻%r(runtime),输出程序从运行到当前语句时消耗的毫秒数%t(thread id),输出当前语句运行的线程ID%p(priority): 日志的当前日志级别%c(class),输出当前语句所在的对象名称%M(method),输出当前语句所在的方法名称%f(file),输出当前语句所在的文件名称%L(line),输出当前语句位于所在的文件中的行号。 阅读详情

Log4net库是.Net下一个非常优秀的开源日志记录组件,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。它具有:支持多数框架、可输出日志到多种目标、层级日志体系、可使用XML配置、可动态配置、模块化和可扩展化设计、灵活、高性能等特征。

日志记录器(Logger)的行为是分等级的,一般可分为5种日志等级(Level),优先级从高到低:

1、FATAL(致命错误):记录系统中出现的能使用系统完全失去功能,服务停止,系统崩溃等使系统无法继续运行下去的错误。例如,数据库无法连接,系统出现死循环。

2、ERROR(一般错误):记录系统中出现的导致系统不稳定,部分功能出现混乱或部分功能失效一类的错误。例如,数据字段为空,数据操作不可完成,操作出现异常等。

3、WARN(警告):记录系统中不影响系统继续运行,但不符合系统运行正常条件,有可能引起系统错误的信息。例如,记录内容为空,数据内容不正确等。

4、INFO(一般信息):记录系统运行中应该让用户知道的基本信息。例如,服务开始运行,功能已经开户等。

5、DEBUG (调试信息):记录系统用于调试的一切信息,内容或者是一些关键数据内容的输出。

我们可以控制到应用程序中相应级别的日志信息的开关。比如在定义了INFO级别, 则应用程序中所有DEBUG级别的日志信息将不被打印出来。

使用实例:

1、新建WPF应用程序LogDemo;

2、在项目中添加对log4net.dll的引用,这里引用版本是2.0.8.0。

3、在App.config文件中添加配置信息;

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <!--log4net配置start-->
  <configSections>
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
  </configSections>
  <log4net>
    <appender name="RollingLogFileAppender_DateFormat" type="log4net.Appender.RollingFileAppender">
      <file value="D:/Log/Demo_"/>
      <appendToFile value="true"/>
      <rollingStyle value="Date"/>
      <datePattern value="yyyy-MM-dd&quot;.log&quot;"/>
      <staticLogFileName value="false"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread](%file:%line) %-5level %logger [%property{NDC}] - %message%newline"/>
      </layout>
    </appender>
    <root>
      <appender-ref ref="RollingLogFileAppender_DateFormat"/>
    </root>
  </log4net>
  <!--log4net配置end-->
  <startup> 
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
</configuration>

4、在AssemblyInfo.cs中添加配置项

//Log4net.config配置文件
[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "config", Watch = true)]

5、新建XML文件夹添加Config.xml配置文件

<?xml version="1.0" encoding="utf-8" ?>
<appSettings>
  <!--日志等级-->
  <LogLevel>0</LogLevel>
  <!--日志目录-->
  <LogFilePath>D:/Log</LogFilePath>
  <!--日志存在天数-->
  <LogFileExistDay>1</LogFileExistDay>
</appSettings>

注意修改Config.xml文件属性: 

6、新建Utility文件夹,分别添加日志记录类LogHelper.cs、全局使用参数类Parameter.cs、XML文件读取类XMLHelper.cs;

LogHelper.cs

using System;
using System.Reflection;
using static LogDemo.Utility.Parameter;

namespace LogDemo.Utility
{
    /// <summary>
    /// Fatal级别的日志由系统全局抓取
    /// </summary>
    public class LogHelper
    {
        public static readonly log4net.ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

        public static void Debug(object messsage)
        {
            if ((int)Parameter.LogLevel <= (int)LogLevelEnum.Debug)
            {
                log.Debug(messsage);
            }
        }

        public static void DebugFormatted(string format, params object[] args)
        {
            if ((int)Parameter.LogLevel <= (int)LogLevelEnum.Debug)
            {
                log.DebugFormat(format, args);
            }
        }

        public static void Info(object message)
        {
            if ((int)Parameter.LogLevel <= (int)LogLevelEnum.Info)
            {
                log.Info(message);
            }
        }

        public static void InfoFormatted(string format, params object[] args)
        {
            if ((int)Parameter.LogLevel <= (int)LogLevelEnum.Info)
            {
                log.InfoFormat(format, args);
            }
        }

        public static void Warn(object message)
        {
            if ((int)Parameter.LogLevel <= (int)LogLevelEnum.Warn)
            {
                log.Warn(message);
            }
        }

        public static void WarnFormatted(string format, params object[] args)
        {
            if ((int)Parameter.LogLevel <= (int)LogLevelEnum.Warn)
            {
                log.WarnFormat(format, args);
            }
        }

        public static void Error(object message)
        {
            if ((int)Parameter.LogLevel <= (int)LogLevelEnum.Error)
            {
                log.Error(message);
            }
        }

        public static void Error(object message, Exception exception)
        {
            if ((int)Parameter.LogLevel <= (int)LogLevelEnum.Error)
            {
                log.Error(message, exception);
            }
        }

        public static void ErrorFormatted(string format, params object[] args)
        {
            if ((int)Parameter.LogLevel <= (int)LogLevelEnum.Error)
            {
                log.ErrorFormat(format, args);
            }
        }

        public static void Fatal(object message)
        {
            if ((int)Parameter.LogLevel <= (int)LogLevelEnum.Fatal)
            {
                log.Fatal(message);
            }
        }

        public static void Fatal(object message, Exception exception)
        {
            if ((int)Parameter.LogLevel <= (int)LogLevelEnum.Fatal)
            {
                log.Fatal(message, exception);
            }
        }

        public static void FatalFormatted(string format, params object[] args)
        {
            if ((int)Parameter.LogLevel <= (int)LogLevelEnum.Fatal)
            {
                log.FatalFormat(format, args);
            }
        }
    }
}

Parameter.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LogDemo.Utility
{
    public class Parameter
    {
        /// <summary>
        /// 日志等级
        /// </summary>
        public enum LogLevelEnum
        {
            Debug = 0,
            Info = 1,
            Warn = 2,
            Error = 3,
            Fatal = 4
        }

        /// <summary>
        /// 当前保存日志等级
        /// </summary>
        public static LogLevelEnum LogLevel;

        /// <summary>
        /// 日志存放路径
        /// </summary>
        public static string LogFilePath;

        /// <summary>
        /// 日志存放天数
        /// </summary>
        public static int LogFileExistDay;
    }
}

XMLHelper.cs

using System;
using System.IO;
using System.Xml;
using static LogDemo.Utility.Parameter;

namespace LogDemo.Utility
{
    public static class XMLHelper
    {
        public static void ReadXml()
        {
            try
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "XML", "Config.xml"));
                var node = doc.SelectSingleNode("appSettings");
                Parameter.LogLevel = (LogLevelEnum)Enum.Parse(typeof(LogLevelEnum), node.SelectSingleNode("LogLevel").InnerText);
                Parameter.LogFilePath = node.SelectSingleNode("LogFilePath").InnerText;
                Parameter.LogFileExistDay = int.Parse(node.SelectSingleNode("LogFileExistDay").InnerText);

                LogHelper.Debug("XML文件读取成功。");
            }
            catch (Exception ex)
            {
                LogHelper.log.Error(string.Format("XML文件读取失败。{0}", ex));
            }
        }
    }
}

7、在App.xaml.cs中添加系统全局抓取日志记录

using LogDemo.Utility;
using System.Windows;

namespace LogDemo
{
    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            this.DispatcherUnhandledException += App_DispatcherUnhandledException;
        }

        private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            LogHelper.Fatal(e.Exception);//添加系统全局抓取日志记录
            e.Handled = true;
        }
    }
}

8、主界面xaml

<Window x:Class="LogDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:LogDemo"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Label Content="现在可以查看日志了" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="32"></Label>
    </Grid>
</Window>

 9、交互逻辑

using LogDemo.Utility;
using System;
using System.IO;
using System.Threading.Tasks;
using System.Windows;

namespace LogDemo
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Init();
        }

        private void Init()
        {
            //读取XML配置信息
            XMLHelper.ReadXml();
            //日志清除
            Task.Factory.StartNew(() =>
            {
                DirectoryInfo di = new DirectoryInfo(Parameter.LogFilePath);
                if (!di.Exists)
                    di.Create();
                FileInfo[] fi = di.GetFiles("Demo_*.log");
                DateTime dateTime = DateTime.Now;
                foreach (FileInfo info in fi)
                {
                    TimeSpan ts = dateTime.Subtract(info.LastWriteTime);
                    if (ts.TotalDays > Parameter.LogFileExistDay)
                    {
                        info.Delete();
                        LogHelper.Debug(string.Format("已删除日志。{0}", info.Name));
                    }
                }
                LogHelper.Debug("日志清理完毕。");
            });
        }
    }
}

10、项目结构 

11、运行结果

c#使用log4net日志 1.在Nuget中下载log4net 2.增加App.config文件 具体的配置可以查看资料,: <level value="ALL"/>,这个ALL就是记录所有的日志信息 <file value="./RedLog.txt"/>,这个是路径,目前就是在debug下面 <?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <sup. 阅读详情

相关推荐

C# log4net实战:5分钟搞定日志文件按日期自动分割(附完整配置代码)

本文详细介绍了如何使用C#的log4net库实现日志文件按日期自动分割,提供完整的配置代码和实战技巧。通过RollingFileAppender的灵活配置,开发者可以轻松管理日志文件,避免无限增长,提升系统性能。文章还包含多环境配置、文件锁定解决方案等进阶内容,是C#开发者优化日志系统的实用指南。

weixin_42570484的博客 186

Log4Net详解

Log4net库是.Net下一个非常优秀的开源日志记录组件,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。如果应用程序出现问题,启用日志记录有助于定位问题。日志输出可能非常庞大,以至于很快就会变得不堪重负。log4net 的显着特征之一是分层记录器的概念。使用这些记录器可以有选择地控制以任意粒度输出哪些日志语句。使用 log4net,可以在运行时修改配置文件,你不需要重新编译源代码就能改变日志的输出形式。官网地址:https://logging.apache.org/log4ne

李宥的博客 1万+

C#中日志文件log4net.dll配置使用

第一步:新建一个我inform项目 第二步:添加log4net.dll到项目中 第三步:在config配置文件中添加如下内容 <log4net> <logger name="logerror"> <level value="ERROR" /> <appender-ref ref="ErrorAppender" />...

a720561252803的博客 1444

Log4Net 详解

1.Log4Net环境的搭建与基本配置 (1)Log4Net框架介绍 Log4net 是 Apache 下一个开放源码的项目,它是Log4j 的一个克隆版。我们可以控制日志信息的输出目的地。Log4net中定义了多种日志信息输出模式。它可以根据需要将日志输出到控制台,文本文件,windows 日志事件查看器中,包括数据库,邮件等等位置,以便我们快速跟踪程序bug。 (2)Log4Net的环境配置以及简单使用 程序代码: //[assembly: log4net.Config.Xm...

mjiansun的专栏 1万+

C# 超高速高性能写日志 代码开源

1、需求 需求很简单,就是在C#开发中高速写日志。比如在高并发,高流量的地方需要写日志。我们知道程序在操作磁盘时是比较耗时的,所以我们把日志写到磁盘上会有一定的时间耗在上面,这些并不是我们想看到的。   2、解决方案 2.1、简单原理说明 使用列队先缓存到内存,然后我们一直有个线程再从列队中写到磁盘上,这样就可以高速高性能的写日志了。因为速度慢的地方我们分离出来了,也就是说程序在把日志扔

Emrys5的博客 1761

C#开发Windows服务:从入门到实践

Windows服务是Windows操作系统中以后台形式长期运行的特殊应用程序,广泛应用于企业级后台任务处理。其核心原理基于服务控制管理器(SCM)的生命周期管理,通过System.ServiceProcess命名空间提供基础框架。在C#开发中,Windows服务技术价值体现在无需用户交互的自动化执行、系统启动自运行等特性,特别适合数据同步、定时任务等场景。log4net日志框架和多线程处理是开发健壮服务的两大关键技术,前者确保运行可观测性,后者保障长期稳定运行。本文以Visual Studio开发环境为例,

weixin_33462927的博客 244

C#下log4net日志记录使用实例完整教程

C#下log4net日志记录使用实例完整教程1 log4net1.1 log4net简介1.2 log4net源码下载1.3 log4net源码编译1.3.1 编译工具1.3.2 编译步骤1.3.2.1 解压log4net源码apache-log4net-source-2.0.10.zip1.3.2.2 找到文件“……\log4net解压目录\src\log4net.sln”1.3.2.3 Visual Studio运行“log4net.sln”1.3.2.4 Visual Studio中设置工程等细节2

ZYF的博客 3777

C#【必备技能篇】log4net的使用

使用log4net大致分以下几步: 1.安装 log4net,通过 Nuget 下载(或者有log4net.dll的话,直接引用即可) 2.新建 log4net.config 配置文件

星Yeah 的博客 1万+

C# .NET中使用log4Net日志框架指南

本指南介绍了在C# .NET中使用log4Net日志框架的完整流程。log4Net支持多目标输出和分级日志记录,通过NuGet安装后,需配置XML文件定义日志行为。文中演示了基础代码实现、异常处理日志记录,并提供了高级配置技巧(如多输出、日志轮转)和最佳实践建议。推荐结合NetCoreKevin框架(GitHub/Gitee可获取)增强日志管理功能,实现云集成和AI分析等现代化特性。

weixin_42629287的博客 1935

C# Winform用户权限管理系统项目实战

Windows Forms(简称Winform)是基于.NET Framework的图形界面开发框架,它提供了丰富的控件库和事件驱动机制,使开发者能够快速构建功能完善的桌面应用程序。Winform的核心在于其可视化设计器和事件驱动模型,开发者可以通过拖放控件构建界面,并通过编写事件处理逻辑实现交互功能。例如,一个简单的Winform窗体应用可以通过以下C#代码创建一个按钮并绑定点击事件:btn.Text = "点击我";

weixin_42584586的博客 558

基于C#的软件系统监控系统设计与实现

软件系统监控是指对应用程序运行状态、资源消耗、异常行为等关键指标进行持续采集、分析与反馈的过程。在C#生态中,得益于CLR(Common Language Runtime)的精细化控制能力,开发者可深入获取托管代码的执行细节,实现从方法调用到内存分配的全链路可观测性。监控不仅是故障排查的基础,更是性能优化、容量规划与SLA保障的前提。除系统预定义计数器外,开发者还可创建自定义性能计数器,用于暴露业务特有的性能指标,如订单处理速率、缓存命中率等。

weixin_36487018的博客 764

在C#中使用LOG4NET(winform程序

http://www.csharpwin.com/csharpspace/678.shtml 1.下载log4net (Google log4net)2.unzip log4net3.运行VS,新建 c# Windows应用程序。4.添加引用Log4NET5.新建一个应用程序配置文件App.config(具体内容附在后面)6.打开Form1.cs,在Namespace上添加一行 [a...

weixin_34051201的博客 185

Vue3实战:集成bpmn-js与Activiti工作流引擎的完整指南

本文详细介绍了如何在Vue3项目中集成bpmn-js流程图编辑器与Activiti工作流引擎,构建一个完整的前端流程设计器。文章重点解析了Vue3响应式系统与bpmn-js集成的核心陷阱及解决方案,并提供了属性面板配置、XML命名空间适配、撤销重做等实用功能的完整实现指南,帮助开发者高效完成工作流系统的前端开发。

weixin_29009881的博客 210

log4net更换目录

public static void ChangeRollingFileName(){// ログファイルlog4net.ILog iLog = log4net.LogManager.GetLogger("AppLogger");// パスstring strPath = Environ...

weixin_30878501的博客 122

零基础玩转STM32CubeIDE LL库:5分钟搞定串口通信(附完整代码)

本文为零基础开发者提供了一份STM32CubeIDE LL库串口通信的快速实战指南。通过CubeMX配置、LL库核心API详解,以及中断接收与环形缓冲区的完整代码实现,帮助读者在5分钟内搭建稳定可靠的串口收发框架,解决从HAL切换到LL库的常见困惑,提升嵌入式开发效率。

weixin_29159441的博客 305

【软件安装系列】Ubuntu+mysql5.7.27+Jira8.3.1+邮箱服务器配置+Confluence6.15.7安装经验和采坑总结

文章目录一、软件准备(百度云易被吞,就不放了)1.1 官网下载的新鲜的Jira和Confluence1.2 linux的jdk一份1.3 Jira和Confluence的破解程序或者破解包一份1.4 java的连接器一份二、安装过程1--java环境配置2.1 将下载下来的jdk包解压在/usr/local/java目录中2.2 写入环境变量三、安装过程2--mysql5.7.27环境配置3.1 ...

xiaosha_的博客 6888

C最简单最完整的webservice实例:项目推荐文章

C#最简单最完整的webservice实例:项目推荐文章 去发现同类优质开源项目:https://gitcode.com/ 项目核心功能/场景 提供C#语言实现的简易Web服务示例,适用于快速搭建与学习。 项目介绍 在软件开发领域,Web服务是构建分布式系统的重要组件。对于希望学习或快速实现Web服务的开发者来说,C#最简单最完整的webservice实例是一个宝贵的资源。本项目提供了一个用C#语...

gitblog_06724的博客 414

从代码到实践:手把手教你用EmbodiedOcc++实现高效3D占用预测(含ScanNet配置)

本文提供了EmbodiedOcc++框架在ScanNet数据集上实现高效3D占用预测的完整实践指南。从环境搭建、数据预处理入手,详细解析了其核心创新点——几何引导优化(GRM)与语义感知不确定性采样(SUS)的代码实现与配置,并分享了训练、评估及调参的实战技巧,帮助开发者快速掌握这一先进的3D感知技术。

terraform7cloud的博客 587

【windows服务】使用TopShelf创建Windows服务

1、创建项目 2、使用nuget安装Topshelf和Topshelf.Log4Net(记录日志) 3、创建MyService using System; using System.Timers; using log4net; namespace TopshelfDemo { public class MyService { reado...

早起吃虫的博客 265

《无人驾驶车辆模型预测控制》(第二版)第四章详细学习——算法部分

根据代码进行的“MPC跟踪直线和圆算法”的详细推导学习记录。

Fengdf666的博客 5015

Android汽车服务篇(一) CarService

本文主要说明了CarService这一系统服务的启动流程,以及一些关键成员的创建和初始化流程.同时简单介绍了一下客户端是如何获取和使用CarService对象, 如上文介绍的, CarService对象只是获取各个Manager的媒介,它本身并不承担管理传感器.空调等具体的任务.如果要获取车辆的相关信息,如车速, 车内空调温度,诊断信息, 或对车辆进行相关的控制,如升高和降低空调温度,控制座椅和车窗, 调节音量等,就要通过具体的Manager中的API和对应的服务来实现了.

u012514113的专栏 8145

C# log4net 日志输出实战:从配置到多场景应用

本文详细介绍了如何在C#中使用log4net进行高效的日志记录,从基础配置到高级应用场景全覆盖。内容包括log4net的优势、安装方法、配置文件示例、多级别日志控制、异常记录最佳实践以及性能优化技巧,帮助开发者快速掌握这一强大的日志工具,提升应用的可维护性和调试效率。

weixin_29174385的博客 326

谷歌A2A协议入门指南:附简易Python代码示例

继"关税"之后,当下最热门的词汇当属AI智能体——这种基于人工智能的软件能够执行复杂任务、实现工作流自动化并提升生产效率。但迄今为止,大多数智能体都处于各自为政的状态,难以顺畅协作。就像团队执行重大项目时,成员之间却无法交流!对于技术人员而言,一个可能遇到的典型场景是:假设你需要协调四个不同的AI服务——处理用户查询的Gemini智能体、在向量数据库进行搜索的AI应用、基于Claude的摘要生成器,以及运行专业领域逻辑的Python智能体。

独立开发,substack顶级编辑 792

C MVC程序,定时截取网络摄像头(大华)图片

C# MVC程序,定时截取网络摄像头(大华)图片 去发现同类优质开源项目:https://gitcode.com/ 此资源文件是一个C# MVC程序,主要展示了以下功能: 画面跳转:实现了前端页面的切换与交互。 AJAX访问传值:通过AJAX技术与服务器进行数据交互,实现无刷新数据传递。 添加LOG日志Log4net:采用Log4net日志框架,记录程序运行过程中的关键信息,便于追踪与调试。 添...

gitblog_06770的博客 429

基于C++的MMC仿真与PSCAD建模

MMC是一种基于模块化设计的多电平换流器,通常由若干个基本单元(子模块)组成。每个子模块包含一个电容和两个开关,通过控制开关的开闭,实现输出电压的级联和多电平化。高效率:由于开关频率较低,开关损耗小,效率高。高可靠性:模块化设计使得故障模块易于更换,提高了系统的可靠性。灵活扩展:可以通过增加或减少子模块的数量,方便地调整输出电压和功率。PSCAD(Power Systems Computer Aided Design)是广泛应用于电力系统仿真的专业软件,具有强大的建模和仿真能力。

qq_38334677的博客 295

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: C#动态数据集合ObservableCollection的三种排序方式
下一篇: WPF加载自定义WebBrower浏览器控件实现网页缩放
RunnerDNA
博客等级 码龄14年 575粉丝 97原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RunnerDNA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值