Как вести журнал без добавления строки для каждого метода - PullRequest
1 голос
/ 17 апреля 2020

У меня есть C# проект веб-API, в основном мне нужно регистрироваться каждый раз, когда вызывается метод (ie. Имя метода, переданные параметры, результат, отслеживание стека (если произошла ошибка) и т. Д. c).

Прямо сейчас я сделал это, добавив несколько строк в каждый метод, и это выглядит раздутым, есть ли более эффективный способ добиться этого?

Любая помощь будет оценена.

Спасибо

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Промежуточное программное обеспечение является одним из подходов, или вы также можете создать Фильтр, который позволит вам выполнять операции «до» и «после»,

https://www.tutorialsteacher.com/webapi/web-api-filters

[ Код по вышеуказанной ссылке]

public class LogDemoAttribute : Attribute, IActionFilter
{
    public LogDemoAttribute()
    {

    }

    public Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
    {
        Trace.WriteLine(string.Format("Action Method {0} executing at {1}", actionContext.ActionDescriptor.ActionName, DateTime.Now.ToShortDateString()), "Web API Logs");

        var result = continuation();

        result.Wait();

        Trace.WriteLine(string.Format("Action Method {0} executed at {1}", actionContext.ActionDescriptor.ActionName, DateTime.Now.ToShortDateString()), "Web API Logs");

        return result;
    }

    public bool AllowMultiple
    {
        get { return true; }
    }
} 

Это позволяет вам добавлять в глобальные фильтры (в этом случае вы также можете использовать промежуточное программное обеспечение) или добавлять его выборочно в определенные конечные точки, например,

[ApiController]
public class PeopleController : ControllerBase 
{ 
    [LogDemo]
    [HttpGet("demo/endpoint")] 
    public IActionResult GetAll()
    {
    }
}

Это имеет то преимущество, что вы можете захотеть передать некоторые параметры атрибуту, что позволит вам выполнять определенные контекстные действия c.

Если вы хотите добавить ведение журнала в не- код контроллера, то вы можете продолжить этот подход к шаблону Aspect Orientated / Decorator.

https://docs.microsoft.com/en-us/archive/msdn-magazine/2014/february/aspect-oriented-programming-aspect-oriented-programming-with-the-realproxy-class

Я обычно нахожу параметры регистрации на уровне контроллера хорошими достаточно, и что-то вроде Application Insights, который генерирует телеметрию, которая показывает вам, как выглядит запрос, на самом деле является полезной информацией.

0 голосов
/ 17 апреля 2020

Когда вы говорите «метод», я не уверен, имеете ли вы в виду буквально каждый метод или просто всякий раз, когда поражается контроллер. Но промежуточное программное обеспечение, вероятно, будет способом к go. Документация по добавлению пользовательского промежуточного программного обеспечения находится здесь: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/write?view=aspnetcore-3.1 И вот пример промежуточного программного обеспечения для обработки ошибок, в котором вы можете разместить свою регистрацию: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-3.1

...