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

网站运营做的是什么工作开发公司项目管理部门获奖主持词

网站运营做的是什么工作,开发公司项目管理部门获奖主持词,多媒体应用设计师,网站怎么放404页面《ASP.NET Core 6框架揭秘实例演示[11]#xff1a;诊断跟踪的几种基本编程方式》介绍了四种常用的诊断日志框架。其实除了微软提供的这些日志框架#xff0c;还有很多第三方日志框架可供我们选择#xff0c;比如Log4Net、NLog和Serilog 等。虽然这些框架大都采用类似的设计诊断跟踪的几种基本编程方式》介绍了四种常用的诊断日志框架。其实除了微软提供的这些日志框架还有很多第三方日志框架可供我们选择比如Log4Net、NLog和Serilog 等。虽然这些框架大都采用类似的设计但是它们采用的编程模式具有很大的差异。为了对这些日志框架进行整合微软创建了一个用来提供统一的日志编程模式的日志框架。[本文节选《ASP.NET Core 6框架揭秘》第8章][S801]将日志输出到控制台和调试窗口源代码[S802]利用ILoggerFactory工厂创建IloggerT对象源代码[S803]注入IloggerT对象源代码[S804]TraceSource和EventSource的日志输出源代码[S805]针对等级的日志过滤源代码[S806]针对等级和类别的日志过滤源代码[S807]针对等级、类别和ILoggerProvider类型的日志过滤源代码[S801]将日志输出到控制台和调试窗口我们通过一个简单的实例来演示如何将具有不同等级的日志消息输出到当前控制台和Visual Studio的调试窗口。如下所示的两个NuGet包提供了针对这两种日志输出渠道的支持所以演示程序需要添加针对它们的引用。Microsoft.Extensions.Logging.ConsoleMicrosoft.Extensions.Logging.Debug应用程序一般使用ILoggerFacotry工厂创建的ILogger对象来记录日志下面的演示实例利用依赖注入容器来提供ILoggerFactory对象。如代码片段所示我们创建了一个ServiceCollection对象并调用AddLogging扩展方法注册了与日志相关的核心服务作为依赖注入容器的IServiceProvider对象被构建出来后我们从中提取出ILoggerFactory对象。using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging;var logger  new ServiceCollection().AddLogging(builder  builder.AddConsole().AddDebug()).BuildServiceProvider().GetRequiredServiceILoggerFactory().CreateLogger(Program);var levels  (LogLevel[])Enum.GetValues(typeof(LogLevel)); levels  levels.Where(it  it ! LogLevel.None).ToArray(); var eventId  1; Array.ForEach(levels, level  logger.Log(level, eventId, This is a/an {0} log message., level)); Console.Read();在调用AddLogging扩展方法时我们利用提供的ActionILoggingBuilder委托完成了针对ConsoleLoggerProvider和DebugLoggerProvider的注册。具体来说前者由ILoggingBuilder接口的AddConsole扩展方法注册后者则由AddDebug扩展方法进行注册。我们通过指定日志类别“Program”调用ILoggerFactory接口的CreateLogger方法将对应的ILogger对象创建出来。每个ILogger对象都对应一个确定的类别我们倾向于将当前写入日志的组件、服务或者类型名称作为日志类别所以需要指定的是当前类型的名称“Program”。我们通过调用ILogger的Log方法针对每个有效的日志等级分发了六个日志事件事件的ID分别被设置成16的整数。我们在调用Log方法时通过指定一个包含占位符{0}的消息模板和对应参数的方式来格式化最终输出的消息内容。程序启动后相应的日志会以图1所示的形式同时输出到控制台和Visual Studio的调试窗口。图1 针对控制台和Debugger的日志输出[S802]利用ILoggerFactory工厂创建IloggerT对象在前面演示的实例中我们将字符串形式表示的日志类别“Program”作为参数调用ILoggerFactory工厂的CreateLogger方法来创建对应的ILogger对象实际上我们还可以调用泛型的CreateLoggerT方法创建一个ILoggerT对象来完成相同的工作。如果调用这个方法我们就不需要额外提供日志类别因为日志类别会根据泛型参数类型T自动解析出来。在如下的代码片段中我们调用了ILoggerFactory工厂的CreateLoggerProgram方法将对应的 ILoggerProgram对象创建出来。作为日志负载内容的消息模板除了可以采用{0}{1}...{n}这样的占位符还可以使用任意字符串“{level}”来表示。启动改写的程序之后输出到控制台和调试输出窗口的内容与图1完全一致的。using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging;var logger  new ServiceCollection().AddLogging(builder  builder.AddConsole().AddDebug()).BuildServiceProvider().GetRequiredServiceILoggerFactory().CreateLoggerProgram(); var levels  (LogLevel[])Enum.GetValues(typeof(LogLevel)); levels  levels.Where(it  it ! LogLevel.None).ToArray(); var eventId  1; Array.ForEach(levels, level  logger.Log(level, eventId, This is a/an {level} log message., level)); Console.Read();[S803]注入IloggerT对象除了利用ILoggerFactory工厂来创建泛型的ILoggerProgram对象之外我们还具有更简洁的方式那就是按照如下的方式直接利用IServiceProvider对象来提供这个ILoggerProgram对象。换句话说ILoggerT实际上是可以作为依赖服务注入到消费它的类型中。... var logger  new ServiceCollection().AddLogging(builder  builder.AddConsole().AddDebug()) .BuildServiceProvider() .GetRequiredServiceILoggerProgram(); ...[S804]TraceSource和EventSource的日志输出除了控制台和调试器这两种输出渠道日志框架还提供针对其他输出渠道的支持。第7章重点介绍了针对TraceSource和EventSource的日志框架也是默认支持的两种输出渠道。针对这两种输出渠道的整合由如下两个NuGet包提供的。Microsoft.Extensions.Logging.TraceSourceMicrosoft.Extensions.Logging.EventSource在添加了上述两个NuGet包的引用之后我们对演示实例作了如下的修改。为了捕捉由EventSource分发的日志事件我们自定义了一个FoobarEventListener类型。我们在应用启动的时候创建了这个FoobarEventListener对象并分别注册了它的EventSourceCreated和EventWritten事件。一个名为“Microsoft-Extensions-Logging”的EventSource会帮助我们完成日志的输出所以EventSourceCreated事件的处理程序专门订阅了这个EventSource。using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System.Diagnostics; using System.Diagnostics.Tracing;var listener  new FoobarEventListener(); listener.EventSourceCreated  (sender, args)  {if (args.EventSource?.Name  Microsoft-Extensions-Logging){listener.EnableEvents(args.EventSource, EventLevel.LogAlways);} };listener.EventWritten  (sender, args)  {var payload  args.Payload;var payloadNames  args.PayloadNames;if (args.EventName  FormattedMessage  payload ! null  payloadNames !null){var indexOfLevel  payloadNames.IndexOf(Level);var indexOfCategory  payloadNames.IndexOf(LoggerName);var indexOfEventId  payloadNames.IndexOf(EventId);var indexOfMessage  payloadNames.IndexOf(FormattedMessage);Console.WriteLine(${(LogLevel)payload[indexOfLevel],-11}:  { payload[indexOfCategory]}[{ payload[indexOfEventId]}]);Console.WriteLine(${,-13}{payload[indexOfMessage]});} };var logger  new ServiceCollection().AddLogging(builder  builder.AddTraceSource(new SourceSwitch(default, All), new DefaultTraceListener { LogFileName  trace.log }).AddEventSourceLogger()).BuildServiceProvider().GetRequiredServiceILoggerProgram();var levels  (LogLevel[])Enum.GetValues(typeof(LogLevel)); levels  levels.Where(it  it ! LogLevel.None).ToArray(); var eventId  1; Array.ForEach(levels, level  logger.Log(level, eventId, This is a/an {level} log message., level));internal class FoobarEventListener : EventListener { }上述的EventSource对象在进行日志分发的时候它会采用不同的方式对将日志消息进行格式化最终将格式化后的内容作为荷载内容的一部分通过多个事件分发出去EventWritten事件处理程序选择的是一个名为FormattedMessage的事件它会将包括格式化日志消息在内的内容荷载信息输出到控制台上。基于TraceSource和EventSource日志框架的输出渠道是调用ILoggingBuilder的AddTraceSource和AddEventSourceLogger扩展方法进行注册的。针对AddTraceSource扩展方法的调用提供了两个参数前者是作为全局过滤器的SourceSwitch对象后者则是注册的DefaultTraceListener对象。由于我们为注册的DefaultTraceListener指定了日志文件的路径所以输出的日志消息最终会被写入指定的文件中。程序运行后日志消息会以如图2示的形式同时输出到控制台和指定的日志文件中trace.log。图2 对TraceSource和EventSource的日志输出[S805]针对等级的日志过滤对于使用ILogger或者ILoggerT对象分发的日志事件并不能保证都会进入最终的输出渠道因为注册的ILoggerProvider对象会对日志进行过滤只有符合过滤条件的日志消息才会被真正地输出到对应的渠道。每一个分发的日志事件都具有一个确定的等级。一般来说日志消息的等级越高表明对应的日志事件越重要或者反映的问题越严重自然就越应该被记录下来所以在很多情况下我们指定的过滤条件只需要一个最低等级所有不低于等于或者高于该等级的日志都会被记录下来。最低日志等级在默认情况下被设置为Information这就是前面演示实例中等级为Trace和Debug的两条日志没有被真正输出的原因。如果需要将这个作为输出“门槛”的日志等级设置得更高或者更低我们只需要将指定的等级作为参数调用ILoggingBuilder接口的SetMinimumLevel方法即可。using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging;var logger  new ServiceCollection().AddLogging(builder  builder.SetMinimumLevel(LogLevel.Trace).AddConsole()).BuildServiceProvider() .GetRequiredServiceILoggerProgram();var levels  (LogLevel[])Enum.GetValues(typeof(LogLevel)); levels  levels.Where(it  it ! LogLevel.None).ToArray(); var eventId  1; Array.ForEach(levels, level  logger.Log(level, eventId, This is a/an {level} log message., level)); Console.Read();如上面的代码片段所示在调用AddLogging扩展方法时我们调用ILoggingBuilder接口的SetMinimumLevel方法将最低日志等级设置为Trace。由于设置的是最低等级所以所有的日志消息都会以图3所示的形式输出到控制台上。图3 通过设置最低等级控制输出的日志[S806]针对等级和类别的日志过滤虽然“过滤不低于指定等级的日志消息”是常用的日志过滤规则但过滤规则的灵活度并不限于此很多时候还会同时考虑日志的类别。在创建对应ILogger时由于一般将当前组件、服务或者类型的名称作为日志类别所以日志类别基本上体现了日志消息来源。如果我们只希望输出由某个组件或者服务发出的日志事件就需要针对类别对日志事件实施过滤。综上可知日志过滤条件其实可以通过一个类型为Funcstring, LogLevel, bool的委托对象来表示它的两个输入参数分别代表日志事件的类别和等级。下面通过提供这样一个委托对象对日志消息做更细粒度的过滤所以需要对演示程序做如下修改。using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging;var loggerFactory  new ServiceCollection().AddLogging(builder  builder.AddFilter(Filter).AddConsole()).BuildServiceProvider().GetRequiredServiceILoggerFactory();Log(loggerFactory, Foo); Log(loggerFactory, Bar); Log(loggerFactory, Baz);Console.Read();static void Log(ILoggerFactory loggerFactory, string category) {var logger  loggerFactory.CreateLogger(category);var levels  (LogLevel[])Enum.GetValues(typeof(LogLevel));levels  levels.Where(it  it ! LogLevel.None).ToArray();var eventId  1; Array.ForEach(levels, level  logger.Log(level, eventId, This is a/an {0} log message., level)); }static bool Filter(string category, LogLevel level) {return category switch{Foo  level  LogLevel.Debug,Bar  level  LogLevel.Warning,Baz  level  LogLevel.None,_  level  LogLevel.Information,}; }如上面的代码片段所示作为日志过滤器的Funcstring, LogLevel, bool对象定义的过滤规则如下对于日志类别Foo和Bar我们只会选择输出等级不低于Debug和Warning的日志对于日志类别Baz任何等级的日志事件都不会被选择至于其他日志类别我们采用默认的最低等级Information。在执行AddLogging扩展方法时我们调用ILoggerBuilder接口的AddFilter方法将Funcstring, LogLevel, bool对象注册为全局过滤器。我们利用依赖注入容器提供的ILoggerFactory工厂创建了三个ILogger对象它们采用的类别分别为“Foo”、“Bar”和“Baz”。我们最后利用这三个ILogger对象分发针对不同等级的六次日志事件满足过滤条件的日志消息会以图4所示的形式输出到控制台上。图4 针对类别和等级的日志过滤[S807]针对等级、类别和ILoggerProvider类型的日志过滤不论是通过调用ILoggerBuilder接口的SetMinimumLevel方法设置的最低日志等级还是通过调用AddFilter扩展方法提供的过滤器设置的日志过滤规则针对的都是所有注册的ILoggerProvider对象但是有时需要将过滤规则应用到某个具体的ILoggerProvider对象上。如果将ILoggerProvider对象引入日志过滤规则中那么日志过滤器就应该表示成一个类型为Funcstring, string, LogLevel, bool的委托对象该委托的三个输入参数分别表示ILoggerProvider类型的全名、日志类别和等级。为了演示针对LoggerProvider的日志过滤可以将演示程序做如下改动。using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Console; using Microsoft.Extensions.Logging.Debug;var logger  new ServiceCollection().AddLogging(builder  builder.AddFilter(Filter).AddConsole().AddDebug()).BuildServiceProvider().GetRequiredServiceILoggerFactory().CreateLogger(App.Program);var levels  (LogLevel[])Enum.GetValues(typeof(LogLevel)); levels  levels.Where(it  it ! LogLevel.None).ToArray(); var eventId  1; Array.ForEach(levels, level  logger.Log(level, eventId,This is a/an {0} log message., level)); Console.Read();static bool Filter(string provider, string category, LogLevel level)  provider switch {var p when p  typeof(ConsoleLoggerProvider).FullName  level  LogLevel.Debug,var p when p  typeof(DebugLoggerProvider).FullName  level  LogLevel.Warning,_  true, };如上面的代码片段所示我们注册的过滤器体现的过滤规则如下ConsoleLoggerProvider和DebugLoggerProvider的最低日志等级分别设置为Debug和Warning至于其他的ILoggerProvider类型则不做任何的过滤。我们演示程序同时注册了ConsoleLoggerProvider和DebugLoggerProvider对于分发的12条日志消息5条会在控制台上输出3条会出现在Visual Studio的调试输出窗口中。图5 对ILoggerProvider类型的日志过滤《ASP.NET Core 6框架揭秘》实例演示[01]编程初体验《ASP.NET Core 6框架揭秘》实例演示[02]各种形式的API开发《ASP.NET Core 6框架揭秘》实例演示[03]Dapr初体验《ASP.NET Core 6框架揭秘》实例演示[04]自定义依赖注入框架《ASP.NET Core 6框架揭秘》实例演示[05]依赖注入基本编程模式《ASP.NET Core 6框架揭秘》实例演示[06]依赖注入框架设计细节《ASP.NET Core 6框架揭秘》实例演示[07]文件系统《ASP.NET Core 6框架揭秘》实例演示[08]配置的基本编程模式《ASP.NET Core 6框架揭秘》实例演示[09]将配置绑定为对象《ASP.NET Core 6框架揭秘》实例演示[10]Options基本编程模式《ASP.NET Core 6框架揭秘》实例演示[11]诊断跟踪的几种基本编程方式 《ASP.NET Core 6框架揭秘》实例演示[12]诊断跟踪的进阶用法
http://www.zqtcl.cn/news/444618/

