在.NET Core 2中实现配置化的日志记录并持久化到文件,以及读取Excel文件,是本文要介绍的两个主要功能。这些功能对于开发具有日志记录需求的.NET Core应用程序至关重要。
本文的撰写源于作者在寻找关于.NET Core中日志记录和Excel文件读取的有用信息时,不得不多次浏览互联网,但找到的文章都不能完整地帮助作者实现目标。
本文提供的代码片段是作者为了实现上述功能而编写的,可以作为.NET Core应用程序开发中的一个起点。
本文介绍的日志记录方法适用于.NET Core控制台应用程序,也可以稍作修改后用于ASP.NET Core项目。目标是实现良好的控制台日志记录,并配置日志级别,同时实现日志持久化到文件。
本文的解决方案包括以下文件:
在Program.cs中,创建服务集合,配置服务,并运行应用程序。
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Serilog;
using Serilog.Events;
using System;
namespace ExcelDataReaderPoc
{
class Program
{
static void Main(string[] args)
{
var serviceCollection = new ServiceCollection();
ConfigureServices(serviceCollection);
var serviceProvider = serviceCollection.BuildServiceProvider();
serviceProvider.GetService().Run();
}
private static void ConfigureServices(IServiceCollection serviceCollection)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", false)
.Build();
serviceCollection.AddSingleton(new LoggerFactory()
.AddConsole(configuration.GetSection("Logging"))
.AddSerilog()
.AddDebug());
serviceCollection.AddLogging();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.WriteTo.RollingFile(configuration["Serilog:LogFile"])
.CreateLogger();
serviceCollection.AddSingleton(configuration);
serviceCollection.AddTransient();
}
}
}
在App.cs中,定义了一个应用程序类,用于读取Excel文件并记录日志。
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using OfficeOpenXml;
using System;
using System.IO;
using System.Text;
namespace ExcelDataReaderPoc
{
public class App
{
private readonly ILogger _logger;
private readonly IConfigurationRoot _config;
public App(ILogger logger, IConfigurationRoot config)
{
_logger = logger;
_config = config;
}
public void Run()
{
// 测试日志级别
_logger.LogTrace("LogTrace");
_logger.LogDebug("LogDebug");
_logger.LogInformation("LogInformation");
_logger.LogWarning("LogWarning");
_logger.LogError("LogError");
_logger.LogCritical("LogCritical");
// 读取Excel文件
var filePath = @"D:/test.xlsx";
FileInfo file = new FileInfo(filePath);
using (ExcelPackage package = new ExcelPackage(file))
{
StringBuilder sb = new StringBuilder();
ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
int rowCount = worksheet.Dimension.Rows;
int colCount = worksheet.Dimension.Columns;
var rawText = string.Empty;
for (int row = 1; row <= rowCount; row++)
{
for (int col = 1; col <= colCount; col++)
{
rawText += worksheet.Cells[row, col].Value.ToString() + "\t";
}
rawText += "\r\n";
}
_logger.LogInformation(rawText);
}
Console.ReadKey();
}
}
}
在appsettings.json文件中,配置了日志级别和Serilog的文件输出路径。
{
"Configuration": {
"Title": "Excel Data Reader POC Application"
},
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Trace"
}
},
"Console": {
"LogLevel": {
"Microsoft.AspNetCore.Mvc.Razor.Internal": "Warning",
"Microsoft.AspNetCore.Mvc.Razor.Razor": "Debug",
"Microsoft.AspNetCore.Mvc.Razor": "Error",
"Default": "Trace"
}
},
"LogLevel": {
"Default": "Trace"
}
},
"Serilog": {
"LogFile": "C:/Logs/ExcelDataReaderPoc.log",
"MinimumLevel": "Verbose"
}
}
在.NET Core中读取Excel文件是一个常见的需求。作者尝试了多种方法,最终发现使用EPPlus.Core库可以很好地实现这一功能。