本文主要内容为.NET Core的日志记录程序和常使用的日志记录框架的简单使用

首先,打开VS2019新建一个ASP.NET Core Web Api项目,项目创建好后会有一个集成好的天气预报的类和控制器,接下来,我们的方法就在天气控制器里完成。

1、配置提供程序替换默认提供程序

在启动项中添加Log配置替换默认的日志提供程序,在控制器中编写具体输出内容

1)Program.cs

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args).ConfigureLogging(logging => // 添加提供程序(通用主机)
{
logging.ClearProviders(); // 去掉默认添加的日志提供程序
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger();
logging.AddEventLog();
}).ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup < Startup > ();
});

2)控制器

[ApiController]
[Route("[controller]/[action]")]
public class WeatherForecastController: ControllerBase
{
private readonly ILogger <WeatherForecastController> _logger;
public WeatherForecastController(ILogger <WeatherForecastController> logger)
{
_logger = logger;
}
/// <summary>
/// 获取日志输出 - 通用主机
/// </summary>
[HttpGet]
public void GetLogOutUniversalHost()
{
// 内置日志
_logger.LogTrace(1000, "log Trace msg");
_logger.LogDebug(1001, "log Debug msg");
_logger.LogInformation(1002, "log Information msg");
_logger.LogWarning(1003, "log Warning msg");
_logger.LogError(1004, "log Error msg");
_logger.LogCritical(1005, "log Critical msg");
}
}

3)运行结果

2、创建LoggerFactory时调用提供程序的扩展方法

直接在控制器中创建LoggerFactory时调用提供程序的Add方法,使用LoggerFactory来创建 ILogger

1)控制器

[ApiController]
[Route("[controller]/[action]")]
public class WeatherForecastController: ControllerBase
{
/// <summary>
/// 获取日志输出 - 非主机
/// </summary>
[HttpGet]
public void GetLogOutNonHost()
{
var loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddFilter("Microsoft", LogLevel.Warning).AddFilter("System", LogLevel.Warning).AddFilter("LoggingConsoleApp.Program", LogLevel.Debug).AddConsole().AddEventLog();
});
ILogger logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation("非主机模式输出log msg");
}
}

2)运行结果

3、 Log4Net

1)使用NuGet安装log4net包

2)新建log4net.config配置文件,配置日志输出格式

3)右键新添加的log4net.config配置文件,更改文件属性->复制到输出目录选项:始终复制

或者在项目的.csproj文件添加如下代码:

<ItemGroup>
<Content Update="log4net.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>

4)log4net.config配置文件内容

<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<appSettings>
<add key="WebSocketPort" value="45154" />
</appSettings>
<log4net>
<!--指定日记记录方式,以滚动文件的方式(文件记录)-->
<appender name="logInfoToFile" type="log4net.Appender.RollingFileAppender,log4net">
<!--日志路径-->
<file value="logs/log4net/info"/>
<!--是否是向文件中追加日志-->
<AppendToFile value="true"/>
<!--日志根据日期滚动-->
<RollingStyle value="Date"/>
<!--日志文件名格式为:info.2021-12-30.txt-->
<DatePattern value="'.'yyyy-MM-dd'.txt'"/>
<!--日志文件名是否是固定不变的-->
<StaticLogFileName value="false"/>
<!--布局-->
<layout type="log4net.Layout.PatternLayout,log4net">
<ConversionPattern value="%d %-5p [%c] %m%n"/>
</layout>
</appender>
<appender name="logErrorToFile" type="log4net.Appender.RollingFileAppender,log4net">
<file value="logs/log4net/error"/>
<AppendToFile value="true"/>
<RollingStyle value="Date"/>
<!--日志文件名格式为:error.2021-12-30.txt-->
<DatePattern value="'.'yyyy-MM-dd'.txt'"/>
<StaticLogFileName value="false"/>
<layout type="log4net.Layout.PatternLayout,log4net">
<ConversionPattern value="%d %-5p [%c] %m%n"/>
</layout>
</appender>
<!-- 根(父)logger -->
<root>
<!-- 支持级别:ALL -->
<level value="ALL" additivity="false"/>
<!-- ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF-->
<!-- 支持的appender名称:logInfoToFile -->
<appender-ref ref="logInfoToFile"/>
</root>
<!-- logger名称为ApplicationInfoLog,阻止父logger中的appender -->
<logger name="ApplicationInfoLog" additivity="false">
<!-- 支持级别:ALL -->
<level value="ALL"/>
<!-- 支持的appender名称:logInfoToFile -->
<appender-ref ref="logInfoToFile"/>
</logger>
<logger name="ApplicationErrorLog" additivity="false">
<!-- 支持级别:ALL -->
<level value="ALL"/>
<!-- 支持的appender名称:logErrorToFile -->
<appender-ref ref="logErrorToFile"/>
</logger>
</log4net>
</configuration>

