AspNet Core Logging работает, но не внутри сервисов ServiceStack, когда размещается в Azure - PullRequest
0 голосов
/ 16 января 2019

У меня есть простой сервис ServiceStack с добавлением некоторых журналов.

log.Info("In Vehicle service request");
if (log.IsDebugEnabled)
    log.Debug("Debugging Vehicle service request");

log определяется в базовом классе следующим образом:

public abstract class ServiceBase : Service
{
    public static readonly ILog log = LogManager.GetLogger(typeof(ServiceBase));
}

Веб-хост настроен для добавления различных провайдеров журналов, включая log4net (ПРИМЕЧАНИЕ. Я пробовал другие = та же проблема).

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((context, config) =>
                {
                    config.SetBasePath(Directory.GetCurrentDirectory());
                    config
                        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                        .AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true)
                        .AddEnvironmentVariables();     //lets Azure portal override settings
                    context.Configuration = config.Build();
                })
                .ConfigureLogging((hostingContext, logging) =>
                {
                    logging.ClearProviders();
                    logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                    logging.AddConsole();
                    logging.AddDebug();
                    logging.AddEventSourceLogger();
                    logging.AddAzureWebAppDiagnostics();
                    // The ILoggingBuilder minimum level determines the
                    // the lowest possible level for logging. The log4net
                    // level then sets the level that we actually log at.
                    logging.AddLog4Net();
                    //logging.SetMinimumLevel(LogLevel.Debug);
                })
                .UseAzureAppServices()
                .UseStartup<Startup>();

ServiceStack AppHost заранее устанавливает LogFactory следующим образом:

public override void Configure(Container container)
{
    //Also runs log4net.Config.XmlConfigurator.Configure()
    LogManager.LogFactory = new Log4NetFactory(configureLog4Net: true);
..etc

Что происходит?

Я получаю прекрасное ведение журнала, если добавляю их в свой автозапуск. Однако регистрация в службе ServiceStack не отображается при размещении в Azure. Я получаю логирование при локальном запуске.

Итак, NetCore регистрируется нормально, но все в классе Service - нет!

Почему бы не войти с этим?

public async Task<GetMyDataResponse> Any(GetMyData request)
        {
            log.Info("In service request");
            if (log.IsDebugEnabled)
                log.Debug("Debugging service request");

            //Some request validation logic could/should go here.
            return new GetMyDataResponse
            {
                Results = await _myDataRepo.FetchAsync()
            };
        }

Ответы [ 2 ]

0 голосов
/ 17 января 2019

В конце концов это была глупая проблема маршрутизации, которая соответствовала методу в контроллере, а не попадала в маршрут ServiceStack, как определено в модели интерфейса. Метод, который я оставил при тестировании.

0 голосов
/ 16 января 2019

Попробуйте настроить LogFactory до инициализации ServiceStack, например:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    LogManager.LogFactory = new Log4NetFactory(configureLog4Net: true);

    app.UseServiceStack(new AppHost
    {
        AppSettings = new NetCoreAppSettings(Configuration)
    });
}

Или используйте регистратор экземпляров в своих Сервисах:

public readonly ILog log = LogManager.GetLogger(typeof(ServiceBase));
...