Asp.Net 6中使用Log4Net

Asp.Net 6中使用Log4Net

1. 先新建一个ASP.NET Core空项目

1

2. 通过Nuget包管理器安装下面两个包

log4net
Microsoft.Extensions.Logging.Log4Net.AspNetCore

2

3. 在项目根目录下新建log4net的配置文件log4net.config,并将其设置为始终复制。

<?xml version="1.0" encoding="utf-8" ?>
<log4net><!--根配置--><root><!--日志级别:可选值: ERROR > WARN > INFO > DEBUG --><level value="ERROR"/><level value="WARN"/><level value="INFO"/><level value="DEBUG"/><appender-ref ref="ErrorLog" /><appender-ref ref="WarnLog" /><appender-ref ref="InfoLog" /><appender-ref ref="DebugLog" /></root><!-- 错误 Error.log--><appender name="ErrorLog" type="log4net.Appender.RollingFileAppender"><!--目录路径,可以是相对路径或绝对路径--><param name="File" value="C:\logs\"/><!--文件名,按日期生成文件夹--><param name="DatePattern" value="/yyyy-MM-dd/"Error.log""/><!--追加到文件--><appendToFile value="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStyle value="Composite"/><!--写到一个文件--><staticLogFileName value="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSize value="200MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackups value="-1"/><!--日志格式--><layout type="log4net.Layout.PatternLayout"><conversionPattern value="[%d{HH:mm:ss}]%m%n"/></layout><filter type="log4net.Filter.LevelRangeFilter"><param name="LevelMin" value="ERROR" /><param name="LevelMax" value="ERROR" /></filter></appender><!-- 警告 Warn.log--><appender name="WarnLog" type="log4net.Appender.RollingFileAppender"><!--目录路径,可以是相对路径或绝对路径--><param name="File" value="C:\logs\"/><!--文件名,按日期生成文件夹--><param name="DatePattern" value="/yyyy-MM-dd/"Warn.log""/><!--追加到文件--><appendToFile value="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStyle value="Composite"/><!--写到一个文件--><staticLogFileName value="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSize value="200MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackups value="-1"/><!--日志格式--><layout type="log4net.Layout.PatternLayout"><conversionPattern value="[%d{HH:mm:ss}]%m%n"/></layout><filter type="log4net.Filter.LevelRangeFilter"><param name="LevelMin" value="WARN" /><param name="LevelMax" value="WARN" /></filter></appender><!-- 信息 Info.log--><appender name="InfoLog" type="log4net.Appender.RollingFileAppender"><!--目录路径,可以是相对路径或绝对路径--><param name="File" value="C:\logs\"/><!--文件名,按日期生成文件夹--><param name="DatePattern" value="/yyyy-MM-dd/"Info.log""/><!--追加到文件--><appendToFile value="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStyle value="Composite"/><!--写到一个文件--><staticLogFileName value="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSize value="200MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackups value="-1"/><!--日志格式--><layout type="log4net.Layout.PatternLayout"><conversionPattern value="[%d{HH:mm:ss}]%m%n"/></layout><filter type="log4net.Filter.LevelRangeFilter"><param name="LevelMin" value="INFO" /><param name="LevelMax" value="INFO" /></filter></appender><!-- 调试 Debug.log--><appender name="DebugLog" type="log4net.Appender.RollingFileAppender"><!--目录路径,可以是相对路径或绝对路径--><param name="File" value="C:\logs\"/><!--文件名,按日期生成文件夹--><param name="DatePattern" value="/yyyy-MM-dd/"Debug.log""/><!--追加到文件--><appendToFile value="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStyle value="Composite"/><!--写到一个文件--><staticLogFileName value="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSize value="200MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackups value="-1"/><!--日志格式--><layout type="log4net.Layout.PatternLayout"><conversionPattern value="[%d{HH:mm:ss}]%m%n"/></layout><filter type="log4net.Filter.LevelRangeFilter"><param name="LevelMin" value="DEBUG" /><param name="LevelMax" value="DEBUG" /></filter></appender></log4net>

log4net配置参数此处不多赘述,只针对日志的输出格式参数conversionPattern配置做简要说明。

%M      输出日志方法名
%m      输出日志消息内容
%p      输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r      输出自应用启动到输出该log信息耗费的毫秒数
%c      输出所属的类目,通常就是所在类的全名
%t      输出产生该日志事件的线程名
%n      输出一个换行符
%l或%L  输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
%c      输出日志信息所属的类的全名
%d      输出完整的日志时间点的日期时间,支持自定义格式。比如:%d{HH:mm:ss},输出类似:22:10:28
%f      输出日志信息所属的类的类名

4. 在Program中使用log4net输出自定义日志内容