关于log4net.config配置的详细说明,可参考log4net配置文件详解

5)控制器

5.1  Log4Net 简单配置,输出至控制台

/// <summary>
/// 获取日志输出 - 第三方框架:Log4Net(简单配置,输出至控制台)
/// </summary>
[HttpGet]
public void GetLogOutWithLog4NetSimpleConfiguration()
{
ILoggerRepository repository = LogManager.CreateRepository(".NET Core RepositoryRepository");
// 默认简单配置,输出至控制台
BasicConfigurator.Configure(repository);
ILog log = LogManager.GetLogger(repository.Name, ".NET Core Log4net");
log.Info(".NET Core Log4net log");
log.Info("test log");
log.Error("error");
log.Info("linezero");
}

5.1  运行结果

5.2  Log4Net 增加配置,输出至文件

/// <summary>
/// 获取日志输出 - 第三方框架:Log4Net(增加配置,输出至文件)
/// </summary>
[HttpGet]
public void GetLogOutWithLog4NetComplexConfigurations()
{
ILoggerRepository repository = LogManager.CreateRepository(".NET Core RepositoryRepository");
XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));
ILog log = LogManager.GetLogger(repository.Name, ".NET Core Log4net");
log.Info(".NET Core Log4net log");
log.Info("test log");
log.Error("error");
log.Info("linezero");
}

5.2  运行结果

4、 NLog

1)使用NuGet安装NLog和NLog.Web.AspNetCore包

2)新建nlog.config配置文件,配置日志输出格式

 3)右键新添加的log4net.config配置文件,更改文件属性->复制到输出目录选项:始终复制

或者在项目的.csproj文件添加如下代码:

<ItemGroup>
<Content Update="nlog.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>

4)nlog.config配置文件内容

<?xml version="1.0" encoding="utf-8" ?>
<nlog
xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
throwConfigExceptions="true"
internalLogLevel="info"
internalLogFile="${basedir}/logs/nlog/internal-nlog.txt">
<!-- enable asp.net core layout renderers -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<!-- the targets to write to -->
<targets>
<!-- File Target for all log messages with basic details -->
<target xsi:type="File" name="allfile" fileName="${basedir}/logs/nlog/all/nlog-all-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
<!-- File Target for own log messages with extra web details using some ASP.NET core renderers -->
<target xsi:type="File" name="ownFile-web" fileName="${basedir}/logs/nlog/my/nlog-own-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|" />
<!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection -->
<target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />
</targets>
<!-- rules to map from logger name to target -->
<rules>
<!--All logs, including from Microsoft-->
<logger name="*" minlevel="Trace" writeTo="allfile" />
<!--Output hosting lifetime messages to console target for faster startup detection -->
<logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="lifetimeConsole, ownFile-web" final="true" />
<!--Skip non-critical Microsoft logs and so log only own logs-->
<logger name="Microsoft.*" maxlevel="Info" final="true" />
<!-- BlackHole -->
<logger name="*" minlevel="Trace" writeTo="ownFile-web" />
</rules>
</nlog>

5)配置并启用NLog

public class Program
{
public static void Main(string[] args)
{
var logger = NLog.LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
try
{
logger.Debug("init main");
CreateHostBuilder(args).Build().Run();
}
catch(Exception exception)
{
// NLog: 捕获设置错误
logger.Error(exception, "Stopped program because of exception");
throw;
}
finally
{
// 确保在应用程序退出前刷新和停止内部定时器/线程(避免Linux上的分段故障)
NLog.LogManager.Shutdown();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup < Startup > ();
}).ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
}).UseNLog(); // NLog: 依赖性注入设置NLog
}

6)配置appsettings.json

