.NetCore之log4net的使用

2023-11-11

1.首先下载log4ne的包:
在这里插入图片描述
2.添加配置文件log4net.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<!-- This section contains the log4net configuration settings -->
	<log4net>
		<appender name="ErrorLogFileAppender" type="log4net.Appender.RollingFileAppender">
			<!--日志输入路径-->
			<file value="ErrorLog/" />
			<!--日志是否追加到文件-->
			<appendToFile value="true" />
			<!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
			<rollingStyle value="Composite" />
			<!--是否只写到一个文件中-->
			<staticLogFileName value="false" />
			<!--防止多线程时不能写Log,官方说线程非安全-->
			<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
			<!--按日期命名文件-->
			<datePattern value="yyyyMMdd'.log'" />
			<!--最多产生文件数超过的话保留最新-->
			<maxSizeRollBackups value="100" />
			<!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志-->
			<maximumFileSize value="50MB" />
			<layout type="log4net.Layout.PatternLayout">
				<conversionPattern value="%date  [%thread]  %-5level  %message%newline" />
				<header value="&#xA;----------------------header--------------------------&#xA;" />
				<footer value="&#xA;----------------------footer--------------------------&#xA;"/>
			</layout>
			<!--定义日志级别根据不同的级别调用不同的配置写入-->
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="Error" />
				<param name="LevelMax" value="Error" />
			</filter>
		</appender>

		<appender name="DeBugLogFileAppender" type="log4net.Appender.RollingFileAppender">
			<!--日志输入路径-->
			<file value="DeBugLog/" />
			<!--日志是否追加到文件-->
			<appendToFile value="true" />
			<!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
			<rollingStyle value="Composite" />
			<!--是否只写到一个文件中-->
			<staticLogFileName value="false" />
			<!--防止多线程时不能写Log,官方说线程非安全-->
			<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
			<!--按日期命名文件-->
			<datePattern value="yyyyMMdd'.log'" />
			<!--最多产生文件数超过的话保留最新-->
			<maxSizeRollBackups value="100" />
			<!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志-->
			<maximumFileSize value="50MB" />
			<layout type="log4net.Layout.PatternLayout">
				<conversionPattern value="%date  [%thread]  %-5level  %message%newline" />
				<header value="&#xA;----------------------header--------------------------&#xA;" />
				<footer value="&#xA;----------------------footer--------------------------&#xA;"/>
			</layout>
			<!--定义日志级别根据不同的级别调用不同的配置写入-->
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="DeBug" />
				<param name="LevelMax" value="DeBug" />
			</filter>
		</appender>

		<!-- Setup the root category, add the appenders and set the default level -->
		<root>
			<level value="All" />
			<appender-ref ref="ErrorLogFileAppender" />
			<appender-ref ref="DeBugLogFileAppender" />
		</root>
	</log4net>
</configuration>

3.添加日志帮助类

using log4net.Config;
using log4net;

namespace CodeIdentify
{
    public class LoggerHelper
    {
        private ILog logger;
        public LoggerHelper()
        {
            if (logger == null)
            {
                var repository = LogManager.CreateRepository("NETCoreRepository");
                //log4net从log4net.config文件中读取配置信息
                XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));
                logger = LogManager.GetLogger(repository.Name, "Logger");
            }
        }

        /// <summary>
        /// Debug日志
        /// </summary>
        /// <param name="data">调试数据</param>
        public void Debug(object data)
        {
            logger.Debug(data);
        }

        /// <summary>
        /// 普通日志
        /// </summary>
        /// <param name="controller">控制器</param>
        /// <param name="exception">catch异常信息</param>
        public void Info(string controller, Exception exception = null)
        {
            if (exception == null)
                logger.Info(controller);
            else
                logger.Info(controller, exception);
        }

        /// <summary>
        /// 告警日志
        /// </summary>
        /// <param name="controller"></param>
        /// <param name="exception"></param>
        public void Warn(string controller, Exception exception = null)
        {
            if (exception == null)
                logger.Warn(controller);
            else
                logger.Warn(controller, exception);
        }

        /// <summary>
        /// 错误日志
        /// </summary>
        /// <param name="controller"></param>
        /// <param name="exception"></param>
        public void Error(string controller, Exception exception = null)
        {
            if (exception == null)
                logger.Error(controller);
            else
                logger.Error(controller, exception);
        }
    }

}