相关文章:

  • 大型html5浅蓝色网站设计公司dede模板网店怎么开店详细教程
  • 一个阿里云怎么做两个网站吗樱花16q808a
  • 如何利用服务器做网站网站建设朝阳
  • 比邻店网站开发企查查企业信息查询在线
  • 家乡网站建设策划案专业建设专题网站
  • 网站建设公司挣钱吗wordpress评论内容密码保护
  • 上海专业建站最低价网站程序模板
  • 蚌埠网站建设哪家好创客贴官网
  • php网站建设参考文献wordpress 头像 很慢
  • 大连seo网站推广phpcmsv9手机网站源码
  • 公司做推广做网站好还是俄文网站引擎
  • 上海市建设咨询协会网站asp网站源码
  • 大家都在哪些网站上做医药招商wordpress po文件
  • 国外主题网站兰州app
  • 建设项目自主验收公示网站dedecms英文外贸网站企业模板下载
  • 做网站要服务器吗前端企业网站开发
  • 用html写一个个人介绍多网站怎么做seo
  • 做网站打广告犯法吗中国建设投资集团 网站首页
  • 怎么免费申请个人网站职业技能培训有哪些
  • 小型的企业网站湖南备案网站建设方案书
  • 现在做网站公司seo怎么做教程
  • asp化妆品网站windows优化大师有必要安装吗
  • 网站流量分析系统制作图片网站
  • 做网站技术路线广州番禺发布公众号
  • 企业网站自己可以做吗服装网站建设的利益分析
  • 网站做软件居众装饰集团有限公司
  • 南山网站制作联系电话芒果国际影城星沙店
  • 珠海网站设计费用建企业版网站多久
  • linux 网站搬家wordpress 卸载plugin
  • 江苏省建设厅网站 投诉编辑网站的软件手机