appsettings.json中指定的日志配置覆盖了对SetMinimumLevel的任何调用。因此,要么删除 "Default":要么根据你的需要正确调整。

上述logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);

所以配置文件需要更改

{
"Logging": {
"LogLevel": {
"Default": "Trace", // 这里更改的地方
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}

记得也要测试环境的配置,appsettings.Development.json,以免出现异常

{
"Logging": {
"LogLevel": {
"Default": "Trace", // 这个要更改
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}

7)控制器

/// <summary>
/// 获取日志输出 - 第三方框架:NLog
/// </summary>
[HttpGet]
public void GetLogOutWithNLog()
{
// 内置日志
_logger.LogTrace(1000, "log Trace msg");
_logger.LogDebug(1001, "log Debug msg");
_logger.LogInformation(1002, "log Information msg");
_logger.LogWarning(1003, "log Warning msg");
_logger.LogError(1004, "log Error msg");
_logger.LogCritical(1005, "log Critical msg");
}

8)运行结果

关于配置文件的说明可查看官网:NLog Configuration-file

还有一篇翻译文章方便查看:NLog类库使用探索——详解配置

5、Serilog

1)使用NuGet安装Serilog.AspNetCore包

2)配置Serilog输出格式等信息

public class Program
{
public static void Main(string[] args)
{
// 配置Serilog
Log.Logger = new LoggerConfiguration()
// 设定最小的记录级别
.MinimumLevel.Debug()
// 如果遇到Microsoft命名空间,那么最小记录级别为Information
.MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Information)
// 记录相关上下文信息
.Enrich.FromLogContext()
// 日志输出到控制台
.WriteTo.Console()
// 输出到文件,指定输出路径和周期
.WriteTo.File(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"logs/serilog/serilog.txt"), rollingInterval: RollingInterval.Day) // 配置日志输出文件,生成周期每天
.CreateLogger();
try
{
Log.Information("Starting up");
CreateHostBuilder(args).Build().Run();
}
catch(Exception ex)
{
Log.Fatal(ex, "Application start-up failed");
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args).ConfigureLogging(logging =>
{
logging.ClearProviders(); // 去掉默认添加的日志提供程序
}).ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup < Startup > ();
}).UseSerilog(); // 配置使用Serilog
}

这里为直接按照配置格式输出,当然也可以通过读取配置文件的形式读取配置的具体信息,本文不做具体阐述。

3)控制器

/// <summary>
/// 获取日志输出 - 第三方框架:Serilog
/// </summary>
[HttpGet]
public void GetLogOutWithSerilog()
{
// 内置日志
_logger.LogTrace(1000, "log Trace msg");
_logger.LogDebug(1001, "log Debug msg");
_logger.LogInformation(1002, "log Information msg");
_logger.LogWarning(1003, "log Warning msg");
_logger.LogError(1004, "log Error msg");
_logger.LogCritical(1005, "log Critical msg");
}

4)运行结果

6、附录

1)Log4Net GitHub仓库地址

2)NLog GitHub仓库地址

3)Serilog GitHub仓库地址

4)NLog vs log4net vs Serilog: Compare .NET Logging Frameworks

5)LogLevel 枚举

6)日志级别

以上就是.NET Core 日志记录程序和常用日志记录框架的简单使用的介绍,做此记录,如有帮助,欢迎点赞关注收藏!

