Я написал несколько веб-API в .net core 2.0 и развернул его с помощью контейнера докеров внутри кластера Kubernetes. Я использую приведенную ниже конфигурацию ведения журнала, но не вижу никаких журналов внутри консоли модуля Kubernetes. Я что-то здесь упустил ?:
Раздел журнала в appsettings.json и appsettings.Development.json
{
"Logging": {
"IncludeScopes": true,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
},
"Console": {
"LogLevel": {
"Default": "Information",
"System": "Information",
"Microsoft": "Information"
}
}
}
}
Внутри Program.cs:
public static IWebHost BuildWebHost(string[] args)
{
return new WebHostBuilder()
.UseKestrel()
.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
if (env.IsDevelopment())
{
var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
if (appAssembly != null)
{
config.AddUserSecrets(appAssembly, optional: true);
}
}
config.AddEnvironmentVariables();
if (args != null)
{
config.AddCommandLine(args);
}
})
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
})
.UseDefaultServiceProvider((context, options) =>
{
options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
})
.UseStartup<Startup>()
.Build();
}
Пример входа в другие классы:
_logger.LogInformation("This log should go in kubernetes pod console");
Я сталкиваюсь с тем же. Похоже, что ILogger не перейдет в Kubernetes STDOUT, где он будет отображаться в механизмах ведения журнала k8s. Для меня это контейнер Linux Ubuntu.
Можно ли получать журналы при локальном запуске контейнера? Например. docker run <image> и docker logs <container>?
Я не могу воспроизвести это, используя тот же самый код, что и опубликованный выше, с .netcore 2.1 / minikube. Есть ли воспроизводимый образец кода для исследования?





Вы пытались вместо этого использовать стандартные сторонние пакеты, построенные для мощного ведения журнала? Это может удовлетворить ваши потребности! В приведенном ниже коде показано, как Serilog внедряется в Program.cs и может использоваться для вывода его журналов через несколько каналов по вашему выбору (я лично использую minikube локально на macOS вместе с промежуточной средой на GCP).
WebHost.CreateDefaultBuilder(args)
.UseSerilog((context, configuration) =>
{
configuration
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.MinimumLevel.Override("System", LogEventLevel.Warning)
.MinimumLevel.Override("Microsoft.AspNetCore.Authentication", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console(
outputTemplate:
"[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}{NewLine}",
theme: AnsiConsoleTheme.Literate);
})
Желаемый результат из приведенного выше будет выглядеть примерно так в Kubernetes:
xxxxx@iMac ~/Projects/xxxxx xxxxbranch/xxx-xxx kubectl logs xxxx-xxxx-6b9dd8dc67-vc9ch
[2020-08-04 12:11:37 Warning] Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository
Storing keys in a directory '/xxxxxxxxx/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
[2020-08-04 12:11:37 Warning] Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager
No XML encryptor configured. Key {xxxxxx} may be persisted to storage in unencrypted form.
[2020-08-04 12:11:37 Warning] Microsoft.AspNetCore.Server.Kestrel
Overriding address(es) 'https://+:8081'. Binding to endpoints defined in UseKestrel() instead.
Hosting environment: Production
Content root path: /app
Now listening on: https://0.0.0.0:8081
Application started. Press Ctrl+C to shut down.
Эти выходные данные также хранятся в панели управления журналов Google Cloud.
Вы сталкиваетесь с проблемами при запуске кода в режиме отладки Visual Studio?