Ведение журнала AspNet Core работает, но не внутри служб ServiceStack при размещении в Azure

У меня есть простая служба 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

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

Я получаю прекрасные журналы, если добавлю их в свой StartUp. Однако ведение журнала в службе 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()
            };
        }

person richardb    schedule 16.01.2019    source источник


Ответы (2)


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

person richardb    schedule 17.01.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));
person mythz    schedule 16.01.2019
comment
Спасибо. Пробовал так и безуспешно. Получение большого количества других журналов, чтобы я мог видеть отладку аутентификации, вызываемые контроллеры и даже sql-структуру сущности. Только не те, которые вручную регистрируют запросы. Я получаю записи, которые регистрируются, если выполняются локально на моем ПК. Нажмите на Azure, и они не появятся. Такое ощущение, что он не подхватывает какой-либо файл конфигурации, как будто он каким-то образом не передается в SS. - person richardb; 16.01.2019
comment
Можете ли вы узнать, что такое имя типа регистратора? - person mythz; 16.01.2019