using log4net;var builder = WebApplication.CreateBuilder(args);
//注入Log4Net
builder.Services.AddLogging(cfg =>
{cfg.AddLog4Net();//默认的配置文件路径是在根目录,且文件名为log4net.config//如果文件路径或名称有变化,需要重新设置其路径或名称//比如在项目根目录下创建一个名为cfg的文件夹,将log4net.config文件移入其中,并改名为log.config//则需要使用下面的代码来进行配置//cfg.AddLog4Net(new Log4NetProviderOptions()//{//    Log4NetConfigFileName = "cfg/log.config",//    Watch = true//});
});
var app = builder.Build();
//访问根页面时
app.MapGet("/", (ILogger<Program> logger) =>
{logger.LogInformation("logger:测试一下Log4Net=》Info");return "Hello World!";
});
//访问test页面时
app.MapGet("/test", () =>
{var log = LogManager.GetLogger(typeof(Program));log.Info("log:这是一条普通日志信息");
});
app.Run();

5. 将项目运行起来,即可发现日志文件已生成

3

4

6. 扩展使用:使用简单工厂模式IOC注入到自定义类中使用

新建一个ITestLog4Net接口文件,并为其定义一个Log方法

public interface ITestLog4Net
{public void Log();
}

并且新建一个TestLog4Net的自定义类,继承于ITestLog4Net,并实现该Log方法。

public class TestLog4Net : ITestLog4Net
{private readonly ILogger<TestLog4Net> _logger;public TestLog4Net(ILogger<TestLog4Net> logger){_logger = logger;_logger.LogInformation("ctor测试一下Log4Net=》Info");}public void Log(){_logger.LogInformation("测试一下Log4Net=》Info");}
}

在Program中注入我们的自定义类TestLog4Net

builder.Services.AddTransient<ITestLog4Net, TestLog4Net>();

使用方法

var testLog4Net = app.Services.GetService<ITestLog4Net>()!;
testLog4Net.Log();

或者

var services = new ServiceCollection()!;
var provider = services.BuildServiceProvider()!;
var testLog4Net = provider.GetService<ITestLog4Net>()!;
testLog4Net.Log();

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

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

相关文章

【Spring】IOC的原理

一、 IOC 的概念 Spring 的 IOC &#xff0c;即控制反转&#xff0c;所谓控制反转 —— 本来管理业务对象&#xff08;bean&#xff09;的操作是由我们程序员去做的&#xff0c;但是有了 Spring 核心容器后&#xff0c;这些 Bean 对象的创建和管理交给我们Spring容器去做了&am…

874. 模拟行走机器人

874. 模拟行走机器人 机器人在一个无限大小的 XY 网格平面上行走&#xff0c;从点 (0, 0) 处开始出发&#xff0c;面向北方。该机器人可以接收以下三种类型的命令 commands &#xff1a; -2 &#xff1a;向左转 90 度-1 &#xff1a;向右转 90 度1 < x < 9 &#xff1a;…

如何选择低代码/零代码平台(最全平台总结)

来谈论这个问题之前&#xff0c;我们先来看看到底什么是低代码/零代码—— 低代码 对于“低代码”的宣传其实已经很久很广泛了&#xff0c;但是争议从来都没有停止。 忘记之前在哪里看到过一个“低代码将会取代程序员”之类的说法&#xff0c;觉得很好笑&#xff0c;看了一些…

【C++】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动

[导读]本系列博文内容链接如下&#xff1a; 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动 在【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值一文中介绍了如何利用…

hyperf协程

我们已经知道了协程可以很好的解决异步非阻塞系统的开发问题&#xff0c;那么协程本身到底是什么呢&#xff1f;从定义上来说&#xff0c;协程是一种轻量级的线程&#xff0c;由用户代码来调度和管理&#xff0c;而不是由操作系统内核来进行调度&#xff0c;也就是在用户态进行…

2023年深圳杯数学建模A题影响城市居民身体健康的因素分析

2023年深圳杯数学建模 A题 影响城市居民身体健康的因素分析 原题再现&#xff1a; 以心脑血管疾病、糖尿病、恶性肿瘤以及慢性阻塞性肺病为代表的慢性非传染性疾病&#xff08;以下简称慢性病&#xff09;已经成为影响我国居民身体健康的重要问题。随着人们生活方式的改变&am…

opencv-18 什么是色彩空间?

1.什么是色彩空间类型&#xff1f; 色彩空间类型&#xff0c;也称为颜色空间类型或色彩模型&#xff0c;是一种表示图像中颜色的方式。在计算机图形学和数字图像处理中&#xff0c;有许多种色彩空间类型&#xff0c;每种类型有不同的表达方式和特点。 常见的色彩空间类型包括&a…

javadoc注解及maven-javadoc-plugin插件

