ASP.NET 核心 Azure WebJob 未记录到 Azure 存储
ASP.NET Core Azure WebJob not logging to Azure Storage
以前,当我在 .NET 中创建 Azure webjobs 时,它会自动将日志记录配置到 Azure 存储上路径 /azure-webjobs-hosts/output-logs/.txt 上的文本文件。但是,现在当我使用 .NET Core 和 3.0.14 版的 Webjobs SDK 时,默认情况下它不再具有此行为。
登录到控制台和 Application Insights 与我当前的设置配合得很好,但是我确实希望通过绑定的 ILogger 将文本文件登录到 Azure 存储。我已经按照有关如何配置它的官方指南进行操作,但它都指向存储队列,我不确定这是一个好的方法以及如何调整它。
配置代码:
static async Task Main(string[] args)
{
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
builder.UseEnvironment("development");
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddAzureStorage();
});
builder.ConfigureLogging((context, b) =>
{
b.AddConsole();
string instrumentationKey = context.Configuration["ApplicationInsightsKey"];
if (!string.IsNullOrEmpty(instrumentationKey))
{
b.AddApplicationInsightsWebJobs(o => o.InstrumentationKey = instrumentationKey);
}
});
builder.ConfigureServices(s => s.AddSingleton<IConfigurationRoot>(config));
var host = builder.Build();
using (host)
{
var jobHost = host.Services.GetService(typeof(IJobHost)) as JobHost;
await host.StartAsync();
await jobHost.CallAsync("Run");
await host.StopAsync();
}
}
职位代码:
[NoAutomaticTrigger]
public async Task Run(ILogger logger)
{
logger.LogInformation("I want this text in console as well as on Azure Storage");
// ..logic
}
如果要将日志(通过 ILogger)保存到 blob 存储,则需要将 webjobs 发布到 azure。您可以按照以下步骤操作:
1.Add b.AddAzureWebAppDiagnostics();
方法(需要安装 nuget 包 Microsoft.Extensions.Logging.AzureAppServices
)到 builder.ConfigureLogging
代码块:
builder.ConfigureLogging((context, b) =>
{
b.AddConsole();
b.AddAzureWebAppDiagnostics();
//other code
});
2.Publish 到azure,然后在azure portal -> 相关应用服务 -> 应用服务日志,配置"Application Logging(blob)",截图如下:
3.After 运行 webjob,导航到步骤2中配置的blob存储,可以看到生成了一个新的日志文件,以及所有的日志(包括通过ILogger的日志)在文件中。
I do want text file logging on Azure Storage as well via the binded ILogger.
Serilog.Sinks.AzureBlobStorage 可以帮助将日志写入 Azure Blob 存储,这在 Azure 和本地都可以很好地工作。
在Program.cs
builder.ConfigureLogging((context, b) =>
{
b.AddConsole();
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
var AzureBlobStorageLogger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
b.AddSerilog(logger: AzureBlobStorageLogger);
});
在appsettings.json
{
"Serilog": {
"Using": [
"Serilog.Sinks.AzureBlobStorage"
],
"WriteTo": [
{
"Name": "AzureBlobStorage",
"Args": {
"connectionString": "{your_connectionString_here}",
"storageContainerName": "azure-webjobs-hosts",
"storageFileName": "output-logs/{yyyy}/{MM}/{dd}/log.txt"
}
}
]
},
//other settings
//...
}
此外,正如@IvanYang所说,您也可以通过添加Azure diagnostics logger来实现它,但是此提供程序仅在Azure环境中的项目运行时有效。当我们在本地 运行 webjob 时,它不会将日志写入 Azure Blob 存储。
以前,当我在 .NET 中创建 Azure webjobs 时,它会自动将日志记录配置到 Azure 存储上路径 /azure-webjobs-hosts/output-logs/.txt 上的文本文件。但是,现在当我使用 .NET Core 和 3.0.14 版的 Webjobs SDK 时,默认情况下它不再具有此行为。
登录到控制台和 Application Insights 与我当前的设置配合得很好,但是我确实希望通过绑定的 ILogger 将文本文件登录到 Azure 存储。我已经按照有关如何配置它的官方指南进行操作,但它都指向存储队列,我不确定这是一个好的方法以及如何调整它。
配置代码:
static async Task Main(string[] args)
{
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
builder.UseEnvironment("development");
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddAzureStorage();
});
builder.ConfigureLogging((context, b) =>
{
b.AddConsole();
string instrumentationKey = context.Configuration["ApplicationInsightsKey"];
if (!string.IsNullOrEmpty(instrumentationKey))
{
b.AddApplicationInsightsWebJobs(o => o.InstrumentationKey = instrumentationKey);
}
});
builder.ConfigureServices(s => s.AddSingleton<IConfigurationRoot>(config));
var host = builder.Build();
using (host)
{
var jobHost = host.Services.GetService(typeof(IJobHost)) as JobHost;
await host.StartAsync();
await jobHost.CallAsync("Run");
await host.StopAsync();
}
}
职位代码:
[NoAutomaticTrigger]
public async Task Run(ILogger logger)
{
logger.LogInformation("I want this text in console as well as on Azure Storage");
// ..logic
}
如果要将日志(通过 ILogger)保存到 blob 存储,则需要将 webjobs 发布到 azure。您可以按照以下步骤操作:
1.Add b.AddAzureWebAppDiagnostics();
方法(需要安装 nuget 包 Microsoft.Extensions.Logging.AzureAppServices
)到 builder.ConfigureLogging
代码块:
builder.ConfigureLogging((context, b) =>
{
b.AddConsole();
b.AddAzureWebAppDiagnostics();
//other code
});
2.Publish 到azure,然后在azure portal -> 相关应用服务 -> 应用服务日志,配置"Application Logging(blob)",截图如下:
3.After 运行 webjob,导航到步骤2中配置的blob存储,可以看到生成了一个新的日志文件,以及所有的日志(包括通过ILogger的日志)在文件中。
I do want text file logging on Azure Storage as well via the binded ILogger.
Serilog.Sinks.AzureBlobStorage 可以帮助将日志写入 Azure Blob 存储,这在 Azure 和本地都可以很好地工作。
在Program.cs
builder.ConfigureLogging((context, b) =>
{
b.AddConsole();
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
var AzureBlobStorageLogger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
b.AddSerilog(logger: AzureBlobStorageLogger);
});
在appsettings.json
{
"Serilog": {
"Using": [
"Serilog.Sinks.AzureBlobStorage"
],
"WriteTo": [
{
"Name": "AzureBlobStorage",
"Args": {
"connectionString": "{your_connectionString_here}",
"storageContainerName": "azure-webjobs-hosts",
"storageFileName": "output-logs/{yyyy}/{MM}/{dd}/log.txt"
}
}
]
},
//other settings
//...
}
此外,正如@IvanYang所说,您也可以通过添加Azure diagnostics logger来实现它,但是此提供程序仅在Azure环境中的项目运行时有效。当我们在本地 运行 webjob 时,它不会将日志写入 Azure Blob 存储。