我已安装 Serilog 并配置为将日志事件数据写入 MS SQL Server for Azure Function 中的表。
静态类本身写入的系统日志和日志出现在表中,但是当我尝试使用 Extensions.Logging.ILogger 时,即使我可以在 ILogger 中看到 Serilog 提供程序,消息也不会出现在表中。
Startup.cs 配置;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Azure.WebJobs.Hosting;
using Serilog;
using Serilog.Events;
using Serilog.Sinks.MSSqlServer;
using Microsoft.Azure.WebJobs;
[assembly: FunctionsStartup(typeof(Rubix.FunctionApp.Startup))]
namespace Rubix.FunctionApp
{
public class Startup : IWebJobsStartup
{
public Startup()
{
var config = new ConfigurationBuilder()
.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
var logDbConnectionString = "connectionString";
var logTable = "LogEntry";
var columnOptions = new ColumnOptions()
{
AdditionalColumns = new Collection<SqlColumn>
{
new SqlColumn
{ColumnName = "Filter", DataType = SqlDbType.NVarChar, DataLength = 50},
new SqlColumn
{ColumnName = "JsonType", DataType = SqlDbType.NVarChar, DataLength = 50},
}
};
// we don't need XML data
columnOptions.Store.Remove(StandardColumn.Properties);
// we do want JSON data
columnOptions.Store.Add(StandardColumn.LogEvent);
// exclude standard columns from the json output
columnOptions.LogEvent.ExcludeStandardColumns = true;
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(config)
.Enrich.FromLogContext()
.WriteTo.MSSqlServer(
connectionString: logDbConnectionString,
tableName: logTable,
columnOptions: columnOptions
)
.WriteTo.ApplicationInsights(TelemetryConfiguration.Active, TelemetryConverter.Traces, LogEventLevel.Information)
.CreateLogger();
}
public void Configure(IWebJobsBuilder builder)
{
ConfigureServices(builder.Services).BuildServiceProvider(true);
}
private IServiceCollection ConfigureServices(IServiceCollection services)
{
services
.AddLogging(loggingBuilder =>
loggingBuilder.AddSerilog(dispose: true)
);
return services;
}
}
}
在 Azure Function 中创建 ILogger;
public class Function
{
private readonly ILogger<Function> _logger;
public Function(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<Function>();
}
[FunctionName("Function1")]
public async Task Run([ServiceBusTrigger("topic-name", "subscription-name", Connection = "AzureServiceBus")]string message)
{
Log.Logger.Information("Function invoked");// ----> WORKING!
_logger.LogInformation("Function invoked by ILogger");// ----> NOT WORKING!
}
}
此外,将 ILogger 本身接收到 cons 中也不起作用..
奇怪的是只有系统日志被记录到表中;
并且 Serilog 提供程序已经存在于不工作的 ILogger 实例中;