4.在服务中采用单例生命周期注入

builder.Services.AddSingleton(typeof(LoggerHelper));

5.添加全局异常过滤器

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System.Net;

namespace CodeIdentify
{
    public class GlobalExceptionFilter : IExceptionFilter
    {

        private readonly LoggerHelper  _loggerHelper;
        public GlobalExceptionFilter(LoggerHelper loggerHelper)
        {
            _loggerHelper= loggerHelper;
        }
        public void OnException(ExceptionContext context)
        {
            var exception = context.Exception;
            _loggerHelper.Error(context.HttpContext.Request.Method, exception);
            context.ExceptionHandled = true; // 标记已处理异常
        }
    }
}

6.注入过滤器服务

builder.Services.AddControllers(options =>
{
    options.Filters.Add<GlobalExceptionFilter>();
});

7.使用

using CodeIdentify.Servers;
using Microsoft.AspNetCore.Mvc;

namespace CodeIdentify.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class CodeIdentityController : ControllerBase
    {
        private readonly IBaiDuCodeIdentity _baiDuCodeIdentity;
        public CodeIdentityController(IBaiDuCodeIdentity baiDuCodeIdentity) 
        {
            _baiDuCodeIdentity = baiDuCodeIdentity;
        }
        [HttpPost]
        public async Task<IActionResult> GetCode([FromBody] string url) 
        {
            if(string.IsNullOrWhiteSpace(url)) throw new ArgumentNullException(nameof(url));
          
            return Ok();
         

        } 
    }
}

日志截图:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NetCore之log4net的使用 的相关文章

