powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / свой LoggerProvider в ASP.Net Core приложении
3 сообщений из 28, страница 2 из 2
свой LoggerProvider в ASP.Net Core приложении
    #39907327
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser
- я хочу в слак писать сообщения ЛЮБОЙ категории, как захочу. так можно?
- я хочу чтобы в слак летели НЕ все сообщения определенной категории из всего приложения,
а только из тех мест кода, откуда я бы хотел получать информацию в слак. так можно?


вы резко изменили свои требования, изначально они звучали так

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


теперь вам уже не нужно _дополнить_, а вы хотите независимо от настроек журналирования слать чего-то там в слак.

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

если вас не устраивают возможности фильтрации коробочного решения, вы можете подключить другой логгер, с расширенными возможностями.
например, Serilog, который отлично интегрируется с ILogger от Microsoft,
в котором вы можете добавить фильтрацию какой угодно сложности:

https://github.com/serilog/serilog/wiki/Configuration-Basics#filters

для Serilog-а имеются и совсем продвинутые фильтры, на основе DSL

но, боюсь, с вашими постановками, это только всё ещё больше усложнит ))
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
свой LoggerProvider в ASP.Net Core приложении
    #40032062
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser,
у меня получилось сделать решение на троечку, но рабочее. В дальнейшем подумаю, как его допилить покрасивее, может комьюнити подскажет.
Опишу ситуацию, с которой столкнулся, по описанию она совпадет с твоей по моему мнению
В приложении нужно иметь логера-любимчика, который будет использоваться в конкретных случаях, которые будут явно указываться автором приложения.
У меня создается отдельный текстовый файл логов(slacklog.txt), куда я пишу эти конкретные вызовы логгера.
Есть текстовый файл для общего лога (log2.txt).
Есть текстовый файл логов, где я хочу видеть логи, которые произошли только в контроллерах(log.txt).
1)Создаем текстовые логгеры
Код: 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.
81.
82.
83.
84.
85.
86.
87.
88.
 //логгер для Slack-случаев
 public class SlackTextLogger : ILogger
    {
        public IDisposable BeginScope<TState>(TState state)
        {
            return null;
        }

        public bool IsEnabled(LogLevel logLevel)
        {
            return logLevel != LogLevel.None;
        }

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

            var logRecord = string.Format("{0} [{1}] {2} {3}", 
"[" + DateTimeOffset.UtcNow.ToString("yyyy-MM-dd HH:mm:ss+00:00") + "]", logLevel.ToString(), formatter(state, exception), exception != null ? exception.StackTrace : "");
            using (var streamWriter = new StreamWriter("slacklog.txt", true))
            {
             await   streamWriter.WriteLineAsync(logRecord);
            }
        }
    }

//Логгер для общих логов
 public class TextLogger2 : ILogger
    {
        public IDisposable BeginScope<TState>(TState state)
        {
            return null;
        }

        public bool IsEnabled(LogLevel logLevel)
        {
            return logLevel != LogLevel.None;
        }

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

            var logRecord = string.Format("{0} [{1}] {2} {3}", 
"[" + DateTimeOffset.UtcNow.ToString("yyyy-MM-dd HH:mm:ss+00:00") + "]", logLevel.ToString(), formatter(state, exception), exception != null ? exception.StackTrace : "");

            using (var streamWriter = new StreamWriter("log2.txt", true))
            {
             await   streamWriter.WriteLineAsync(logRecord);
            }
        }
    }

//Логирование информации, произошедшей в контроллерах
public class TextLogger : ILogger
    {
        public IDisposable BeginScope<TState>(TState state)
        {
            return null;
        }

        public bool IsEnabled(LogLevel logLevel)
        {
            return logLevel != LogLevel.None;
        }

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

            var logRecord = string.Format("{0} [{1}] {2} {3}",
 "[" + DateTimeOffset.UtcNow.ToString("yyyy-MM-dd HH:mm:ss+00:00") + "]", logLevel.ToString(), formatter(state, exception), exception != null ? exception.StackTrace : "");

            using (var streamWriter = new StreamWriter("log.txt", true))
            {
             await   streamWriter.WriteLineAsync(logRecord);
            }
        }
    }


Делаем логгер-провайдер, который будет выбирать, какой из них использовать в зависимости от значения категории
Код: 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.
 public class TextLoggerProvider : ILoggerProvider
    {
        public TextLoggerProvider()
        {
           
        }
        public ILogger CreateLogger(string categoryName)
        {
            if (categoryName.ToUpper().Contains("CONTROLLERS"))
            {
                return new TextLogger();
            }

            if (categoryName.ToUpper().Contains("SLACK"))
            {
                return new SlackTextLogger();
            }

            return new TextLogger2();//здесь бы использовать дефолтный логгер для приложения, 
//но как я понял такового понятия для приложения не существует, или же вообще ничего не возвращать, но так не прокатывает
         
        }

        public void Dispose(){}
    }



Регистрируем логгеры в сервисах(ConfigureServices)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 services.AddLogging(logging=> 
            {
                logging
                .ClearProviders()
                .AddConsole() //добавляем дефолтный логгер
                .AddProvider(new TextLoggerProvider())
                .AddFilter((provider, category, logLevel) =>
                {
                    //запрещаем дефолтному логгеру(консольному) принимать сообщения 
                    if (provider == "Microsoft.Extensions.Logging.Console.ConsoleLoggerProvider"
                    && (category.ToUpper().Contains("CONTROLLER") || category.ToUpper().Contains("SLACK")))
                        return false;

                    if (category.ToUpper().Contains("CONTROLLER") || category.ToUpper().Contains("SLACK"))
                        return true;
                    return false;
                });             
            });


Не знаю почему, но когда вызываем Logger.LogInformation("..."), то и ConsoleLogger их публикует и TextLoggerProvider, поэтому приходится ставить жесткую заглушку- хотелось бы переделать этот момент, если кто в курсе как подскажите плиз.
Создаем пустой класс-заглушку для категории, потому что просто строку использовать нельзя
Код: c#
1.
  public class SlackCategory{ }


В контроллере, где хотим использовать логгеры инжектим их.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        private readonly ILogger<CommitController> _logger;
        private readonly ILogger<SlackCategory> _slackLogger;

        public CommitController(
            ILogger<CommitController> logger,
            ILogger<SlackCategory> slackLogger)
        {
            _logger = logger;
            _slackLogger = slackLogger;
        }



В том месте, где хотим кинуть лог в конкретный файл вызываем их
Код: c#
1.
2.
 _slackLogger.LogInformation("im from SlackLogger"); //лог запишется в slacklog.txt
 _logger.LogInformation("default controller Logger"); //лог запишется в log.txt
...
Рейтинг: 0 / 0
3 сообщений из 28, страница 2 из 2
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / свой LoggerProvider в ASP.Net Core приложении
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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