Asp.Net 6中使用Log4Net

news2024/12/24 22:08:05

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.coloradmin.cn/o/789539.html

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

相关文章

最新Ai创作源码ChatGPT商用运营源码/支持GPT4.0+支持ai绘画+支持Mind思维导图生成

本系统使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到本系统&#xff01; 支持GPT3模型、GPT4模型Midjourney专业绘画&#xff08;全自定义调参&#xff09;、Midjourney以图生图、Dall-E2绘画Mind思维导图生成应用工作台&#xff08;Prompt&#xff09;AI绘画广场自定…

高效复用:RecyclerView Item中嵌套列表时的优化技巧

文章目录 背景实现思路方式一方式二方式三 性能对比总结 背景 如上面截图中的效果&#xff0c;首先这是一个多样式的滑动列表&#xff08;截图里只列举了其中的3 种样式&#xff09;&#xff0c;整体使用 RecyclerView 来实现毋庸置疑。接下来要探讨的是截图中第3个ItemView 中…

Linux系列---【CentOS 7通过MSTSC连接远程桌面】

安装对应的yum源 yum list lightdm xorgxrdp xrdp 可以看到这些软件都在epel中&#xff0c;如果没有的话&#xff0c;请先安装对应的yum源。命令如下&#xff1a; yum install -y epel-release 确认yum源没有问题之后&#xff0c;我们就可以进行安装了。 安装lightdm xorgxrdp…

QT【day1】

登录框&#xff1a; #include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {//窗口设置this->setFixedSize(600,600); //大小this->setWindowTitle("MUMU"); //文本内容this->setWindowOpacity(0.8); //透…

Java五大内存区域介绍与常见异常

jvm虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的区域。这些区域各自有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的区域随着虚拟机进程的启动而存在&#xff0c;有的区域则依赖用户进程的启动和结束而建立和销毁。 1、程序计数器 程序计…

《动手学深度学习》——2.6概率(模拟掷色子代码解析)

文章目录 完整代码代码解析结果展示 完整代码 %matplotlib inline !pip install d2l import torch from torch.distributions import multinomial from d2l import torch as d2l fair_probs torch.ones([6]) / 6 counts multinomial.Multinomial(10, fair_probs).sample((50…

redis中缓存雪崩,缓存穿透,缓存击穿的原因以及解决方案

一 redis的缓存雪崩 1.1 缓存雪崩 在redis中&#xff0c;新&#xff0c;旧数据交替时候&#xff0c;旧数据进行了删除&#xff0c;新数据没有更新过来&#xff0c;造成在高并发环境下&#xff0c;大量请求查询redis没有数据&#xff0c;直接查询mysql&#xff0c;造成mysql的…

图技术在 LLM 下的应用:知识图谱驱动的大语言模型 Llama Index

LLM 如火如荼地发展了大半年&#xff0c;各类大模型和相关框架也逐步成型&#xff0c;可被大家应用到业务实际中。在这个过程中&#xff0c;我们可能会遇到一类问题是&#xff1a;现有的哪些数据&#xff0c;如何更好地与 LLM 对接上。像是大家都在用的知识图谱&#xff0c;现在…

7.25作业

用fgetc与fputc函数实现 1、文件拷贝&#xff0c;例如将7.txt的内容拷贝到8.txt中 2、要求用fgets计算一个文件有多少字节 3、用fgetc计算一个文件有几行 #include<stdio.h> #include<string.h> #include<stdlib.h> int main(int argc, const char *argv…

FreeRTOS源码分析-6 多任务使用要点

目录 1 临界段应用 1.1临界段的作用 1.2临界段API 1.3临界段应用 2 临界段原理 2.1FreeRTOS中断管理实现 2.2关开中断实现 2.3临界段实现 3 任务栈大小确定 3.1确定 3.2MKD-htm文件分析 3.3堆栈检测API 4 栈溢出检测应用 4.1栈溢出检测方案一 4.2栈溢出检测方案…

各种id转换 kegg id kegg compound id 与HMDB转换

KEGG COMPOUND 数据库 - 简书 (jianshu.com) kegg id号转换为可读 的name &#xff1a;使用KEGGREST #-------------kegg id的entry和Name转换 https://zhuanlan.zhihu.com/p/545494092 #BiocManager::install("KEGGREST") #安装KEGGREST这个包 library(…

Android访问其他程序中的数据——以读取系统联系人为例

首先&#xff0c;需要保证通讯录里面有联系人存在&#xff0c;这里手动新增了两条数据。 activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmln…

SpringBoot创建和使⽤

1.什么是Spring Boot&#xff1f;为什么要学Spring Boot&#xff1f; Spring 的诞⽣是为了简化 Java 程序的开发的&#xff0c;⽽ Spring Boot 的诞⽣是为了简化 Spring 程序开发 的。 Spring Boot 翻译⼀下就是 Spring 脚⼿架&#xff0c;什么是脚⼿架呢&#xff1f;如下图所…

函数(超详解)

函数 1.什么是函数2.C语言中函数的分类2.1 库函数2.1.1如何使用库函数 2.2自定义函数 3.函数的参数3.1实际参数&#xff08;实参&#xff09;3.2形式参数&#xff08;形参&#xff09; 4.函数的调用4.1 传值调用4.2 传址调用4.3 练习 5.函数的嵌套使用和链式访问5.1 嵌套调用5.…

第15章 呈现数据

默认情况下&#xff0c;大多数bash命令会将输出导向STDOUT文件描述符。 数据追加到某个文件用>> 符号来完成。 who命令生成的输出会被追加到test2文件中已有数据的后面。 只重定向错误STDERR文件描述符被设成2。可以选择只重定向错误消息&#xff0c;将该文件描述符值…

day02_springboot综合案例

day02_springboot综合案例 订单操作 查询所有订单 查询所有订单流程 查询订单&#xff0c;要把订单对应的产品也要查出来 Orders实体类 Data public class Orders {private String id;private String orderNum;DateTimeFormat(pattern"yyyy-MM-dd HH:mm")privat…

多线程面试题--线程安全

synchronized关键字的底层原理 基础版 当我们对代码就行反编译&#xff0c;会发现其实synchronized就是monitor Monitor 假如现在有一个线程过来了&#xff0c;要执行当前代码&#xff0c;会执行到synchronized (lock)&#xff0c;lock是一个对象锁。首先会让这个lock对象和m…

Clion开发stm32之微妙延迟(采用nop指令实现)

前言 需要借助逻辑分析仪动态调整参数此次测试的开发芯片为stm32f103vet6 延迟函数 声明 #define NOP_US_DELAY_MUL_CNT 5 /*nop 微妙延迟需要扩大的倍数(根据实际动态修改)*/ void bsp_us_delay_nop(uint32_t us);void bsp_ms_delay_nop(uint32_t ms);定义 void bsp_us_dela…

【深度学习】yolov5以及yolov8的微调后的模型精度对比

文章目录 前言1. 训练1.1 yolov5 的 yolov5m61.2 yolov5 的 yolov5l61.3 yolov8 的训练 结论&#xff1a; 前言 做了一个烟火识别&#xff0c;用了2W张图片&#xff0c;标注包括&#xff1a;fire&#xff0c;smoke 。在coco80类的模型上进行ft&#xff0c; 借此机会进行比较一…

koa2 从0使用mysql2做第一个接口

全局安装Koa命令行工具: npm install -g koa/cli 2. 创建新项目: koa new my-app 这将生成如下目录结构: my-app ├── app.js ├── package.json └── src └── index.js 3. 安装依赖: cd my-app npm install 4. 启动项目: npm start 5.安装mysql2 yarn add…