C# 为api控制器自动记录消息

C# 为api控制器自动记录消息,c#,entity-framework-core,asp.net-core-3.1,C#,Entity Framework Core,Asp.net Core 3.1,在我的实体框架核心项目中,我有以下控制器方法 我刚刚开始学习.NetCore日志,我喜欢它 然而,我有一种感觉,将日志记录附加到我的所有控制器可能会变得困难 目前,我的项目有相当多的控制器用于各种端点 我开始添加日志代码,我担心我可能会使它变得比需要的更困难 因此,我注入记录器,然后创建一些字符串,如Message,Controller,和ErrorMessage 然后根据需要将值分配给控制器方法内部的值 我想知道是否有一种方法可以以更自动化的方式来实现这一点,而不是对每个控制器方法都进行手动操

在我的实体框架核心项目中,我有以下控制器方法

我刚刚开始学习.NetCore日志,我喜欢它

然而,我有一种感觉,将日志记录附加到我的所有控制器可能会变得困难

目前,我的项目有相当多的控制器用于各种端点

我开始添加日志代码,我担心我可能会使它变得比需要的更困难

因此,我注入记录器,然后创建一些字符串,如
Message
Controller
,和
ErrorMessage

然后根据需要将值分配给控制器方法内部的值

我想知道是否有一种方法可以以更自动化的方式来实现这一点,而不是对每个控制器方法都进行手动操作

不幸的是,我无法创建基类,因为我的控制器需要使用
ControllerBase

[Route("api/[controller]")]
[ApiController]
public class PetrolStationController : ControllerBase
{
    private readonly petrol_ProdContext _context;
    private readonly ILogger _logger;

    public PetrolStationController(petrol_ProdContext context, ILogger<PetrolStationController> logger)
    {
        _context = context;
        _stationService = stationService;
        _logger = logger;
    }

    public string Message { get; set; }
    public string Controller { get; set; }
    public string ErrorMessage { get; set; }

    [HttpGet("GetStationNodeObject/{stationId}")]
    public async Task<ActionResult<StationList>> GetStationLocation(Guid stationID)
    {
        Controller = this.GetType().Name.ToString();

        var stationList = await _context.StationList.FindAsync(stationID);

        if (stationList == null)
        {
            ErrorMessage = "stationID does not exist";
            Message = $"Endpoint: {Controller}: {DateTime.UtcNow.ToLongTimeString()} => {ErrorMessage}";
            _logger.LogInformation(Message);
            return NotFound();
        }

        var petrolStation = await _stationService.GetStationLocation(stationID);
        Message = $"Endpoint: {Controller}: {DateTime.UtcNow.ToLongTimeString()}, Success!";
        _logger.LogInformation(Message);

        return petrolStation;
    }
}
[路由(“api/[控制器]”)]
[ApiController]
公共类PetrolStationController:ControllerBase
{
私有只读汽油机\u产品上下文\u上下文;
专用只读ILogger\u记录器;
公共PetrolStationController(汽油机产品上下文,ILogger记录器)
{
_上下文=上下文;
_stationService=stationService;
_记录器=记录器;
}
公共字符串消息{get;set;}
公共字符串控制器{get;set;}
公共字符串错误消息{get;set;}
[HttpGet(“GetStationNodeObject/{stationId}”)]
公共异步任务GetStationLocation(Guid stationID)
{
控制器=this.GetType().Name.ToString();
var stationList=wait_context.stationList.FindAsync(stationID);
如果(stationList==null)
{
ErrorMessage=“stationID不存在”;
Message=$“端点:{Controller}:{DateTime.UtcNow.ToLongTimeString()}=>{ErrorMessage}”;
_logger.LogInformation(消息);
返回NotFound();
}
var petrolStation=await_stationService.GetStationLocation(stationID);
Message=$“端点:{Controller}:{DateTime.UtcNow.ToLongTimeString()},成功!”;
_logger.LogInformation(消息);
返岩沉积;
}
}
我希望有人能提供一些见解,以便更好地做到这一点

谢谢大家查看本教程:


我经常使用这种方法。这将自动记录所有异常,如果您需要更多异常,可以轻松地将其添加到控制器中。最大的优点是你们在一个地方设置了所有东西,你们得到了统一的日志格式。您可以使用日志服务器或文件来保存日志。

这看起来不错,但我仍然看到它们正在控制器中写入消息,并且它们显示了
HomeController
的示例。因此,我仍然需要向我的所有控制器添加这样的日志代码。如果您希望记录一些其他信息,是的,您需要向控制器添加一些代码,但是如果您需要错误和警告,这些将被自动捕获和记录。我在多个项目中使用它,从来不用在控制器中编写一行代码。嗯,是的,它是一个
Guid
:)是的,在这个工作项目中,它是一个Guid,所以当我为我的哑巴游戏键入代码时,从记忆中我记忆犹新:)