ASP.NET Core 日志处理
ASP.NET Core 内建支持日志,也允许开发人员轻松切换为他们想用的其他日志框架。
通过 DI 请求 ILoggerFactory 或 ILogger 可为应用程序增加日志功能。
参考原文:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging?tabs=aspnetcore1x
ASP.NET Core 定义了六个日志级别,通过增加重要性或严重程度排序:
Trace
用于记录最详细的日志消息,通常仅用于开发阶段调试问题。这些消息可能包含敏感的应用程序数据,因此不应该用于生产环境。默认应禁用。举例:Credentials: {“User”:”someuser”, “Password”:”P@ssword”}
Debug
这种消息在开发阶段短期内比较有用。它们包含一些可能会对调试有所助益、但没有长期价值的信息。默认情况下这是最详细的日志。举例: Entering method Configure with flag set to true
Information
这种消息被用于跟踪应用程序的一般流程。与 Verbose 级别的消息相反,这些日志应该有一定的长期价值。举例: Request received for path /foo
Warning
当应用程序出现错误或其它不会导致程序停止的流程异常或意外事件时使用警告级别,以供日后调查。在一个通用的地方处理警告级别的异常。举例: Login failed for IP 127.0.0.1 或 FileNotFoundException for file foo.txt
Error
当应用程序由于某些故障停止工作则需要记录错误日志。这些消息应该指明当前活动或操作(比如当前的 HTTP 请求),而不是应用程序范围的故障。举例: Cannot insert record due to duplicate key violation
Critical
当应用程序或系统崩溃、遇到灾难性故障,需要立即被关注时,应当记录关键级别的日志。举例:数据丢失、磁盘空间不够等。
应用举例:
[HttpGet]
public IEnumerable<TodoItem> GetAll()
{
_logger.LogInformation(LoggingEvents.LIST_ITEMS, "Listing all items");
EnsureItems();
return _todoRepository.GetAll();
}
[HttpGet("{id}", Name = "GetTodo")]
public IActionResult GetById(string id)
{
_logger.LogInformation(LoggingEvents.GET_ITEM, "Getting item {0}", id);
var item = _todoRepository.Find(id);
if (item == null)
{
_logger.LogWarning(LoggingEvents.GET_ITEM_NOTFOUND, "GetById({0}) NOT FOUND", id);
return NotFound();
}
return new ObjectResult(item);
}
可传递的参数:
string data 记录消息。
EventId eventId
使用数字类型的 id 来标记日志,这样可以将一系列的事件彼此相互关联。被记录的事件 ID 应该是静态的、特定于指定类型时间的。比如,你可能会把添加商品到购物车的事件 ID 标记为 1000,然后把结单的事件 ID 标记为 1001,以便能智能过滤并处理这些日志记录。
string format
日志消息的格式字符串。
object[] args
用于格式化的一组对象。
Exception error
用于记录的异常实例。
使用日志的建议
使用正确的 LogLevel ,这将使不同重要级别的日志消息使用和路由到相关的输出目标。
记录的日志信息要能立即识别问题所在,剔除不必要的冗余信息。
保证日志内容简单明了,直指重要信息。
尽管日志记录器被禁用后将不记录日志,但也请在日志方法的周围增加控制代码,以防止多余的方法调用和日志设置的开销,特别是在循环和对性能要求比较高的方法中。
使用独有的前缀命名日志记录器以确保能快速过滤或禁用。谨记 Create 扩展方法将创建的日志记录器使用该类的完全限定名作为日志记录器的类别名。
使用作用域时保持谨慎,明晰动作的开始和结束的界限(比如框架提供的 MVC Action 的范围),避免相互嵌套。
应用程序日志代码应关注应用程序 的业务。提高日志的详细程度级别来记录框架相关的问题,而不是日志记录器自己。