Serilog dotnet 核心功能应用程序和 sql 接收器
Serilog dotnet core function app and sql sink
我需要将 dotnet5 与 Azure Functions 结合使用,因此按照指南创建了一个新的解决方案:https://docs.microsoft.com/en-us/azure/azure-functions/dotnet-isolated-process-guide.
效果很好,所以下一个工作是在 serilog 中添加控制台和 sql 服务器的接收器。
我添加了 nuget 包:
- Serilog.AspNetCore v4.1.0
- Serilog.Sinks.MSSqlServer v5.6.0
这是Program.Main:
static void Main(string[] args)
{
string EventName = "Main";
var columnOptions = new ColumnOptions
{
AdditionalColumns = new Collection<SqlColumn>
{
new SqlColumn
{ColumnName = "EventName", DataType = SqlDbType.NVarChar, DataLength = 32, NonClusteredIndex = true}
}
};
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Override("Microsoft.Azure", LogEventLevel.Warning)
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.MSSqlServer(
logEventFormatter: new RenderedCompactJsonFormatter(),
restrictedToMinimumLevel: LogEventLevel.Debug,
connectionString: "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=SmsRouter",
sinkOptions: new MSSqlServerSinkOptions
{
TableName = "LogEvents",
AutoCreateSqlTable = true,
},
columnOptions: columnOptions)
.CreateLogger();
try
{
Log.Information("Starting up {EventName}", EventName);
var host = new HostBuilder()
.UseSerilog()
.ConfigureFunctionsWorkerDefaults()
.ConfigureServices(s =>
{
//services configured here
})
.Build();
host.Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Application start-up failed");
}
finally
{
Log.CloseAndFlush();
}
}
您可以看到行 Log.Information("Starting up {EventName}", EventName); 这有效并记录到控制台和 Sql 服务器:)
应用程序启动后,它将等待 Http 请求 - 如下所示:
[Function("SendSimpleSms")]
public async Task<QueueAndHttpOutputType> RunSimple([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req,
FunctionContext executionContext)
{
string EventName = "SendSimpleSms";
try
{
Log.Information("Starting: {EventName}", EventName);
我的问题是,此日志请求“Starting: SendSimpleSms”被记录到控制台 window 但没有记录到 Sql 服务器。
请问有人看出我哪里错了吗?
感谢 Panagiotis Kanavos 让我知道了 Serilog 自记录。
我在 LoggerConfiguration 之后将以下内容添加到 program.main 中:
Serilog.Debugging.SelfLog.Enable(Console.Error);
这让我意识到 sql 接收器无法记录,因为自定义 属性 的长度超过了其列的长度
我需要将 dotnet5 与 Azure Functions 结合使用,因此按照指南创建了一个新的解决方案:https://docs.microsoft.com/en-us/azure/azure-functions/dotnet-isolated-process-guide.
效果很好,所以下一个工作是在 serilog 中添加控制台和 sql 服务器的接收器。
我添加了 nuget 包:
- Serilog.AspNetCore v4.1.0
- Serilog.Sinks.MSSqlServer v5.6.0
这是Program.Main:
static void Main(string[] args)
{
string EventName = "Main";
var columnOptions = new ColumnOptions
{
AdditionalColumns = new Collection<SqlColumn>
{
new SqlColumn
{ColumnName = "EventName", DataType = SqlDbType.NVarChar, DataLength = 32, NonClusteredIndex = true}
}
};
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Override("Microsoft.Azure", LogEventLevel.Warning)
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.MSSqlServer(
logEventFormatter: new RenderedCompactJsonFormatter(),
restrictedToMinimumLevel: LogEventLevel.Debug,
connectionString: "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=SmsRouter",
sinkOptions: new MSSqlServerSinkOptions
{
TableName = "LogEvents",
AutoCreateSqlTable = true,
},
columnOptions: columnOptions)
.CreateLogger();
try
{
Log.Information("Starting up {EventName}", EventName);
var host = new HostBuilder()
.UseSerilog()
.ConfigureFunctionsWorkerDefaults()
.ConfigureServices(s =>
{
//services configured here
})
.Build();
host.Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Application start-up failed");
}
finally
{
Log.CloseAndFlush();
}
}
您可以看到行 Log.Information("Starting up {EventName}", EventName); 这有效并记录到控制台和 Sql 服务器:)
应用程序启动后,它将等待 Http 请求 - 如下所示:
[Function("SendSimpleSms")]
public async Task<QueueAndHttpOutputType> RunSimple([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req,
FunctionContext executionContext)
{
string EventName = "SendSimpleSms";
try
{
Log.Information("Starting: {EventName}", EventName);
我的问题是,此日志请求“Starting: SendSimpleSms”被记录到控制台 window 但没有记录到 Sql 服务器。
请问有人看出我哪里错了吗?
感谢 Panagiotis Kanavos 让我知道了 Serilog 自记录。
我在 LoggerConfiguration 之后将以下内容添加到 program.main 中:
Serilog.Debugging.SelfLog.Enable(Console.Error);
这让我意识到 sql 接收器无法记录,因为自定义 属性 的长度超过了其列的长度