当前位置: 首页 > news >正文

外国人学做中国菜的网站容桂顺德网站建设

外国人学做中国菜的网站,容桂顺德网站建设,网站确定关键词 如何做,汕头市公司网站建设平台在上一章中#xff0c;我们对 ASP.NET Logging 系统做了一个整体的介绍#xff0c;而在本章中则开始从最基本的配置开始#xff0c;逐步深入到源码当中去。 默认配置 在 ASP.NET Core 2.0 中#xff0c;对默认配置做了很大的简化#xff0c;并把一些基本配置移动到了程序…在上一章中我们对 ASP.NET Logging 系统做了一个整体的介绍而在本章中则开始从最基本的配置开始逐步深入到源码当中去。 默认配置 在 ASP.NET Core 2.0 中对默认配置做了很大的简化并把一些基本配置移动到了程序的入口点 Program 类中更加简洁。 public class Program{    public static void Main(string[] args)    {BuildWebHost(args).Run();}       public static IWebHost BuildWebHost(string[] args) WebHost.CreateDefaultBuilder(args).UseStartupStartup().Build(); } 如上可以看到基本的配置都放到了 CreateDefaultBuilder 方法中而 WebHost则在 MetaPackages 中提供了一些简化方法。 public static IWebHostBuilder CreateDefaultBuilder(string[] args){    var builder new WebHostBuilder().UseKestrel().UseContentRoot(Directory.GetCurrentDirectory()).ConfigureAppConfiguration((hostingContext, config) {                     var env hostingContext.HostingEnvironment;config.AddJsonFile(appsettings.json, optional: true, reloadOnChange: true).AddJsonFile($appsettings.{env.EnvironmentName}.json, optional: true, reloadOnChange: true);                  if (env.IsDevelopment()){                                var appAssembly Assembly.Load(new AssemblyName(env.ApplicationName));                         if (appAssembly ! null){config.AddUserSecrets(appAssembly, optional: true);}}config.AddEnvironmentVariables();                if (args ! null){config.AddCommandLine(args);}}).ConfigureLogging((hostingContext, logging) {logging.AddConfiguration(hostingContext.Configuration.GetSection(Logging));logging.AddConsole();logging.AddDebug();}).UseIISIntegration().UseDefaultServiceProvider((context, options) {options.ValidateScopes context.HostingEnvironment.IsDevelopment();});           return builder; } 如上可以看到一些我们在 1.0 中非常熟悉的代码而 ConfigureLogging 则是 IWebHostBuilder 类的一个扩展方法 public static IWebHostBuilder ConfigureLogging(this IWebHostBuilder hostBuilder, ActionWebHostBuilderContext, ILoggingBuilder configureLogging){    return hostBuilder.ConfigureServices((context, collection) collection.AddLogging(builder configureLogging(context, builder))); } 而 AddLogging 则是 Logging 系统的入口点是由 Microsoft.Extensions.Logging 所提供的扩展方法 public static IServiceCollection AddLogging(this IServiceCollection services, ActionILoggingBuilder configure){    if (services null){          throw new ArgumentNullException(nameof(services));}services.AddOptions();services.TryAdd(ServiceDescriptor.SingletonILoggerFactory, LoggerFactory());services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger), typeof(Logger)));    services.TryAddEnumerable(ServiceDescriptor.SingletonIConfigureOptionsLoggerFilterOptions(            new DefaultLoggerLevelConfigureOptions(LogLevel.Information)));configure(new LoggingBuilder(services));          return services; } 首先注册了 Logging 系统基本服务的默认实现用来激活 Logging 系统然后创建 LoggingBuilder 对象而后一系列对日志系统的配置都是调用的该对象的扩展方法。 internal class LoggingBuilder : ILoggingBuilder{    public LoggingBuilder(IServiceCollection services)    {Services services;}    public IServiceCollection Services { get; } } 现在回头看看 CreateDefaultBuilder方法中通过 ConfigureLogging 来对日志系统所做的默认配置。 AddConfiguration 该方法是对日志系统的一个全局配置 logging.AddConfiguration(hostingContext.Configuration.GetSection(Logging));public static ILoggingBuilder AddConfiguration(this ILoggingBuilder builder, IConfiguration configuration){builder.Services.AddSingletonIConfigureOptionsLoggerFilterOptions(new LoggerFilterConfigureOptions(configuration));builder.Services.AddSingletonIOptionsChangeTokenSourceLoggerFilterOptions(new ConfigurationChangeTokenSourceLoggerFilterOptions(configuration));    return builder; } 首先使用 Options 模式注册了一个 LoggerFilterOptions public class LoggerFilterOptions{    public LogLevel MinLevel { get; set; }       public IListLoggerFilterRule Rules { get; } new ListLoggerFilterRule(); }     public class LoggerFilterRule{...         public string ProviderName { get; }         public string CategoryName { get; }          public LogLevel? LogLevel { get; }            public Funcstring, string, LogLevel, bool Filter { get; }.... } 而默认实现 LoggerFilterConfigureOptions 的逻辑很简单就是从配置文件中读取 LogLevel 的配置 internal class LoggerFilterConfigureOptions : IConfigureOptionsLoggerFilterOptions {...    private void LoadDefaultConfigValues(LoggerFilterOptions options)    {        if (_configuration null){              return;}              foreach (var configurationSection in _configuration.GetChildren()){                 if (configurationSection.Key LogLevel){                         // Load global category defaultsLoadRules(options, configurationSection, null);}                  else{       var logLevelSection configurationSection.GetSection(LogLevel);                           if (logLevelSection ! null){                    // Load logger specific rulesvar logger configurationSection.Key;LoadRules(options, logLevelSection, logger);}}}}                     private void LoadRules(LoggerFilterOptions options, IConfigurationSection configurationSection, string logger)    {                 foreach (var section in configurationSection.AsEnumerable(true)){                       if (TryGetSwitch(section.Value, out var level)){                            var category section.Key;                            if (category Default){category null;}                                        var newRule new LoggerFilterRule(logger, category, level, null);options.Rules.Add(newRule);}}}... } 通过代码我们可以清楚的知道我们的配置文件应该按如下格式来定义 {Logging: {LogLevel: { // 表示全局Default: Warning // 不指定CategoryName应用于所有Category},Console:{ // 指定 ProviderName仅针对于 ConsoleProviderDefault: Warning,Microsoft: Error // 指定CategoryName为Microsoft的日志级别为Error}}} 而 IOptionsChangeTokenSource 是对上面 IConfigureOptions 的一个补充为我们获取 OptionsMonitor 注入了必要的服务更多关于 Options 的介绍可以看我之前文章 IOptionsMonitor。 而在 Logging 系统中也是通过注入 IOptionsMonitorLoggerFilterOptions 来使用 LoggerFilterOptions 的 public LoggerFactory(IEnumerableILoggerProvider providers, IOptionsMonitorLoggerFilterOptions filterOption){_providerRegistrations providers.Select(provider new ProviderRegistration { Provider provider }).ToList();_changeTokenRegistration filterOption.OnChange(RefreshFilters);RefreshFilters(filterOption.CurrentValue); } AddConsole 上面我们提到在配置文件中可以指定针对某个 Provider 的配置而 AddConsole 则是用来添加一个 Console 类型的 Provider用来将日志记录到控制台中 public static ILoggingBuilder AddConsole(this ILoggingBuilder builder){builder.Services.AddSingletonILoggerProvider, ConsoleLoggerProvider();    return builder; }  public static ILoggingBuilder AddConsole(this ILoggingBuilder builder, ActionConsoleLoggerOptions configure){     if (configure null){           throw new ArgumentNullException(nameof(configure));}builder.AddConsole();builder.Services.Configure(configure);         return builder; } 以上代码在 Microsoft.Extensions.Logging.Console Package 中首先提供了 ILoggerProvider 的注入方法用来启用控制台的日志记录功能而且还提供了一个方法重载用来指定针对 ConsoleProvider 的配置。 AddDebug 而 AddDebug 与 AddConsole 类似只不过是把日志输出在 Debug 窗口中。 更多关于 Provider 的配置会在以后再详细探索。 自定义配置 上面介绍了 ASP.NET Core 中对日志系统的默认配置那么如果我们想再添加一些其它配置应该怎么做呢 在 1.0 时代我们通过是在 Startup 类中的 Configure 方法中注入 ILoggerFactory 来进行配置当然在 2.0 中我们仍然可以这样做但是更加推荐的做法是在 Program 入口方法中进行配置而 Configure 方法通过是对一些中间件的配置。 我们可以直接使用上面介绍过的 ConfigureLogging 扩展方法来添加我们自己的配置 public static IWebHost BuildWebHost(string[] args) WebHost.CreateDefaultBuilder(args).ConfigureLogging(build {build.AddFilter(f f LogLevel.Debug);build.AddEventSourceLogger();}).UseStartupStartup().Build(); 我们添加了一个 EventSource Provider并且使用了 AddFilter扩展方法对日志的过滤进行配置。而 AddFilter 的作用类似于 前面介绍的 AddConfiguration只是把配置方式从配置文件变成了代码。 public static class FilterLoggingBuilderExtensions{    // 具有多个重载此处省略public static ILoggingBuilder AddFilter(this ILoggingBuilder builder, Funcstring, string, LogLevel, bool filter) builder.ConfigureFilter(options options.AddFilter(filter));       private static ILoggingBuilder ConfigureFilter(this ILoggingBuilder builder, ActionLoggerFilterOptions configureOptions)    {builder.Services.Configure(configureOptions);          return builder;} } 可以看到最终也是对 ConfigureOptions 的配置而后执行的配置会覆盖之前配置的。 总结 本章从 Logging 系统的起始点入手详细分析了如何对 Logging 系统进行配置分为日志级别过滤和日志提供者两种配置而下一章则会分析一下日志的过滤原理。 相关文章  ASP.NET Core 源码学习之 Options[1]:ConfigureASP.NET Core 源码学习之 Options[2]:IOptionsASP.NET Core 源码学习之 Options[3]:IOptionsSnapshotASP.NET Core 源码学习之 Options[4]:IOptionsMonitorASP.NET Core 源码学习之Logging[1]:IntroductionASP.NET Core MVC 源码学习详解 Action 的匹配asp.net core源码飘香从Hosting开始asp.net core源码飘香Configuration组件asp.net core源码飘香Options组件asp.net core源码飘香Logging组件 原文地址http://www.cnblogs.com/RainingNight/p/asp-net-core-logging-configure.html.NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注
http://www.yutouwan.com/news/381443/

