powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / свой LoggerProvider в ASP.Net Core приложении
25 сообщений из 28, страница 1 из 2
свой LoggerProvider в ASP.Net Core приложении
    #39904199
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги!

Хочу дополнить логгирование в проекте возможностью отсылки некоторых сообщений в канал Slack.
Сервис отсылки в Slack работает. Я могу отослать сообщение в Slack.

Создаю класс логгера и проавайдера вот так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
    /// <summary>
    /// Slack Logger
    /// </summary>
    public class SlackLogger : ILogger
    {
        readonly ISlackService _slackService;

        public SlackLogger([FromServices] ISlackService slackService)
        {
            _slackService = slackService;
        }


        public async void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
        {
            if (IsEnabled(logLevel))
            {
                var msg = formatter(state, exception);

                 await _slackService.SendMessageAsync(msg);
            }
        }

        public IDisposable BeginScope<TState>(TState state)
        {
            return null;
        }

        public bool IsEnabled(LogLevel logLevel)
        {
            switch (logLevel)
            {
                case LogLevel.Trace:
                    break;
                case LogLevel.Debug:
                    break;
                case LogLevel.Information:
                    break;
                case LogLevel.Warning:
                    break;
                case LogLevel.Error:
                    break;
                case LogLevel.Critical:
                    break;
                case LogLevel.None:
                    break;
                default:
                    break;
            }
            return true;
        }


    }




    /// <summary>
    /// Logger Provider
    /// </summary>
    public class LoggerSlackProvider : ILoggerProvider
    {
        readonly ISlackService _slackService;

        public LoggerSlackProvider(ISlackService slackService)
        {
            _slackService = slackService;
        }

        public ILogger CreateLogger(string categoryName)
        {
            return new SlackLogger(_slackService);
        }

        public void Dispose()
        {
            //throw new NotImplementedException();
        }
    }



В Startup добавляю провайдер так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    public class Startup
    {
      .....

        public void Configure(IApplicationBuilder app, ILogger<Startup> logger,
            IServiceProvider serviceProvider, ILoggerFactory loggerFactory, ISlackService slackService)
        {
              ......................

            // add Slack Logger
            loggerFactory.AddProvider(new LoggerSlackProvider(slackService));
        }

     }



После этого ВСЕ логи начинают валиться в Slack,
а я хочу, чтобы ТОЛЬКО ТЕ, что мне НУЖНЫ были там, а все остальное осталось без изменений.


Что я сделал неправильно?
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39904230
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интерсный подход в функции IsEnabled
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39904236
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Интерсный подход в функции IsEnabled
Вероятно, автор думает, что break прерывает метод, а не switch, и возвращает default(bool)
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39904240
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
Ролг Хупин
Интерсный подход в функции IsEnabled
Вероятно, автор думает, что break прерывает метод, а не switch, и возвращает default(bool)


автор ничего не думает.
это пока заглушка.
не обращайте на IsEnabled внимание.
там всегда будет true и этого пока достаточно
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39904269
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем пока картина такая:
- по умолчанию логи обрабатывает последний зарегистрированный в LoggerFactory провайдер (и это мой провайдер)
- а мне бы хотелось, чтобы ничего не ломая, что было написано ранее,
просто добавить еще одну возможность логгирования.

так возможно?
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39904270
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser
ТОЛЬКО ТЕ, что мне НУЖНЫ были
RegisteredUser
это пока заглушка.
там всегда будет true
RegisteredUser
Что я сделал неправильно?
Не понимаю тогда, а что ты сделал для того, чтобы фильтровать?

Вообще, фильтрация по LogLevel делается на уровне настройки провайдера, а не внутри логгера.
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39904273
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser
по умолчанию логи обрабатывает последний зарегистрированный в LoggerFactory провайдер
?

https://docs.microsoft.com/ru-ru/aspnet/core/fundamentals/logging/?view=aspnetcore-3.1
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39904505
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39904519
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
RegisteredUser
ТОЛЬКО ТЕ, что мне НУЖНЫ были
RegisteredUser
это пока заглушка.
там всегда будет true
RegisteredUser
Что я сделал неправильно?
Не понимаю тогда, а что ты сделал для того, чтобы фильтровать?

Вообще, фильтрация по LogLevel делается на уровне настройки провайдера, а не внутри логгера.


Предлагаю считать, что IsEnabled имеет вот такое наполнение
Код: c#
1.
2.
3.
4.
        public bool IsEnabled(LogLevel logLevel)
        {
              return true;
        }
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39904532
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вопрос-то тогда какой?
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39904545
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
А вопрос-то тогда какой?


Вопрос такой:
- сейчас в проекте работает логгирование и я хочу оставить его так, как оно сейчас работает
- я хочу добавить в проект свое логгирование в Slack
- эти логгирования должны работать одновременно.
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39904555
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я дал ссылку на документацию по логированию в Core
Что сделано в соответствии с этой документацией, что работает не так, как ожидалось?
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39904591
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего автор имеет ввиду оставить дефолтный коровский логгер, а в контроллере дополнительно логировать определенные события в дополнительный логгер. Например info-сообщения логируем в один текстовый файл, errors- в другой. Но при этом, по дефолту настроенный ASP Core логгер также пишет сообщения в консоль.
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39904604
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Скорее всего автор имеет ввиду оставить дефолтный коровский логгер, а в контроллере дополнительно логировать определенные события в дополнительный логгер. Например info-сообщения логируем в один текстовый файл, errors- в другой. Но при этом, по дефолту настроенный ASP Core логгер также пишет сообщения в консоль.
тогда AddProvider нафиг не нужен, только и всего.

