.NetCore之log4net的使用

news/2024/5/19 22:25:49 标签: .netcore

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();
         

        } 
    }
}

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


http://www.niftyadmin.cn/n/4966378.html

相关文章

iOS 17 及 Xcode 15.0 Beta7 问题记录

1、iOS 17 真机调试问题 iOS 17之后&#xff0c;真机调试Beta版本必须使用Beta版本的Xcode来调试&#xff0c;用以前复制DeviceSupport 方式无法调试&#xff0c;新的Beta版本Xcode中&#xff0c;已经不包含 iOS 17目录。如下图&#xff1a; 解决方案&#xff1a; 1&#x…

ResNet18云空间部署

1-6步骤可以在云空间运行&#xff0c;也可以在本地运行&#xff1b;步骤7 在云空间运行。 1.编译ONNX模型 本章以 resnet18.onnx 为例, 介绍如何编译迁移一个onnx模型至BM1684X TPU平台运行。 该模型来自onnx的官网: models/vision/classification/resnet/model/resnet18-v1…

基于 VisualFoxPro 环境开发应用程序的过程

应用程序开发前开发者要与用户之间广泛沟通&#xff0c;作大量的调查研究和分析工 作&#xff0c;从而明确用户的要求、程序应具备的功能及可以完成的任务。为此要进行两方 面的分析&#xff0c;数据分析和功能分析。数据分析的目的是收集系统应包含的数据、数据 的真实性、…

Unity报错DllNotFoundException:sqlite3

Unity项目中要使用轻型数据库sqlite&#xff0c;除了导入sqlite3.dll外&#xff0c;还需要导入Mono.Data.Sqlite.dll和System.Data.dll&#xff08;工程里或者编辑器里面有System.Data.dll时就不需要&#xff09;两个文件。 如果在编辑器中运行出现 “DllNotFoundException:sql…

Ceph入门到精通-大流量10GB/s LVS+OSPF 高性能架构

LVS 和 LVSkeepalived 这两种架构在平时听得多了&#xff0c;最近才接触到另外一个架构LVSOSPF。这个架构实际上是LVSKeepalived 的升级版本&#xff0c;我们所知道LVSKeepalived 架构是这样子的&#xff1a; 随着业务的扩展&#xff0c;我们可以对web服务器做水平扩展&#xf…

c语言 - 函数的基本用法及传参

函数 函数是一个完成特定功能的代码模块&#xff0c;其程 序代码独立&#xff0c;通常要求有返回值&#xff0c;也可以是 空值。一般形式如下: <数据类型><函数名称>( <形数说明> ) {语句序列&#xff1b;return[(<表达式>)];}函数的声明就是指函数原…

机器学习深度学习——NLP实战(自然语言推断——微调BERT实现)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——针对序列级和词元级应用微调BERT &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文…

idea启动正常,打成jar包时,启动报错

背景 自己写了个小程序&#xff0c;在idea中启动正常&#xff0c;达成jar包发布时&#xff0c;启动报错。 Caused by: java.sql.SQLException: unknown jdbc driver : at com.alibaba.druid.util.JdbcUtils.getDriverClassName(JdbcUtils.java:517) at com.alibaba.druid.pool…