.NET Core 日志记录程序和常用日志记录框架的更多相关文章

  1. .NET CORE 控制台应用程序配置log4net日志文件

    使用文件格式记录日志 1.新建一个.NET CORE控制台应用程序,添加log4net.dll引用,打开工具->NuGet包管理器->管理解决方案的NuGet程序包. 2.在NuGet-解 ...

  2. 【开发记录】Linux常用命令记录(一)

    记录CentOS下,常用的命令.有时候很难记得清楚,同时方便新来的同学查阅.(将不停的追加和完善) 1)查看CPU情况 cat /proc/cpuinfo |grep "model name ...

  3. 【记录】GIT 常用命令记录

    1. 查看所有的提交版本,包含当你co到之前提交版本后依旧可以看到以前的日志 git log --graph --pretty=format:'%h -%d %s (%cr)' --abbrev-co ...

  4. 【开发记录】Linux常用命令记录(一)【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  5. ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

    一.前言 在项目开发中,日志系统是系统的一个重要组成模块,通过在程序中记录运行日志.错误日志,可以让我们对于系统的运行情况做到很好的掌控.同时,收集日志不仅仅可以用于诊断排查错误,由于日志同样也是大量 ...

  6. NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

    NET Core 实战:使用 NLog 将日志信息记录到 MongoDB https://www.cnblogs.com/danvic712/p/10226557.html ASP.NET Core ...

  7. 转:使用log4net完成程序异常日志记录(使用SQLite数据库记录和普通文本记录)

    http://www.cnblogs.com/kyo-yo/archive/2010/06/11/use-log4net-to-log-exception.html 在前端时间开发的时候由于需要将异常 ...

  8. EF Core使用SQL调用返回其他类型的查询 ASP.NET Core 2.0 使用NLog实现日志记录 CSS 3D transforms cSharp:use Activator.CreateInstance with an Interface? SqlHelper DBHelper C# Thread.Abort方法真的让线程停止了吗? 注意!你的Thread.Abort方法真

    EF Core使用SQL调用返回其他类型的查询   假设你想要 SQL 本身编写,而不使用 LINQ. 需要运行 SQL 查询中返回实体对象之外的内容. 在 EF Core 中,执行该操作的另一种方法 ...

  9. .Net Core中间件和过滤器实现错误日志记录

    1.中间件的概念 ASP.NET Core的处理流程是一个管道,中间件是组装到应用程序管道中用来处理请求和响应的组件. 每个中间件可以: 选择是否将请求传递给管道中的下一个组件. 可以在调用管道中的下 ...

  10. C# 使用Log4Net记录程序日志

    在之前的博客中,写过使用系统内置的Trace类记录程序日志,具体请参考:C# 使用Trace记录程序日志.这篇博客将介绍如何使用Log4Net记录程序日志. 首先需要引用Log4Net.dll,我们可 ...

随机推荐

  1. 数据结构篇——KMP算法

    数据结构篇--KMP算法 本次我们介绍数据结构中的KMP算法,我们会从下面几个角度来介绍: 问题介绍 暴力求解 知识补充 Next示例 Next代码 匹配示例 匹配代码 完整代码 问题介绍 首先我们先 ...

  2. 图文详解在VMware Workstation 16 PRO虚拟机上安装Rocky 8.6 linux系统

    一.安装VMware Workstation虚拟机 下载VMware Workstation 16 PRO虚拟机 https://www.vmware.com/cn/products/workstat ...

  3. 抓包整理————ip 协议四[十五]

    前言 简单了解一下ip 协议选路问题. 正文 比如host1 到 host2是直接传输,因为host1和 host2 是同一交换机,直接arp表知道对方的mac. 第二种是他们是不同网段之间通信. 第 ...

  4. 教你用JavaScript实现随机点名

    案例介绍 欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript相关知识,做一个随机点名的案例.你可以通过点击开始按钮控制上方名字的闪动,点击停止按钮可以随机选定一个名 ...

  5. MYSQL快速安装整理

    参考教程:https://www.cnblogs.com/brad93/p/16650780.html [检查是否已安装过] find / -name mysql [快速安装开始] groupadd  ...

  6. 在实际应用中联合体union的妙用

    关键字union,又称为联合体.共用体,联合体的声明和结构体类似,但是它的行为方式又和结构体不同,这里的行为方式主要指的是其在内存中的体现,结构体中的成员每一个占据不同的内存空间,而联合体中的所有成员 ...

  7. 【每日一题】【第n个 n-->0】19./NC53 【删除】链表的倒数第 N 个结点-211123/220127

    给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 答案: import java.util.*; /* * public class ListNode { * int val; * ...

  8. Flaks框架(Flask请求响应,session,闪现,请求扩展,中间件,蓝图)

    目录 一:Flask请求响应 1.请求相关信息 2.flask新手四件套 3.响应相关信息(响应response增加数据返回) 二:session 1.session与cookie简介 2.在使用se ...

  9. STM32外部中断(EXTI)控制LED亮灭的代码

    led.c #include "led.h" void LED_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2P ...

  10. 教你用JavaScript实现计数器

    案例介绍 欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个计数器.点击按钮数字改变,点击重置数字归0.通过实战我们将学会forEach循环.c ...