【C#】.net core 6.0 使用第三方日志插件Log4net,日志输出到控制台或者文本文档

欢迎来到《小5讲堂》
大家好,我是全栈小5。
这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解,
特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。
温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!

在这里插入图片描述

目录

  • 背景
  • 插件简介
  • 插件安装
  • 配置文件
    • 日志类型
    • 文件详情
  • 日志设置
    • 命名空间
    • 实例化
    • 日志调用
  • 输出控制台
  • 输出文本文档
  • 相关文章

背景

最近在最一些并发方式的测试,发现自己之前封装的一个日志插件报错,
尽管在写日志时已经通过锁的方式进行了优化,但是依然无法解决并发时同一个文件同时访问情况,
会频繁出现报错提示xxx.txt文件正在被另一个进程访问而不无法操作。
基于这个原因,暂时没有想好很好的优化方案,从而考虑使用第三方优秀日志插件来解决并发情况。

插件简介

Log4net 是一个稳定且功能丰富的日志库,已经存在多年并且被广泛使用。
它支持多种输出目标和格式,可以满足各种日志记录需求。
Log4net 具有灵活的配置选项,允许你根据需要定制日志记录行为。

插件安装

在项目中添加对 Log4net 的引用。可以使用 NuGet 包管理器来安装 Log4net。
选择一个合适版本进行安装,博主这里选择最新版本安装。
在这里插入图片描述

配置文件

日志类型

在 log4net 中,日志类型一般分为以下几种,对应不同的日志级别:

1.DEBUG
最详细的日志级别,通常用于打印一些调试信息,仅在开发和调试阶段使用,生产环境中通常不会记录 DEBUG 级别的日志。

2.INFO
用于记录程序正常运行时的重要信息,比如服务启动、关键流程开始或结束等。对于用户而言,通常不需要关注 INFO 级别的日志,但这些日志对于开发人员来说非常重要。

3.WARN
表明潜在的问题,但不会影响系统正常运行,比如某个接口请求参数不合法,程序采取了默认值处理;或者磁盘空间不足,但系统仍然能够正常运行。WARN 级别的日志用于提示开发人员和运维人员需要注意的问题。

4.ERROR
用于记录错误事件,但不会导致程序终止。比如捕获到了一个异常,程序进行了相应的处理,不会导致程序崩溃。ERROR 级别的日志通常需要开发人员及时关注并处理。

5.FATAL
表示严重的错误事件,可能导致程序终止。比如未捕获的异常、数据库连接失败等致命错误。FATAL 级别的日志表示系统出现了严重的错误,需要立即处理。

文件详情

此配置文件内容,按日志级别创建文件,按时间年月日时来创建文件名,同一小时内超过10M文件大小则拆分文件保存。

<?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" />
        <staticLogFileName value="false"/>
        <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" />
        <staticLogFileName value="false"/>
        <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>

通过使用不同级别的日志记录,开发人员和运维人员可以更好地了解系统的运行情况,及时发现潜在问题,并采取相应的措施进行处理。

日志设置

命名空间

using log4net;
using log4net.Config;
using System.Reflection;

实例化

// 日志插件
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepository, new FileInfo(Path.Combine(AppContext.BaseDirectory, "log4net.config")));

日志调用

private static readonly ILog log = LogManager.GetLogger(typeof(SqlHelper));

public void Test()
{    
    log.Fatal("Fatal message");
    log.Debug("Debug message");
    log.Info("Info message");
    log.Warn("Warn message");
    log.Error("Error message");
}

输出控制台

根据上面默认配置文件信息,日志信息输出到控制台里。
使用的类型是log4net.Appender.ConsoleAppender

<?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>

在这里插入图片描述

输出文本文档

