我的网站使用 Docker 容器,并使用 Azure 应用服务将其托管在 Azure 上。我使用 Seq 日志服务器来集中记录日志。
恐怕答案可能是:这是不可能的。将 Docker 容器日志发送到 Seq 日志服务器的“正确”方法包括向命令添加一些参数docker run,但我找不到任何方法在 Azure 应用服务或相应的Azure Web 应用服务容器任务中提供此类参数我用它来将新的容器映像部署到该服务。
我希望将 docker 日志发送到 Seq 的原因之一是我认为 Azure 对日志的处理令人困惑。 这个问题包含许多关于如何从 Azure 中获取一些 docker 日志的答案,但没有一个比在 Seq 日志服务器中搜索“docker”更简单或完整。
也许 Azure 应用服务不是完成这项工作的正确工具。相反,也许我应该使用 Azure 容器实例 (ACI)。 与 Docker 的集成似乎很强大。然而,这个答案说
Azure Web App for Containers 的目标是长时间运行的东西(始终运行),而 ACI 的目标是计划\突发\短期工作负载(类似于 Azure Functions)。
我的网站应该始终运行,因此这让我认为我正确使用了 Azure 应用服务。
也许我应该使用Docker 任务部署到我的 Azure 应用服务。然而,有两件事让我有不同的想法。首先是任务说:
我有一个 Windows 服务,它处理长时间运行的任务,并且永远不会关闭,除非强制关闭(即计算机关闭)。我希望在 Windows 服务启动和运行的整个过程中保持同一个 Serilog 实例处于活动状态(出于性能原因)。
但是,我只在 Dispose() 调用之后看到日志,如下所示。
var logger = new LoggerConfiguration()
.WriteTo.Seq("http://localhost:5341")
.CreateLogger();
logger.ForContext("TestContext", new { Machine = "TSTDB2" }, true).Information("Test");
logger.Dispose();
Run Code Online (Sandbox Code Playgroud)
我不介意几秒钟的延迟,但必须等到 Serilog 实例被处理对我来说不起作用。任何解决方案将不胜感激。
我有一个具有多个属性的对象,这些属性与我网站上刚刚发生的事件相关。
我想记录此事件,并将其每个属性显示在 Seq 中 - 作为属性。但是想要从实际的日志消息文本中省略大部分属性 - 所以我不希望它们出现在消息模板中。v
如果我这样做:
var logInfo= new LogInfo() {Foo = 1, Bar= "Pending"};
logger.Information("{@event}", logInfo);
Run Code Online (Sandbox Code Playgroud)
在 Seq 中直接针对日志亮起的唯一属性是 @event 属性。它实际上看起来像这样:
所以我试过这个:
var enricher = new DnnLogInfoEnricher(logInfo);
using (LogContext.PushProperties(enricher))
{
Log.Logger.Information("Event: {logInfo}", logInfo.LogTypeKey, logInfo.Exception);
}
Run Code Online (Sandbox Code Playgroud)
但我对这种方法的担忧是,由于此方法将触发大量次数,因此我不想每次都创建一个新的丰富对象实例 - 因为我喜欢保持正在创建的对象数量通常尽可能低。只是因为我担心 GC 影响(也许我的担忧是没有根据的?)。
这是实现我想要的(即使用浓缩器)的正确/正确方法还是我错过了什么?
干杯!
我正在将 Serilog 与 Seq 一起使用,并希望使用我自己的属性来丰富 Seq 中出现的日志记录。
如果我输入一个日志语句,如...
Log.Information("ProcessCycle {Site} {Activity}", SiteName, ActivityName);
Run Code Online (Sandbox Code Playgroud)
在 Seq 我得到...
请注意,站点和活动值在 Seq 中显示为丰富的属性,但它们也显示在整体消息中。
如何记录获取丰富属性的位置,但文本消息行中没有显示值?请注意,我有 NuGet 包,它为每个调用添加了一个 ThreadId。我希望 Site 和 Activity 属性位于丰富的道具列表中,但不一定打印在消息行中。
对此的答案可能还需要了解我们的应用程序。
该应用程序是一个 Windows 服务,它产生多个做不同事情的活动。因此,Windows 服务编排了其中包含的各种活动。按照计划,它只是在每个活动上调用“流程”来完成一些工作。每次流程被编排器调用时,我都需要该 Activity 的所有日志记录以自动包含如上所示的 Site 和 Activity 值(以及更多属性值,但我不希望它们全部打印在消息行中)。
因此,我们将看到的不是上面的条目,而是... 注意消息现在只显示为“ProcessCycle”。
日志记录正在运行,但没有发布到我的本地 seq,我尝试添加 serilog 并使用 Serilog 但它没有登录到我的本地服务:相关问题
.csproj
<ItemGroup>
<PackageReference Include="Microsoft.AspNet.Mvc" Version="5.2.7" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.0.0" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.0.1" />
<PackageReference Include="Serilog" Version="2.8.0" />
<PackageReference Include="Serilog.AspNetCore" Version="3.0.0" />
<PackageReference Include="Serilog.Extensions.Hosting" Version="3.0.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="3.0.1" />
<PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="4.6.0" />
Run Code Online (Sandbox Code Playgroud)
程序
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(loggingBuilder => {
loggingBuilder.AddEventLog();
loggingBuilder.AddSerilog();
})
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
})
.UseSerilog();
Run Code Online (Sandbox Code Playgroud)
appSettings.json:
"Serilog": {
"LevelSwitches": { "$controlSwitch": "Verbose" },
"MinimumLevel": { …Run Code Online (Sandbox Code Playgroud) seq-logging ×5
serilog ×4
.net ×1
azure ×1
c# ×1
docker ×1
docker-logs ×1
getseq ×1
logging ×1
seq ×1