同样也可以在一个类里面把记录的日志分为不同的分类,这时候你可以使用ILoggerFactory,这样就可以随时创建logger了,并把它绑定到特定的区域:
不知道您有没有发现上面这几个例子中日志输出的时候都有个数字 [0], 它是事件的标识符。因为上面的例子中我们没有指定事件的ID,所以就取默认值0。使用事件ID还是可以帮助我们区分和关联记录的日志的。
每次写日志的时候, 都需要通过不同的方式指明LogLevel, LogLevel表明的是严重性.
下面是ASP.NET Core里面定义的LogLevel(它是个枚举), 按严重性从低到高排序的:
Trace = 0, 它可以包含敏感拘束, 默认在生产环境中它是被禁用掉的.
Debug = 1, 也是在调试使用, 应该在生产环境中禁用, 但是遇到问题需要调试可以临时启用.
Information = 2, 用来追踪应用程序的总体流程.
Warning = 3, 通常用于记录非正常或意外的事件, 也可以包括不会导致应用程序停止的错误和其他事件, 例如验证错误等.
Error = 4, 用于记录无法处理的错误和异常, 这些信息意味着当前的活动或操作发生了错误, 但不是应用程序级别的错误.
Critical = 5, 用于记录需要立即处理的事件, 例如数据丢失或磁盘空间不足.
None = 6, 如果你不想输出日志, 你可以把程序的最低日志级别设置为None, 此外还可以用来过滤日志.
记录的日志信息是可以带参数的, 使用消息模板(也就是消息主题和参数分开), 格式如下:
同样也支持字符串插值:
第二种方式代码的可读性更强一些, 而且它们输出的结果没有什么区别:
但是对于日志系统来说, 这两种方式是不一样的. 通过消息模板的方式(消息和参数分开的方式), 日志提供商可以实现语义日志或叫做结构化日志, 它们可以把参数单独的出入到日志系统里面进行单独存储, 不仅仅是格式化的日志信息.
此外, 用重载的方法, 记录日志时也可以包含异常对象.
日志分组
我们可以使用相同的日志信息来表示一组操作, 这需要使用scope, scope继承了IDisposable接口, 通过ILogger.BeginScope<TState>可以得到scope:
使用scope, 还有一点需要注意, 需要在日志提供商上把IncludeScopes属性设置为true: