本文主要内容为.NET Core的日志记录程序和常使用的日志记录框架的简单使用
首先,打开VS2019新建一个ASP.NET Core Web Api项目,项目创建好后会有一个集成好的天气预报的类和控制器,接下来,我们的方法就在天气控制器里完成。
在启动项中添加Log配置替换默认的日志提供程序,在控制器中编写具体输出内容
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 > ();
});
[ApiController]
[Route("[controller]/[action]")]
public class WeatherForecastController: ControllerBase
{
private readonly ILogger _logger;
public WeatherForecastController(ILogger logger)
{
_logger = logger;
}
///
/// 获取日志输出 - 通用主机
///
[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");
}
}
直接在控制器中创建LoggerFactory时调用提供程序的Add方法,使用LoggerFactory来创建 ILogger
[ApiController]
[Route("[controller]/[action]")]
public class WeatherForecastController: ControllerBase
{
///
/// 获取日志输出 - 非主机
///
[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();
logger.LogInformation("非主机模式输出log msg");
}
}
或者在项目的.csproj文件添加如下代码:
Always
关于log4net.config配置的详细说明,可参考log4net配置文件详解
5.1 Log4Net 简单配置,输出至控制台
///
/// 获取日志输出 - 第三方框架:Log4Net(简单配置,输出至控制台)
///
[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 增加配置,输出至文件
///
/// 获取日志输出 - 第三方框架:Log4Net(增加配置,输出至文件)
///
[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 运行结果
或者在项目的.csproj文件添加如下代码:
Always
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
}
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"
}
}
}
///
/// 获取日志输出 - 第三方框架:NLog
///
[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");
}
关于配置文件的说明可查看官网:NLog Configuration-file
还有一篇翻译文章方便查看:NLog类库使用探索——详解配置
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
}
这里为直接按照配置格式输出,当然也可以通过读取配置文件的形式读取配置的具体信息,本文不做具体阐述。
///
/// 获取日志输出 - 第三方框架:Serilog
///
[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");
}
1)Log4Net GitHub仓库地址
2)NLog GitHub仓库地址
3)Serilog GitHub仓库地址
4)NLog vs log4net vs Serilog: Compare .NET Logging Frameworks
5)LogLevel 枚举
6)日志级别
以上就是.NET Core 日志记录程序和常用日志记录框架的简单使用的介绍,做此记录,如有帮助,欢迎点赞关注收藏!