我们在开发任何项目过程中,记录各种日志是太正常不过的事情。没有日志记录的项目,也不可能放心进入生产环境运行。因此日志的记录,是必须要做的。

在.NET开发中,log4net是个常用的日志组件。本文简单记录下在ASP.NET Core中使用log4net来写日志。

1.Nuget中引入log4net组件

控制台执行以下命令:

Install-Package log4net
Install-Package Microsoft.Extensions.Logging.Log4Net.AspNetCore

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

项目根目录下创建文件夹CfgFile,在添加XML文件log4net.config

<?xml version="1.0" encoding="utf-8"?>
<log4net>
<!-- Define some output appenders -->
<appender name="rollingAppender" type="log4net.Appender.RollingFileAppender">
<file value="log4\log.txt" />
<!--追加日志内容-->
<appendToFile value="true" /> <!--防止多线程时不能写Log,官方说线程非安全-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--可以为:Once|Size|Date|Composite-->
<!--Composite为Size和Date的组合-->
<rollingStyle value="Composite" /> <!--当备份文件时,为文件名加的后缀-->
<datePattern value="yyyyMMdd.TXT" /> <!--日志最大个数,都是最新的-->
<!--rollingStyle节点为Size时,只能有value个日志-->
<!--rollingStyle节点为Composite时,每天有value个日志-->
<maxSizeRollBackups value="20" /> <!--可用的单位:KB|MB|GB-->
<maximumFileSize value="3MB" /> <!--置为true,当前最新日志文件名永远为file节中的名字-->
<staticLogFileName value="true" /> <!--输出级别在INFO和ERROR之间的日志-->
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="ALL" />
<param name="LevelMax" value="FATAL" />
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
</layout>
</appender> <!--SqlServer形式-->
<!--log4net日志配置:http://logging.apache.org/log4net/release/config-examples.html -->
<appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
<!--日志缓存写入条数 设置为0时只要有一条就立刻写到数据库-->
<bufferSize value="0" />
<connectionType value="System.Data.SqlClient.SqlConnection,System.Data.SqlClient, Version=4.6.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<connectionString value="Data Source=.\SQLEXPRESS;Initial Catalog=LogManager;Persist Security Info=True;User ID=sa;Password=a123456!" />
<commandText value="INSERT INTO Log4Net ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender> <root> <!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
<!--OFF:0-->
<!--FATAL:FATAL-->
<!--ERROR: ERROR,FATAL-->
<!--WARN: WARN,ERROR,FATAL-->
<!--INFO: INFO,WARN,ERROR,FATAL-->
<!--DEBUG: INFO,WARN,ERROR,FATAL-->
<!--ALL: DEBUG,INFO,WARN,ERROR,FATAL-->
<priority value="ALL"/> <level value="INFO"/>
<appender-ref ref="rollingAppender" />
<appender-ref ref="AdoNetAppender_SqlServer" />
</root>
</log4net>

3.在Controller中输出日志内容:

public class SecondController : Controller
{
private readonly ILogger<SecondController> _Logger;
private readonly ILoggerFactory _LoggerFactory;
public SecondController(ILogger<SecondController> logger, ILoggerFactory loggerFactory)
{
this._Logger = logger;
this._Logger.LogInformation($"{this.GetType().Name} 被构造了。。。_Logger"); this._LoggerFactory = loggerFactory;
ILogger<SecondController> _Logger2 = this._LoggerFactory.CreateLogger<SecondController>();
_Logger2.LogInformation($"{this.GetType().Name} 被构造了。。。_Logger2");
} public IActionResult Index()
{
ILogger<SecondController> _Logger3 = this._LoggerFactory.CreateLogger<SecondController>();
_Logger3.LogInformation($"Index 被执行了。。。。。_Logger3");
this._Logger.LogInformation($"Index 被执行了。。。");
return View();
} public IActionResult Level()
{
_Logger.LogDebug("this is Debug");
_Logger.LogInformation("this is Info");
_Logger.LogWarning("this is Warn");
_Logger.LogError("this is Error");
_Logger.LogTrace("this is Trace");
_Logger.LogCritical("this is Critical"); return new JsonResult(new { Success = true });
} public object GetData()
{
return new
{
Id = 123,
Name = "Michael"
};
}
}