Но пока автор не расшифровал, что он понимает под
RegisteredUser
ТЕ, что мне НУЖНЫ
можно долго гадать.
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39904755
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub
Скорее всего автор имеет ввиду оставить дефолтный коровский логгер, а в контроллере дополнительно логировать определенные события в дополнительный логгер.

именно так!

А мой логгер должен писать в Slack. Всё!
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39904758
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда зачем тебе вообще нужна реализация ILogger? Для универсальности только.
Просто добавляешь свой сервис логирования и пробрасываешь в нужные контроллеры параллельно с штатным логгером


P.S. vb_sub, тебе орден хрустального шара!
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39904822
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Скорее всего автор имеет ввиду оставить дефолтный коровский логгер, а в контроллере дополнительно логировать определенные события в дополнительный логгер. Например info-сообщения логируем в один текстовый файл, errors- в другой. Но при этом, по дефолту настроенный ASP Core логгер также пишет сообщения в консоль.

Это абсолютно неправильный подход. Сама суть использования всевозможных провайдеров в том, что ты всегда и все пишешь в один и тот же единственный ILogger, а на уровне конфигурации разруливаешь что конкретно куда писать.
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39904832
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Это абсолютно неправильный подход. Сама суть использования всевозможных провайдеров в том, что ты всегда и все пишешь в один и тот же единственный ILogger, а на уровне конфигурации разруливаешь что конкретно куда писать.
В принципе, можно фильтрацию использовать.... но ссылку я уже давал
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39904845
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Ну тогда зачем тебе вообще нужна реализация ILogger? Для универсальности только.
Просто добавляешь свой сервис логирования и пробрасываешь в нужные контроллеры параллельно с штатным логгером


P.S. vb_sub, тебе орден хрустального шара!


Пробрасывать два логгера в контроллер как-то зашкварно, отловить бы в какой логгер кидать сообщения на более высоком уровне.
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39905103
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser
Что я сделал неправильно?


Неправильно поставили задачу.

Ваша задача сводится к фильтрации.
Вместо этого вы _заменили_ дефолтный логгер.
Непонятно зачем вы это сделали.

Вам нужно добавить провайдер слака, вот этот например https://github.com/imperugo/Microsoft.Extensions.Logging.Slack

и настроить фильтрацию, как описано здесь https://docs.microsoft.com/ru-ru/aspnet/core/fundamentals/logging/?view=aspnetcore-3.1#log-filtering

можете в слак писать только сообщения определённой категории
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39905104
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Shocker.Pro
Ну тогда зачем тебе вообще нужна реализация ILogger? Для универсальности только.
Просто добавляешь свой сервис логирования и пробрасываешь в нужные контроллеры параллельно с штатным логгером


P.S. vb_sub, тебе орден хрустального шара!


Пробрасывать два логгера в контроллер как-то зашкварно, отловить бы в какой логгер кидать сообщения на более высоком уровне.


хернёй страдаете.
из коробки есть гибкая фильтрация по уровню журнала, по категории
пишите чё хотите, куда хотите, всё через один единственный логгер
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39906475
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем я сделал так (ILogger Extension):

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
    
using MyGlobal.Extensions
{
public static class CommonExtensions
{
        public async static void LogSlack(this ILogger logger, string message, ISlackService slackService, LogLevel logLevel = LogLevel.Information)
        {

            if (slackService != null)
            {
                var msg = $"{DateTime.Now} ( {Enum.GetName(typeof(LogLevel), logLevel)} ): {message}";

                try
                {
                    var result = await slackService.SendMessageAsync(msg);
                }
                catch (Exception ex)
                {
                    ...
                }
            }

        }

}
}



единственное, что мне тут не нравится, так это необходимость передачи параметром ISlackService slackService.
т.к. DI в static метод, судя по ответам гугла, это какой-то гимор/антипаттерн/фу-фу-фу .
ладно, буду пока его передавать, а дальше посмотрим.


использую в контроллере так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
using MyGlobal.Extensions;

        readonly ILogger<DevController> _logger;

        public DevController(ILogger<DevController> logger)
        {
            _logger = logger;
        }
        [HttpPost]
        public async Task<PipeResponse> GetImages(string token, string alias, [FromServices] ISlackService slackService)
        {
            _logger.LogSlack("Test msg", slackService);
            _logger.LogSlack("Test msg Critical", slackService, LogLevel.Critical);
            _logger.LogSlack("Test msg Error", slackService, LogLevel.Error);
            _logger.LogSlack("Test msg Warning", slackService, LogLevel.Warning);
           ...
           _logger.LogWarning($"warning");
            return resp;
        }
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39906584
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser,

чёт это какой-то полный пи...ц

написал же как сделать по уму.
что за чудовище вы изобрели? зачем? ))
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39906831
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тебе hVostt написал как сделать
я по привычки когда скинул ссылки забыл что логер от мс тоже стал приличным
у тебя точка входа для логов не должна знать куда и что идет. это разруливается на уровне конфигурирования логера
...
Рейтинг: 0 / 0
свой LoggerProvider в ASP.Net Core приложении
    #39906952
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt
RegisteredUser
Что я сделал неправильно?


...

и настроить фильтрацию, как описано здесь https://docs.microsoft.com/ru-ru/aspnet/core/fundamentals/logging/?view=aspnetcore-3.1#log-filtering

можете в слак писать только сообщения определённой категории


- я хочу в слак писать сообщения ЛЮБОЙ категории, как захочу. так можно?
- я хочу чтобы в слак летели НЕ все сообщения определенной категории из всего приложения,
а только из тех мест кода, откуда я бы хотел получать информацию в слак. так можно?
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / свой LoggerProvider в ASP.Net Core приложении
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]