根据上面默认配置文件信息,日志信息输出到文本文档里。
使用的类型是log4net.Appender.Appender.RollingFileAppender

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
    <!--定义日志级别-->
    <root>
        <level value="DEBUG"/>
        <appender-ref ref="DebugAppender" />
    </root>
 
    <!--调试日志-->
    <appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
        <file type="log4net.Util.PatternString" value="logs\Debug\%date{yyyyMMddHH}.log" />

        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <staticLogFileName value="false"/>
        <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#】.net core 6.0 使用第三方日志插件Log4net,配置文件详细说明
【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),代码实现篇
【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),流程描述篇
【C#】约瑟夫原理举例2个代码实现
【C#】List泛型数据集如何循环移动,最后一位移动到第一位,以此类推
【C#】获取文本中的链接,通过正则表达式的方法获取以及优化兼容多种格式

温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】stack/queue

链表完了之后就是我们的栈和队列了&#xff0c;当然我们的STL中也有实现&#xff0c;下面我们先来看一下简单用法&#xff0c;跟我们之前C语言实现的一样&#xff0c;stack和queue有这么几个重要的成员函数 最主要的就是这么几个&#xff1a;empty&#xff0c;push&#xff0c;…

python读取大型csv文件,降低内存占用,提高程序处理速度

文章目录 简介读取前多少行读取属性列逐块读取整个文件总结参考资料 简介 遇到大型的csv文件时&#xff0c;pandas会把该文件全部加载进内存&#xff0c;从而导致程序运行速度变慢。 本文提供了批量读取csv文件、读取属性列的方法&#xff0c;减轻内存占用情况。 import pand…

git commit --amend

git commit --amend 1. 修改已经输入的commit 1. 修改已经输入的commit 我已经输入了commit fix: 删除无用代码 然后现在表示不准确&#xff0c;然后我通过命令git commit --amend修改commit

鼓楼夜市管理wpf+sqlserver

鼓楼夜市管理系统wpfsqlserver 下载地址:鼓楼夜市管理系统wpfsqlserver 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于C#wpf架构和sql server数据库 功能模块&#xff1a; 登录注册 鼓楼夜市管理系统主界面所有店铺信…

企业电子招投标系统源码-从源码到实践:深入了解鸿鹄电子招投标系统与电子招投标

在数字化采购领域&#xff0c;企业需要一个高效、透明和规范的管理系统。通过采用Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;我们打造了全过程数字化采购管理平台。该平台具备内外协同的能力&#xff0c;通过待办消息、招标公告、中标公告和信息发布等功能模块…

Tictoc3例子

在tictoc3中&#xff0c;实现了让 tic 和 toc 这两个简单模块之间传递消息&#xff0c;传递十次后结束仿真。 首先来介绍一下程序中用到的两个函数&#xff1a; 1.omnetpp中获取模块名称的函数 virtual const char *getName() const override {return name ? name : "&q…

Python 一步一步教你用pyglet制作汉诺塔游戏(终篇)

目录 汉诺塔游戏 完整游戏 后期展望 汉诺塔游戏 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;是一个源于印度古老传说的益智玩具。这个传说讲述了大梵天创造世界的时候&#xff0c;他做了三根金刚石柱子&#xff0c;并在其中一根柱子上从下往上按照大小顺序摞…

js【详解】Promise

为什么需要使用 Promise &#xff1f; 传统回调函数的代码层层嵌套&#xff0c;形成回调地狱&#xff0c;难以阅读和维护&#xff0c;为了解决回调地狱的问题&#xff0c;诞生了 Promise 什么是 Promise &#xff1f; Promise 是一种异步编程的解决方案&#xff0c;本身是一个构…

套接字的地址结构,IP地址转换函数,网络编程的接口

目录 一、套接字的地址结构 1.1 通用socket地址结构 1.2 专用socket地址结构 1.2.1 tcp协议族 1.2.3 IP协议族 二、IP地址转换函数 三、网络编程接口 3.1 socket() 3.2 bind() 3.3 listen() 3.4 accept() 3.5 connect() 3.6 close() 3.7 recv()、send() 3.8 recv…

手写简易操作系统(五)--获得物理内存容量

