如何将 Serilog 与 Azure WebJobs 结合使用?
How do I use Serilog with Azure WebJobs?
我正在尝试使用 Serilog 设置 Azure WebJobs。这是我当前的例外情况:
Microsoft.Azure.WebJobs.Host.Indexers.FunctionIndexingException:
Error indexing method 'Functions.ProcessQueueMessage'
---> System.InvalidOperationException: Cannot bind parameter 'logger' to type ILogger. Make sure the parameter Type is supported by the
binding. If you're using binding extensions (e.g. Azure Storage,
ServiceBus, Timers, etc.) make sure you've called the registration
method for the extension(s) in your startup code (e.g.
builder.AddAzureStorage(), builder.AddServiceBus(),
builder.AddTimers(), etc.).
我看过,但是Serilog.Extensions.WebJobs已经不再维护了
我已经尝试了 this hosting boilerplate setup 的变体,但它要么导致相同的异常,要么没有消耗队列消息。
我也尝试过 ,但我不知道在哪里可以找到 SDK 依赖项的最终列表以消除任何潜在的版本控制不匹配。
当 ProcessQueueMessage 使用 Microsoft.Extensions.Logging.ILogger
但不使用 Serilog.ILogger
时,以下内容按预期工作:
class Program
{
static async Task Main()
{
var builder = new HostBuilder();
builder.UseSerilog();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddAzureStorage();
});
var host = builder.Build();
try { await host.RunAsync(); }
catch (Exception ex) { Log.Logger.Fatal(ex.Message, ex); }
}
}
public class Functions
{
public static void ProcessQueueMessage([QueueTrigger("queue")] string message, ILogger logger)
{
logger.Information(message); // Serilog ILogger
}
}
项目包参考:
(也玩过预发行版)
将 ILogger 作为函数参数注入,效果非常好。
Serilog.Extensions.WebJobs的作者提供了一个合适的template,我将其浓缩如下:
class Program
{
static async Task Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Console()
.CreateLogger();
IHostBuilder builder = Host.CreateDefaultBuilder(args)
.UseSerilog(Log.Logger)
.ConfigureServices(s => s.AddSingleton(Log.Logger))
.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddAzureStorage();
b.AddTimers();
});
IHost host = builder.Build();
try { await host.RunAsync(); }
catch (Exception ex) { Log.Fatal(ex.Message, ex); }
finally { Log.CloseAndFlush(); }
}
}
public class Functions
{
readonly ILogger _logger;
public Functions(ILogger logger) => _logger = logger.ForContext<Functions>();
public void ProcessQueueMessage([QueueTrigger("queue")] string message) =>
_logger.Information(message);
}
包参考:
<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.27" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions" Version="4.0.1" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage" Version="4.0.4" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="5.0.0" />
<PackageReference Include="Serilog.Extensions.Hosting" Version="4.1.2" />
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
来源:@James Skimming
我正在尝试使用 Serilog 设置 Azure WebJobs。这是我当前的例外情况:
Microsoft.Azure.WebJobs.Host.Indexers.FunctionIndexingException: Error indexing method 'Functions.ProcessQueueMessage' ---> System.InvalidOperationException: Cannot bind parameter 'logger' to type ILogger. Make sure the parameter Type is supported by the binding. If you're using binding extensions (e.g. Azure Storage, ServiceBus, Timers, etc.) make sure you've called the registration method for the extension(s) in your startup code (e.g. builder.AddAzureStorage(), builder.AddServiceBus(), builder.AddTimers(), etc.).
我看过
我已经尝试了 this hosting boilerplate setup 的变体,但它要么导致相同的异常,要么没有消耗队列消息。
我也尝试过
当 ProcessQueueMessage 使用 Microsoft.Extensions.Logging.ILogger
但不使用 Serilog.ILogger
时,以下内容按预期工作:
class Program
{
static async Task Main()
{
var builder = new HostBuilder();
builder.UseSerilog();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddAzureStorage();
});
var host = builder.Build();
try { await host.RunAsync(); }
catch (Exception ex) { Log.Logger.Fatal(ex.Message, ex); }
}
}
public class Functions
{
public static void ProcessQueueMessage([QueueTrigger("queue")] string message, ILogger logger)
{
logger.Information(message); // Serilog ILogger
}
}
项目包参考:
将 ILogger 作为函数参数注入,效果非常好。
Serilog.Extensions.WebJobs的作者提供了一个合适的template,我将其浓缩如下:
class Program
{
static async Task Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Console()
.CreateLogger();
IHostBuilder builder = Host.CreateDefaultBuilder(args)
.UseSerilog(Log.Logger)
.ConfigureServices(s => s.AddSingleton(Log.Logger))
.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddAzureStorage();
b.AddTimers();
});
IHost host = builder.Build();
try { await host.RunAsync(); }
catch (Exception ex) { Log.Fatal(ex.Message, ex); }
finally { Log.CloseAndFlush(); }
}
}
public class Functions
{
readonly ILogger _logger;
public Functions(ILogger logger) => _logger = logger.ForContext<Functions>();
public void ProcessQueueMessage([QueueTrigger("queue")] string message) =>
_logger.Information(message);
}
包参考:
<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.27" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions" Version="4.0.1" /> <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage" Version="4.0.4" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="5.0.0" /> <PackageReference Include="Serilog.Extensions.Hosting" Version="4.1.2" />
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
来源:@James Skimming