170 похожих чатов

Привет всем, есть программа которая работает на CLI версии и GUI,

вообщем есть хост в котором прокидываются все нужные сервисы с помощью autofac, есть логирование с Serilog, CLI версия соотвественно может выводить информацию на консоль и при этом в файл, это не была большая проблема был добавлен каллбек когда конфигурирется этот Serilog и там просто добавляется запись в консоль (WriteTo.Console()) в CLI версии. Так вот нужно прокинуть Serilog так чтобы GUI версия которая работает на MAUI Blazor логировала в специальное окно в Blazor`e (логи могут прийти откуда угодно, по дефолту в хосте регистрируется лог в файл) (то есть нужно как-то все прокинуть, при этом вывести что записалось в логах на специальной страничке в Blazor например в TextArea)

Есть вариант написать свою реализацию для логирование и как экстенш метод запускать с serilog WriteTo.CustomGUILogging(), но это не то что нужно

Есть идеи?

Хост
public class BitMonoApplication : IApplication
{
private readonly ContainerBuilder m_ContainerBuilder;
private readonly List<IModule> m_Modules;

public BitMonoApplication()
{
m_ContainerBuilder = new ContainerBuilder();
m_Modules = new List<IModule>();
}


public IApplication Populate(ICollection<ServiceDescriptor> descriptors)
{
m_ContainerBuilder.Populate(descriptors);
return this;
}
public IApplication RegisterModule(IModule module)
{
m_Modules.Add(module);
return this;
}
public AutofacServiceProvider Build()
{
foreach (var module in m_Modules)
{
m_ContainerBuilder.RegisterModule(module);
}
var container = m_ContainerBuilder.Build();
return new AutofacServiceProvider(container.Resolve<ILifetimeScope>());
}
}

Модуль для Хоста
public class BitMonoModule : Module
{
private readonly Action<LoggerConfiguration> m_ConfigureLogger;
private readonly Action<ConfigurationBuilder> m_ConfigureConfiguration;

public BitMonoModule(
Action<LoggerConfiguration> configureLogger = default,
Action<ConfigurationBuilder> configureConfiguration = default)
{
m_ConfigureLogger = configureLogger;
m_ConfigureConfiguration = configureConfiguration;
}


protected override void Load(ContainerBuilder containerBuilder)
{
var currentAssemblyDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
var file = Path.Combine(currentAssemblyDirectory, "logs", "bitMono-{HalfHour}.log");

containerBuilder.Register<ILogger>((_, _) =>
{
var loggerConfiguration = new LoggerConfiguration();
m_ConfigureLogger?.Invoke(loggerConfiguration);

return loggerConfiguration
.WriteTo.Async((c) =>
{
c.RollingFile(file, shared: true);
})
.CreateLogger();
});
}
}

CLI:
var container = new BitMonoApplication().RegisterModule(new BitMonoModule(configureLogger =>
{
configureLogger.WriteTo.Async(configureSinkConfiguration =>
{
configureSinkConfiguration.Console();
});
})).Build();

GUI:
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
});
builder.ConfigureContainer(new AutofacServiceProviderFactory(), configure =>
{
configure.RegisterModule(new BitMonoModule(configureLogger =>
{
// Логирование для GUI
}));
});

5 ответов

9 просмотров

Почему вариант с экстеншином не подходит?

Пользователь-641a4 Автор вопроса
Vitalii Shmidt zxc ghoul
Почему вариант с экстеншином не подходит?

Придётся создавать кастомный логгер и это дополнительная поддержка и расширение системы, а задача в том что в хосте уже регистрируется логирование в файл (для удобства чтобы это не дублировать в CLI и GUI), в CLI просто происходит конфигурация логгера при инициализации модуля, добавляется WriteTo.Console, теперь тоже самое с GUI будет страничка в blazor и нужно поймать эти все логи и при этом учитывать что могут быть логи ещё другие не только от уже зарегистрированного лога в файл в хосте, а в самой GUI может так же появится новый логгер

Пользователь 641a4
Придётся создавать кастомный логгер и это дополнит...

ну я первое, о чем подумал — создать сервис, который будет "слушать" файл и при модификации файла, отправлять это на твою страничку в блейзоре

Пользователь 641a4
Мм прикольная идея

ааа, не уверен, мне твоя с экстеншином больше нравится, но если рил говоришь, что там траблы, то такое может тоже сгодиться

Похожие вопросы

Обсуждают сегодня

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
70
Здравствуйте. Задача состоит в том, чтобы сделать real-time чат в мобильном приложении. После передачи сообщения пользователем через веб-сокеты, для основного и долговременног...
🐾
5
Всем доброго дня, ребят подскажите пожалуйста, если в курсе по ассемблеру используется MASM32, могу ли я использовать FASM? В чем явная разница и будет ли у меня все работать?
Botsman
17
Хотел бы спросить у знающих, правильную ли я выбрал книгу для начала изучения ассемблера Юрова В.И ? Или есть более лучшие книги для начала обучения?
Botsman
25
Книга Юрова В.И пойдёт для обучения?
Botsman
24
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
Люди добрые, помогите с идеями, потому что свои закончились. У клиента падает софтина в момент инициализации модуля OtlEventMonitor на RegisterWindowMessage('Gp/OtlTaskEvents/...
Михаил Усков
7
Тут просто дело в том, что я не могу сейчас дать такие подробности из за того что рассчитать это всё нереально. Этого проекта который я хочу сделать ещё даже не существует) И ...
🐾
8
> Примечательно, что новый владелец удаляет из GitHub любые жалобы, указывающие на подозрительную активность или смену владельца, и, видимо, рассчитывает на то, что пользовате...
Alex Sherbakov
2
GridView fully ignored first parent(SizedBox), and take width from second parent(Container). How can I constrain GridView by first parent? Widget build(BuildContext context) {...
Hamster
1
Карта сайта