以上配置的log4net,实现了.txt格式日志文件的写入,还有日志写库。

输出日志如下:

2022-11-12 22:29:46,368 [.NET ThreadPool Worker] INFO Advanced.NET6.Project.Controllers.SecondController - SecondController 被构造了。。。_Logger
2022-11-12 22:29:46,377 [.NET ThreadPool Worker] INFO Advanced.NET6.Project.Controllers.SecondController - SecondController 被构造了。。。_Logger2
2022-11-12 22:29:55,460 [.NET ThreadPool Worker] INFO Advanced.NET6.Project.Controllers.SecondController - Index 被执行了。。。。。_Logger3
2022-11-12 22:29:55,465 [.NET ThreadPool Worker] INFO Advanced.NET6.Project.Controllers.SecondController - Index 被执行了。。。

执行以下SQL语句,查询下写入库中的日志:

select * from log4net order by Date desc

得到如下的数据列表:

Id Date Thread Level Logger Message Exception
1009 2022-11-12 22:29:55.467 .NET ThreadPool Worker INFO Advanced.NET6.Project.Controllers.SecondController Index 被执行了。。。
1008 2022-11-12 22:29:55.460 .NET ThreadPool Worker INFO Advanced.NET6.Project.Controllers.SecondController Index 被执行了。。。。。_Logger3
1007 2022-11-12 22:29:46.377 .NET ThreadPool Worker INFO Advanced.NET6.Project.Controllers.SecondController SecondController 被构造了。。。_Logger2
1006 2022-11-12 22:29:46.370 .NET ThreadPool Worker INFO Advanced.NET6.Project.Controllers.SecondController SecondController 被构造了。。。_Logger
1004 2022-11-12 22:28:46.443 1 INFO Microsoft.Hosting.Lifetime Hosting environment: Development
1003 2022-11-12 22:28:46.437 1 INFO Microsoft.Hosting.Lifetime Application started. Press Ctrl+C to shut down.
1002 2022-11-12 22:28:46.160 1 INFO Microsoft.Hosting.Lifetime Now listening on: http://localhost:5999
8 2022-11-11 09:55:40.147 .NET ThreadPool Worker INFO Advanced.NET6.Project.Controllers.SecondController Index 被执行了。。。
7 2022-11-11 09:55:40.140 .NET ThreadPool Worker INFO Advanced.NET6.Project.Controllers.SecondController Index 被执行了。。。。。_Logger3
6 2022-11-11 09:55:37.507 .NET ThreadPool Worker INFO Advanced.NET6.Project.Controllers.SecondController SecondController 被构造了。。。_Logger2
5 2022-11-11 09:55:37.493 .NET ThreadPool Worker INFO Advanced.NET6.Project.Controllers.SecondController SecondController 被构造了。。。_Logger
3 2022-11-11 09:55:25.780 1 INFO Microsoft.Hosting.Lifetime Hosting environment: Development
2 2022-11-11 09:55:25.773 1 INFO Microsoft.Hosting.Lifetime Application started. Press Ctrl+C to shut down.
1 2022-11-11 09:55:25.630 1 INFO Microsoft.Hosting.Lifetime Now listening on: http://localhost:5999

log4net的使用,就这样完事啦...

