我已经安装了Serilog,并配置为将日志事件数据写入MS SQL Server中用于Azure功能的表中。
系统日志和由静态类本身编写的日志出现在表上,但是当我尝试使用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功能中创建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本身接收到缺点中也无法正常工作..
奇怪的是,只有系统日志正在记录到表中;
并且在无法正常工作的ILogger实例中已经存在Serilog提供程序;
答案 0 :(得分:1)
我遇到了完全相同的问题,但最终解决了。官方documentation有提示:
<块引用>启动类仅用于设置和注册。避免在启动过程中使用启动时注册的服务。例如,不要尝试在启动期间注册的记录器中记录消息。注册过程的这一点对于您的服务可用还为时过早。运行 Configure 方法后,Functions 运行时会继续注册其他依赖项,这可能会影响您的服务的运行方式。
因此,当您调用以下代码时,此记录器仅在被主机内部配置覆盖之前才会使用。
services.AddLogging(loggingBuilder =>
loggingBuilder.AddSerilog(dispose: true)
);
您需要将 Serilog 注册为 记录器提供商。这会将其作为提供程序之一包含在以下配置中。
builder.Services
.AddSingleton<ILoggerProvider>(new Serilog.Extensions.Logging.SerilogLoggerProvider(Log.Logger));
根据我的经验,本地 azure 函数模拟器中的行为是不同的,因此请使用已部署的实例进行尝试。
答案 1 :(得分:0)
我想您想要的是Fatal
日志,因为在serilog wiki log levels中找不到Critical
级别。并且关于Fatal
的描述是导致应用程序完全失败的严重错误。
以下是我使用Serilog.Sinks.MSSqlServer
软件包进行的代码测试,并且效果很好。这是有关此软件包的详细信息:Serilog.Sinks.MSSqlServer。
var logDB = "Server=xxxxxxx";
var logTable = "Logs";
var options = new ColumnOptions();
options.Store.Remove(StandardColumn.Properties);
options.Store.Add(StandardColumn.LogEvent);
var log = new LoggerConfiguration()
.WriteTo.MSSqlServer(
connectionString: logDB,
tableName: logTable,
autoCreateSqlTable:true,
restrictedToMinimumLevel:Serilog.Events.LogEventLevel.Verbose,
columnOptions: options
).CreateLogger();
log.Information("C# HTTP trigger function processed a request.");
log.Fatal("Here is a fatal log meesage");
log.Warning("Here is a warning log message");
log.Error("Here is an error log message");
答案 2 :(得分:0)
我认为您的问题是,如果过滤出您的日志并仅将系统日志发布到serilog,则函数运行时。将您的host.json
配置更改为以下配置,以允许通过跟踪级别及更高级别的所有日志:
{
"version": "2.0",
"logging": {
"fileLoggingMode": "debugOnly",
"logLevel": {
// For all functions. Can also specify function name
"Function": "Trace",
// Default settings, e.g. for host
"default": "Trace"
}
}
}
位于https://docs.microsoft.com/en-us/azure/azure-functions/functions-host-json的更多文档