前情提要 上一章中我们进入了保护模式&#xff0c;并且跳转到了32位模式下执行。这一章较为简单&#xff0c;我们来获取物理内存的实际容量。 一、获得内存容量的方式 在Linux中有多种方法获取内存容量&#xff0c;如果一种方法失败&#xff0c;就会试用其他方法。其本质上是…

考研数学|汤家凤《1800》vs 张宇《1000》,怎么选?

汤家凤的1800题和张宇的1000题都是备考数学考研的热门选择&#xff0c;但究竟哪个更适合备考呢&#xff1f;下面分享一些见解。 首先&#xff0c;让我们来看看传统习题册存在的一些问题。虽然传统习题册通常会覆盖考试的各个知识点和题型&#xff0c;但其中一些问题在于它们可…

JDBC连接MysqL

import java.sql.*;public class Demo {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1.注册驱动&#xff0c;加载驱动&#xff1b;Class.forName("com.mysql.jdbc.Driver");//2.获得连接,返回connection类型的对象&…

汤唯短发造型:保留经典和适合自己的风格,也许才是最重要的

汤唯短发造型&#xff1a;保留经典和适合自己的风格&#xff0c;也许才是最重要的 汤唯短发造型登上Vogue四月刊封面&#xff0c;引发网友热议。#李秘书讲写作#说说是怎么回事&#xff1f; 这次Vogue四月刊的封面大片&#xff0c;汤唯以一头短发亮相&#xff0c;身穿五颜六色的…

钉钉平台“智”领宠物界,开启萌宠智能新时代!

在当前数字化转型的浪潮中&#xff0c;钉钉用便捷的数字化解决方案推动了宠物业界的智能升级。一家宠物用品公司采用无雀科技数字化管理系统&#xff0c;与钉钉平台结合&#xff0c;解决了小型企业普遍存在的财务管理不清晰、业务流程不规范、客户信息核对繁琐等痛点问题。 针对…

一周学会Django5 Python Web开发-Django5内置模板引擎-模板继承

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计34条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

Linux中文件的权限

我们首先需要明白&#xff0c;权限 用户角色 文件的权限属性 一、拥有者、所属组和other&#xff08;用户角色&#xff09; 以文件file1为例 第一个箭头所指处即是文件的拥有者&#xff0c;拥有者为zz 第二个箭头所指处即使文件的所属组&#xff0c;所属组为zz 除去拥有者…

嵌入式系统工程师错题总结

笔者来介绍一下嵌入式系统工程师考试的一些易错题目 题目介绍  流水线指令计算公式&#xff1a;一条指令总时间max&#xff08;单个指令执行时间&#xff09;*&#xff08;指令数-1&#xff09;  平均故障间隔时间  ICMP协议&#xff1a;传送通信问题相关的消息。 …

电脑打开应用慢

电脑打开什么应用都很慢 我的电脑是i73060&#xff0c;但是打开应用很慢 解决办法&#xff1a; 在注册表[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CI\Policy]将"VerifiedAndReputablePolicyState"的值设置为0&#xff0c;如果没有这一项&#xff0c;就…

SPI、Spring SPI、SpringFactoriesLoader

一、SPI技术 SPI全名Service Provider interface&#xff0c;翻译过来就是“服务提供接口”&#xff0c;再说简单就是提供某一个服务的接口&#xff0c; 提供给服务开发者或者服务生产商来进行实现。 Java SPI 是JDK内置的一种动态加载扩展点的实现。 这个机制在一般的业务代…

【数据集】2023自动驾驶开源数据集-学习笔记

文章目录 1. 自动驾驶有哪些公开数据集2. 预测相关的数据集有哪些 1. 自动驾驶有哪些公开数据集 waymo open dataset 适应任务: 域适应&#xff0c;2D追踪&#xff0c;2D检测&#xff0c;3D追踪&#xff0c;3D检测&#xff0c;实时2D检测&#xff0c;实时3D检测&#xff0c;交互…