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

Хочу дополнить логгирование в проекте возможностью отсылки некоторых сообщений в канал 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
17.12.2019, 17:16
    #39904230
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
свой LoggerProvider в ASP.Net Core приложении
Интерсный подход в функции IsEnabled
...
Рейтинг: 0 / 0
17.12.2019, 17:22
    #39904236
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
свой LoggerProvider в ASP.Net Core приложении
Ролг Хупин
Интерсный подход в функции IsEnabled
Вероятно, автор думает, что break прерывает метод, а не switch, и возвращает default(bool)
...
Рейтинг: 0 / 0
17.12.2019, 17:24
    #39904240
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
свой LoggerProvider в ASP.Net Core приложении
Shocker.Pro
Ролг Хупин
Интерсный подход в функции IsEnabled
Вероятно, автор думает, что break прерывает метод, а не switch, и возвращает default(bool)


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

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

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

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

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


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


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

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

именно так!

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


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

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


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


Пробрасывать два логгера в контроллер как-то зашкварно, отловить бы в какой логгер кидать сообщения на более высоком уровне.
...
Рейтинг: 0 / 0
18.12.2019, 21:46
    #39905103
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
свой LoggerProvider в ASP.Net Core приложении
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
18.12.2019, 21:48
    #39905104
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
свой LoggerProvider в ASP.Net Core приложении
vb_sub
Shocker.Pro
Ну тогда зачем тебе вообще нужна реализация ILogger? Для универсальности только.
Просто добавляешь свой сервис логирования и пробрасываешь в нужные контроллеры параллельно с штатным логгером


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


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


хернёй страдаете.
из коробки есть гибкая фильтрация по уровню журнала, по категории
пишите чё хотите, куда хотите, всё через один единственный логгер
...
Рейтинг: 0 / 0
21.12.2019, 13:49
    #39906475
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
свой LoggerProvider в ASP.Net Core приложении
В общем я сделал так (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
21.12.2019, 22:05
    #39906584
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
свой LoggerProvider в ASP.Net Core приложении
RegisteredUser,

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

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


...

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

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


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


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