一、javadoc注解标记&#xff1a; author&#xff1a;作者-类、接口级别 version&#xff1a;版本-类、接口级别 deprecated&#xff1a;不推荐使用的方法 param&#xff1a;方法、构造函数的参数 return&#xff1a;方法的返回类型 see&#xff1a;用于指定参考的内容&am…

maven

一、为什么需要使用maven 如今我们构建一个项目需要用到很多第三方的类库 &#xff0c;例如我们在开发项目中 需要引入 这些依赖jar包 一个项目Jar包的数量之多往往让我们瞠目结舌&#xff0c;并且Jar包之间的关系非常复杂&#xff0c;一个Jar包往往又会引用其他Jar包&#x…

什么是Apache Kafka?

Apache Kafka是一个开源的分布式事件流平台&#xff0c;用于高性能、可扩展和持久化的数据传输。它最初由LinkedIn公司开发&#xff0c;并于2011年贡献给Apache软件基金会&#xff0c;成为一个顶级开源项目。 Kafka的设计目标是提供一种可靠、高吞吐量的消息传递系统&#xff…

flex 弹性布局学习

一.Flex布局: Flex是Flexible Box 缩写“弹性布局”,用来为盒状模型提供最大得灵活性。 任何一个容器都可以指定为 Flex 布局。 .box{display: flex; } 行内元素也可以使用 Flex 布局。 .box{display: inline-flex; } Webkit 内核的浏览器&#xff0c;必须加上-webkit前缀。…

C++11 新特性总结

类型推导 auto & decltype auto&#xff1a;让编译器在编译器就推导出变量的类型&#xff0c;可以通过右边的类型推导出变量的类型。 auto a 10; // 10是int型&#xff0c;可以自动推导出a是intdecltype&#xff1a;相对于auto用于推导变量类型&#xff0c;而decltype则用…

微服务模式:业务服务模式

无论是单体应用还是微服务&#xff0c;构建企业应用的业务逻辑/服务在更多方面上都有相似之处而不是差异。在两种方法中&#xff0c;都包含服务、实体、仓库等类。然而&#xff0c;也会发现一些明显的区别。在本文中&#xff0c;我将试图以概念性的方式强调这些区别&#xff0c…

element 表单验证 深层验证绑定

直接上代码 :prop 和prop 都可以&#xff0c;vue2和vue3或者是element、elementplus都可以用 <template><div class"page page-table"><section class"page-query-form"><breadcrumb :hasLine"false" /></section&g…

火山引擎VeDI最新分享:消费行业的数据飞轮从“四更”开始

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 数据飞轮&#xff0c;正在为消费行业的数字化升级提供一套全新模式。 在刚刚结束的《全链路增长&#xff1a;数据飞轮转动消费新生力》专场活动上&#xff0c;火山引…

MySQL 8.0详细安装配置教程

一. 前言 MySQL是目前最为流行的开源数据库产品&#xff0c;是完全网络化跨平台的关系型数据库系统。它起初是由瑞典MySQLAB公司开发&#xff0c;后来被Oracle公司收购&#xff0c;目前属于Oracle公司。因为开源&#xff0c;所以任何人都能从官网免费下载MySQL软件&#xff0c…

SSIS对SQL Server向Mysql数据转发表数据 (二)

1、在SQL Server数据库创建一个数据库表&#xff1a;users USE [Test1] GO/****** Object: Table [dbo].[users] Script Date: 2023/7/27 16:25:11 ******/ SET ANSI_NULLS ON GOSET QUOTED_IDENTIFIER ON GOCREATE TABLE [dbo].[users]([id] [int] IDENTITY(1,1) NOT NUL…

一些有意思的人工智能发展状况数据

随着大型语言模型&#xff08;LLM&#xff09;的引入&#xff0c;机器学习&#xff08;ML&#xff09;和人工智能&#xff08;AI&#xff09;首次被日常开发人员所使用。这些令人感觉很神奇的应用程序&#xff0c;甚至是拥有数十亿研发支出的&#xff0c;在以前连大型科技公司几…

HttpServletRequest类全解析

HttpServletRequest 是 Java Servlet API 中的接口&#xff0c;它是 ServletRequest 接口的子接口&#xff0c;提供了更多用于访问 HTTP 请求信息的方法。HttpServletRequest 主要用于处理客户端发起的 HTTP 请求&#xff0c;并包含了许多用于获取请求信息的方法。 以下是 Htt…

Docker和K8s区别,使用场景,具体怎么使用以及详细命令

目录 一、Docker 和 Kubernetes 的区别二、Docker 的使用场景三、Kubernetes 的使用场景四、Docker 的具体使用方法五、Kubernetes 的具体使用方法 Docker 和 Kubernetes(简称 K8s) 都是容器技术领域中非常重要的工具&#xff0c;但它们在构建、部署和管理容器化应用程序方面发…