Asp.Net Core中使用日志组件log4net的更多相关文章

  1. 玩转ASP.NET Core中的日志组件

    简介 日志组件,作为程序员使用频率最高的组件,给程序员开发调试程序提供了必要的信息.ASP.NET Core中内置了一个通用日志接口ILogger,并实现了多种内置的日志提供器,例如 Console ...

  2. (14)ASP.NET Core 中的日志记录

    1.前言 ASP.NET Core支持适用于各种内置和第三方日志记录提供应用程序的日志记录API.本文介绍了如何将日志记录API与内置提供应用程序一起使用. 2.添加日志提供程序 日志记录提供应用程序 ...

  3. Asp.Net Core中利用Seq组件展示结构化日志功能

    在一次.Net Core小项目的开发中,掌握的不够深入,对日志记录并没有好好利用,以至于一出现异常问题,都得跑动服务器上查看,那时一度怀疑自己肯定没学好,不然这一块日志不可能需要自己扒服务器日志来查看 ...

  4. .Net Core中的日志组件(Logging)

    1.介绍 Logging组件是微软实现的日志记录组件包括控制台(Console).调试(Debug).事件日志(EventLog)和TraceSource,但是没有实现最常用用的文件记录日志功能(可以 ...

  5. ASP.NET Core 中的日志记录

    目录 内置日志的使用 使用Nlog 集成ELK 参考 内置日志的使用 Logger 是 asp .net core 的内置 service,所以我们就不需要在ConfigureService里面注册了 ...

  6. 【Blazor】在ASP.NET Core中使用Blazor组件 - 创建一个音乐播放器

    前言 Blazor正式版的发布已经有一段时间了,.NET社区的各路高手也创建了一个又一个的Blazor组件库,其中就包括了我和其他小伙伴一起参与的AntDesign组件库,于上周终于发布了第一个版本0 ...

  7. ASP.NET MVC中解决日志并发处理log4net

    本章主要内容是将异常信息写到队列中,然后通过线程写到文本文件中,速度非常快,没有阻塞和延迟加载 1.首先在Model中建一个类MyExceptionAttribute.cs public class ...

  8. ASP.NET Core 异常处理与日志记录

    1. ASP.NET Core 异常处理与日志记录 1.1. 异常处理 1.1.1. 异常产生的原因及处理 1.1.2. ASP.NET Core中启动开发人员异常页面 1.2. 日志记录 1.2.1 ...

  9. .NET Core 中的日志与分布式链路追踪

    目录 .NET Core 中的日志与分布式链路追踪 .NET Core 中的日志 控制台输出 非侵入式日志 Microsoft.Extensions.Logging ILoggerFactory IL ...

  10. ASP.NET Core中的ActionFilter与DI

    一.简介 前几篇文章都是讲ASP.NET Core MVC中的依赖注入(DI)与扩展点的,也许大家都发现在ASP.NET CORE中所有的组件都是通过依赖注入来扩展的,而且面向一组功能就会有一组接口或 ...

随机推荐

  1. 安全测试-WEB安全渗透测试基础知识(五)

    1.5. 代码审计 1.5.1. 简介 代码审计是找到应用缺陷的过程.其通常有白盒.黑盒.灰盒等方式.白盒指通过对源代码的分析找到应用缺陷,黑盒通常不涉及到源代码,多使用模糊测试的方式,而灰盒则是黑白 ...

  2. matlab如何关闭figure

    如果想要关闭之前打开的figure,用**close()**函数就可以了. close(H):关闭句柄为H的figure: close('name'):关闭指定name的figure: close a ...

  3. SpringBoot 自定义启动的logo(即banner)

    1.自定义输出banner样式 推荐生成网站 http://patorjk.com/software/taag/ https://www.bootschool.net/ascii-art 2.配置 A ...

  4. Lua中创建新的文件夹

    如下: os.execute('mkdir 文件夹名称')

  5. nightwatch入门教程

    Nightwatch.js 是一个用来测试web应用和网站的自动化测试框架,它是由NodeJs编写的,使用了W3C WebDriver API(之前是Selenium WebDriver) 所以我们首 ...

  6. react框架-知识点(ref,, setState)

    react的思想:无必要勿增实体 1. ref 使用 myRef = React.createRef() <input ref={this.myRef}></input> 2. ...

  7. 链接mysql数据库报错:2003-cant connect to Mysql server on ‘localhost’(10038)

    今天用navicat连mysql时候突然报错了 我百度了一下,知道了是mysql服务没开,但是我打开了服务,发现服务里面没有mysql,于是就去cmd以管理员身份打开命令提示符,切换到安装mysql的 ...

  8. Rabbit MQ的几种模式

    RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件). 官网文档:https://www.rabbitmq.com/getstarted.html Rabbi ...

  9. 20203412马畅若 实验二《Python程序设计》实验报告

    20203412马畅若    实验二<Python程序设计>实验报告 课程:<Python程序设计>班级: 2034姓名:马畅若学号:20203412实验教师:王志强实验日期: ...

  10. Linux 第七节(LVM,网卡配置)

    LVM 逻辑卷管理器: 解决分区灵活调整大小问题 PV 物理卷 VG 卷组 LV 逻辑卷 pvcreate /dev/sdc vgcreate xiaochong  /dev/sdb /dev/sdc ...