我正在尝试将消息记录到 Graylog 实例。 我已经在 Asp.net core 应用程序中设置了代码来执行此操作,一切正常。 但是,我在尝试从控制台应用程序执行此操作时遇到问题。 Graylog 正在我的 Windows 计算机上的 Docker Desktop 中运行。 在我的 Graylog 实例中,我有一个 UDP 输入和一个 Http 输入处于活动状态。
对于ASP.Net Core应用程序,这是program.cs中的设置
builder.Host.UseSerilog((context, configuration) =>
{
configuration
.ReadFrom.Configuration(context.Configuration)
.WriteTo.Graylog(new GraylogSinkOptions()
{
HostnameOrAddress = "localhost",
Port = 12201,
TransportType = TransportType.Http
});
});
然后在我的program.cs 文件中再往下一点。
app.UseSerilogRequestLogging();
当我启动 ASP.Net 应用程序时,我会在 Graylog 中收到日志消息。 这些是相关的包。
<PackageReference Include="Serilog.AspNetCore" Version="8.0.1" />
<PackageReference Include="Serilog.Sinks.Graylog" Version="3.1.1" />
翻到控制台应用程序,这就是设置。
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console()
.WriteTo.File("log.txt",
rollingInterval: RollingInterval.Day,
rollOnFileSizeLimit: true)
.WriteTo.Graylog(new GraylogSinkOptions()
{
HostnameOrAddress = "localhost",
Port = 12201,
TransportType = TransportType.Http,
Facility = "Test App"
})
.CreateLogger();
从这里记录任何内容时,它都会记录到控制台窗口,并且会很好地记录到文件中。 然而,Graylog 却一事无成。 我使用 Fiddler classic,能够看到来自 Web 应用程序的所有流量,并且我能够看到来自控制台应用程序的其他调用,这些调用使用 HttpClient 访问 Graylog API,但没有日志记录本身的流量。
这些是我为控制台安装的软件包。
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Serilog" Version="4.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.Graylog" Version="3.1.1" />
我还将这一行添加到设置中以尝试帮助调试。
Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));
这永远不会被激活,所以据我所知,要么什么也没有发生,要么 Serilog 没有注意到水槽不工作。我搜索过SO、ChatGPT和通用搜索引擎。 这应该有效,但事实并非如此。
编辑:我在控制台应用程序中尝试了 Serilog.Graylog.Sink 库的 3.0.2 版本,并且可以正常工作。 任何高于该版本的版本都无法在控制台应用程序中运行,但可以在 ASP.Net Core 应用程序中运行。 有些东西似乎不兼容。
编辑 2:一位评论者要求提供一个最小的可重现示例。 虽然这里的所有代码都差不多,但我已将程序合并为一个主函数的内容,该函数在我的设置中表现不佳。 代码运行时没有任何异常或出现问题的证据,它只是没有像我的 ASP.Net Core 应用程序中的消息那样显示在日志中,该应用程序的设置非常相似。
static async Task Main(string[] args)
{
Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.Enrich.FromLogContext()
.WriteTo.Graylog(new GraylogSinkOptions()
{
HostnameOrAddress = "localhost",
Port = 12201,
TransportType = TransportType.Http,
Facility = "Test App",
})
.CreateLogger();
Log.Information("This is a test message");
Log.CloseAndFlush();
}
.MinimumLevel.Debug()
先尝试切换到
.MinimumLevel.Information()
看看会发生什么