<二>asp.netcore 配置文件与日志
一、配置文件
ASP.NET Core支持多种不同的配置选项。建议在应用程序的program类中只实例化一个Configuration实例,然后使用选择模式来访问各自的设置。
Configuration需要配置一个数据源,使得Configuration能正常工作。一般使用json格式的文件作为数据源,比如:appsetting.json
ConfigurationBuilder builder = new ConfigurationBuilder(); var config = builder.AddJsonFile("demo.json", optional: false).Build(); config.GetSection("Setting");
{ "Setting": { "Url": "http://localhost:8080/", "Name": "localhost" } }
1、使用配置文件参数的方法构造函数注入
public IConfiguration _configuration { get; set; } public TestController(IConfiguration configuration) { _configuration = configuration; } /// <summary> /// 方式一:直接读取单个值 /// </summary> public void GetConfig() { var url = _configuration["Setting:Url"]; var url2 = _configuration.GetValue<string>("Setting:Url"); var url3=_configuration.GetSection("Setting").GetSection("Url").Value; }
2、统一设置配置类
/// <summary> /// 统一将json格式转成配置类 /// </summary> public static class AppSettings { public static SettingClass settingClass { get; set; } public static void Init(IConfiguration configuration) { // 将Setting模块绑定到Json模块的Setting类 settingClass = new SettingClass(); configuration.Bind("Setting", settingClass); } }
/// <summary> ///配置模型类 /// </summary> public class Setting { /// <summary> /// url /// </summary> public string Url { get; set; } /// <summary> /// 名称 /// </summary> public string Name { get; set; } }
// program入口调用此方法完成统一配置类的设置 AppSettings.Init(Configuration);
public void GetConfig() { var url = AppSettings.setting.Url; var name = AppSettings.setting.Name; }
二、日志记录
1.日志三要素
- Logger:是写日志的对象
- LoggerFactory:是创建Logger对象的工厂
- LoggerProvider:决定日志写入目的地的对象
2.日志输出的四个方向
- 控制台(Console):引入 Microsoft.Extensions.Logging.Console
- 调试(Debug) :引入 Microsoft.Extensions.Logging.Debug
- 事件日志(EventLog)
- TraceSource:引入 System.Diagnostics.TraceSource
3.创建logger对象的基本流程。下例子代码中,向logger工厂中指定了两个输出方向,然后再创建logger。那么这个logger就只会往这个两个目的地写日志。
ILoggerFactory loggerFactory = new LoggerFactory(); loggerFactory.AddProvider(new ConsoleLoggerProvider(filter,false)); loggerFactory.AddProvider(new DebugLoggerProvider(filter)); ILogger logger = loggerFactory.CreateLogger("指定名");
4.asp.netcore在创建主机的时候已经默认了创建了指定所有方向的LoggerFactory,所以如果没有特殊的要求,可以直接使用依赖注入
private readonly ILogger<Todocontroller> _logger; public Todocontroller (ILogger<TodoController> logger) _logger - logger; )
var logger = loggerFactory.createLogger ( "catchall" );
5.日志记录级别
当应用程序添加一条日志记录时,必须指定日志级别。日志级别允许你控制应用程序输出日志的详细程度,以及把不同类型的日志传送给不同的日志记录器。
- Trace:用于记录最详细的日志消息,通常仅用于开发阶段调试问题。这些消息可能包含敏感的应用程序数据,因此不建议用于生产环境,默认应禁用。
- Debug:这种消息在开发阶段短期内比较有用。它们包含一些可能会对调试有所助益、但没有长期价值的信息。默认情况下这是最详细的日志。
- Information:这种消息被用于跟踪应用程序的一般流程。与 Verbose级别的消息相反,这些日志应该有一定的长期价值。
- Warning:当应用程序出现错误或其他不会导致程序停止的流程异常或意外事件时,应使用警告级别,以供日后调查。建议在一个通用的地方处理警告级别的异常。
- Error:当应用程序由于某些故障停止工作时,则需要记录错误日志。这些消息应该指明当前活动或操作(比如当前的HTTP请求),而不是应用程序范围的故障。
- Critical:当应用程序或系统崩溃、遇到灾难性故障,需要立即被关注时,应当记录关键级别的日志。例如,数据丢失、磁盘空间不够等。
6.日志模型
由于ILogger只定义了一个Log方法来写日志,但是日志级别有很多种,每次写log都要指定这么多的参数,非常不方便,这样就引入了日志模型。
public interface ILogger { void Log(LogLevel logLevel, EventId eventId, object state, Exception exception, Func<object, Exception, string> formatter); bool IsEnabled(LogLevel logLevel); IDisposable BeginScope<TState>(TState state); }
日志模型的Logger泛指所有实现了ILogger接口的所有类型以及对应对象,该接口定义在NuGet包“Microsoft.Extensions.Logging.Abstractions”中。
一条写入的日志消息会关联着一个日志记录事件,记录事件通过一个EventId对象来标识,Log方法的eventId参数类型就是EventId。它具有两个基本的属性Id和Name。
public struct EventId { public int Id { get; } public string Name{ get; } public EventId(int id, string name = null); public static implicit operator EventId(int i); }
根据日志消息采用的等级,日志模型还为ILogger接口定义了一系列针对不同日志等级的扩展方法
- LogTrace
- LogDebug
- LogInformation
- LogWarning
- LogError
- LogCritical
7.日志模型的使用
public class Todocontroller : controller {
ILogger<Todocontroller> _logger; public Todocontroller (ILogger<Todocontroller> logger) {_logger - logger;} public IEnumerable<TodoItem>GetAll(){ _logger.LogInformation(LoggingEvents.xx,"items" ); }
}
var logger = loggerFactory.createLogger ("message") ;
logger.LogInformation ( "message") ;