随机推荐

  • 在matlab中如何把两个txt文件合并到一起

    a 1 2 3 2 3 4 b 4 5 6 5 9 9 要求 c 1 2 3 2 3 4 4 5 6 5 9 9 使用命令 c a b 同时要横向合并 如产生 c 1 2 3 4 5 6
  • Excel列表名称

    一 给你一个整数 columnNumber 返回它在 Excel 表中相对应的列名称 例如 A gt 1 B gt 2 C gt 3 Z gt 26 AA gt 27 AB gt 28 示例 1 输入 columnNumber 1 输出 A
  • nginx服务器

    nginx服务器 Nginx服务器 engine X 是一种web服务器 它是一种开源的高性能HTTP和反向代理服务器 它也可提供IMAP POP3 SMTP代理服务等功能 Nginx是以多进程的方式来工作的 也支持多线程的方式 只是主流的
  • C++类的声明和类的实现分开写(.hpp和.cpp)

    1 声明和实现为什么要分开写 现在开始写项目了 你会发现我们一般都要写一个cpp 对应的还得有一个h文件 那么为什么在C 中我们要这么做 h就是声明 cpp就是实现 而所谓分离式实现就是指 声明 和 定义 分别保存在不同的文件中 声明保存在
  • ATM机测试点案例

    卡 是否是本行卡 是否是银行卡 会员卡 超市卡 是否是挂失卡 消磁 破损 锁卡 冻结 借记卡 贷记卡 本行卡是否能正常显示余额 插入银行卡不操作 是否会退卡或吞卡 密码 6位 输入正确的密码 输入错误的密码 密码长度测试 输入密码错误三次是
  • ucos-ii嵌入式操作系统任务调度(一)----任务调度的过程及实现原理

    先给自己打个广告 本人的微信公众号正式上线了 搜索 张笑生的地盘 主要关注嵌入式软件开发 股票基金定投 足球等等 希望大家多多关注 有问题可以直接留言给我 一定尽心尽力回答大家的问题 二维码如下 一 概念 在单片机裸机程序中 我们以函数为最
  • [Go语言入门] 13 Go语言接口(interface)详解

    文章目录 13 Go语言接口 interface 详解 13 1 接口概念 13 2 声明接口类型 13 3 实现接口 13 4 接口赋值 接口变量 给接口变量赋值 接口赋值时的拷贝方式 13 5 接口调用 13 6 interface 1
  • Java加密技术(四)——非对称加密算法RSA

    接下来我们介绍典型的非对称加密算法 RSA RSA 这种算法1978年就出现了 它是第一个既能用于数据加密也能用于数字签名的算法 它易于理解和操作 也很流行 算法的名字以发明者的名字命名 Ron Rivest AdiShamir 和Leon
  • Kafka!(多图+深入)原理详解

    一 kafka概述 1 1 定义 Kakfa是一个分布式的基于发布 订阅模式的消息队列 message queue 主要应用于大数据的实时处理领域 1 2 消息队列 1 2 1 传统的消息队列 新式的消息队列的模式 上面是传统的消息队列 比
  • DialogFragment 使用与友好交互

    Dialog顾名思义对话框 在android app是最常用的UI组成部分 以往开发基本按照设计自定义一个Dialog 某天无意间发现竟有DialogFragment这个东西 3 0后同Fragment一起更新 罪过罪过 好久没翻文档 这种
  • [OpenAirInterface实战-5] :OAI支持的5G gNB功能集

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 OpenAirInterface实战 5 OAI支持的5G gNB功能集 文火冰糖 王文兵 的博客 CSDN博客 目录 前言 第1章 5G
  • 全国科技工作者日和神州十六号腾飞祝词

    全国科技工作者日 在这个特别的日子里 我们向全国所有的科技工作者致以最诚挚的祝福和敬意 你们是推动国家科技进步的基石 是实现民族复兴的重要力量 你们日以继夜地辛勤工作 冒着生命危险探索科学的高峰 为祖国的繁荣昌盛做出了巨大的贡献 作为全国科
  • STM32菜鸟成长记录——移植FreeModbusRTU

    本文章用于记录学习RS485及配置Modbus协议 参考博文 FreeModbus移植文章1 FreeModbus移植文章2
  • Java并发编程的相关知识(7)-阻塞队列

    阻塞队列 ArrayBlockingQueue LinkedBlockingQueue ProiorityBlockingQueue DelayQueue SynchronousQueue LinkedTransferQueue Linke
  • PTA练习 Java模拟题 编程题

    7 1 各类字符数 20 分 从键盘输入一个字符串 程序输出该字符串中的大写英文字母数 小写英文字母数以及非英文字母数 输入格式 字符串 输出格式 大写英文字母数 小写英文字母数 非英文字母数 输入样例 在这里给出一组输入 例如 Hello
  • window10安装vim编辑器

    我们在做git操作的时候 很多文字编辑工作会默认打开 Vim 编辑器来进行操作 Vim 是一个高度可配置的文本编辑器 旨在让创建和更改任何类型的文本变得非常高效 大多数 UNIX 系统和 Apple OS X 都将它作为vi包含在内 用惯了
  • pic图片怎么换jpg格式_HEIC格式图片转换成jpg原来这么简单!

    说到HEIC格式不晓得大家熟不熟悉 使用苹果手机的小伙伴肯定很熟悉吧 不知道也没关系 下面我们先来了解下 什么是HEIC格式图片 01 什么是HEIC格式 这是苹果手机上的一种图片格式 ios11系统更新后 利用苹果手机拍摄 原相机 出来的
  • centos系统把.net6 web api部署到docker

    为了搞定docker是怎么部署的 做个笔记 前提条件 准备一个core项目 使用vs自带的docker打包 假如你选择docker支持的时候不小心安装了Docker Desktop 还可以简单的先部署到本地docker中 发布到centos
  • Python-Scrapy安装

    描述 安装爬虫框架Scrapy 基本使用 知识点总结 目录 一 Scrapy安装 1 1 scrapy是什么 1 2 安装环境 1 3 步骤安装 1 4 测试是否安装成功 1 4 第三方库 一 Scrapy安装 1 1 scrapy是什么
  • .NetCore之log4net的使用

    1 首先下载log4ne的包 2 添加配置文件log4net config