相关文章:

  • 遵义怎样做网站openwrt做网站
  • 广州黄埔区开发区建设局网站买了个网站后怎么做的
  • 枣庄手机网站建设公司个人简历制作视频教程
  • 免费在线观看韩国电视剧网站推荐旅游网站排名前5位的
  • 嘉定南翔网站建设深圳专业建站多少钱
  • 海口建站模板企业宣传模板图片
  • 网站规划与开发专业佛山网吧什么时候恢复营业
  • 宁波网站优化找哪家商标设计生成器
  • 鹤壁网站设计企业员工培训课程有哪些
  • 山东房和城乡建设厅网站asp.net获取网站虚拟目录
  • 南昌响应式网站建设聊城哪儿做网站便宜
  • 做翻译小说网站赚钱吗家庭局域网设计方案
  • 建影楼网站多少钱定制开发小程序和模板小程序
  • 网站制作教程下载免费那个网站
  • 电商网站 技术搭建 wordpress 简书
  • 中铁建设投资集团有限公司招聘网站百度爱采购竞价推广
  • 嘉兴响应式网站云南机场建设集团网站
  • 做sgs认证的公司网站直播是网站怎么做
  • 湖北网站开发培训千锋培训机构官网
  • 网站开发课题开发背景主流建站开源程序有哪些
  • 如何将自己做的网站放到网上wordpress媒体库无法显示
  • 学校网站网页建设开题报告书网站建设需要具备的能力
  • 深圳网站制作要多少钱做网站公司多少钱
  • 页面设计制作网站源码莱西网站制作联赛与超
  • 网站宣传推广平台asp做的网站怎么运行
  • 个人网站备案 网站服务内容英文网站建设费用
  • 宁波本地网站排行意派h5制作平台
  • 配送网站开发景德镇网站制作公司
  • 找个美工做淘宝网站需要多少钱网站建设与运营课程
  • 手机网站横幅制作模板wordpress做分类信息网站