- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 Microsoft Asp.Net Web Api 项目,我试图在其中设置 serilog 日志记录。我已经为 Serilog、Serilog.Sinks.File、SerilogWeb.Classic 和 SerilogWeb.Classic.WebApi 安装了 Nuget 包。请注意,我无法使用 .Net Core。
我的问题是我正在尝试使用 SerilogWeb.CLassic.WebApi 包中的增强器,但它们并没有改变我的输出。我确信我正在做的是一个简单的错误,但我找不到任何其他人在网上使用同样的 enricher 的例子(我找到的所有东西都在 .Net Core 上)。
Log.Logger = new LoggerConfiguration()
.Enrich.WithWebApiActionName()
.WriteTo.File("D:/mytestresults.txt")
.CreateLogger();
上面的代码片段来 self 的 Startup.cs 文件。当我运行时,http 请求被记录到文件中,但添加和删除 Enrich 行没有任何区别。下面是一个示例文件输出
2019-03-26 10:09:11.215 -04:00 [INF] HTTP GET /api/actions/ responded 200 in 17ms
2019-03-26 10:09:13.621 -04:00 [INF] HTTP GET /api/actions/ responded 200 in 9ms
请注意,我确实想使用其他增强器,但我已将其简化一些以找出我做错了什么。
为了清楚地了解我正在使用的包,以下是我的一些 packages.config
<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net461" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net461" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net461" />
<package id="Microsoft.AspNet.WebApi.Owin" version="5.2.3" targetFramework="net461" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net461" />
<package id="Serilog" version="2.8.0" targetFramework="net461" />
<package id="Serilog.Sinks.File" version="4.0.0" targetFramework="net461" />
<package id="Serilog.Sinks.MSSqlServer" version="5.1.2" targetFramework="net461" />
<package id="Serilog.Sinks.PeriodicBatching" version="2.1.1" targetFramework="net461" />
<package id="SerilogWeb.Classic" version="5.0.48" targetFramework="net461" />
<package id="SerilogWeb.Classic.WebApi" version="4.0.5" targetFramework="net461" />
编辑
以下是建议更改后的代码,虽然一些 enricher 正在运行,但我没有获得操作和 Controller 名称:
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.Enrich.WithUserName()
.Enrich.WithWebApiRouteData()
.Enrich.WithWebApiControllerName()
.Enrich.WithWebApiRouteTemplate()
.Enrich.WithWebApiActionName()
.Enrich.WithHttpRequestUrl()
.WriteTo.MSSqlServer(connectionString, tableName, restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Information, autoCreateSqlTable: true)
.WriteTo.File("D:/mynewlog.txt", outputTemplate: "<{WebApiAction}> Time: {Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} Level:[{Level:u3}] Message:{Message:lj}Properties:{Properties}{NewLine}{Exception}")
.CreateLogger();
下面是此时记录到文件中的内容(sql同理)
<> Time: 2019-03-27 10:34:47.842 -04:00 Level:[INF] Message:HTTP GET /api/actions/reviews responded 200 in 7msProperties:{ SourceContext: "SerilogWeb.Classic.ApplicationLifecycleModule", UserName: "theUsernameWasHere", HttpRequestUrl: "http://localhost:61111/api/actions/reviews" }
最佳答案
我认为现在正在发生的事情是您的“日志事件”已适本地丰富了所有信息,但 File
接收器未正确配置以显示该信息。
File
接收器的默认输出模板是{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} \[{Level:u3}\] {Message:lj}{NewLine}{Exception}
,这意味着它将正确显示“呈现的消息”(消息模板 + 消息模板中引用的属性的值)。
您需要做的是以所有额外属性(丰富时添加到每个日志事件的属性)也显示的方式配置它。
对于 File
接收器,您可以例如添加特殊的 {Properties}
directive在您的输出模板中,这将显示所有附加到事件的属性,但不会作为消息模板的一部分呈现。
那看起来像:
Log.Logger = new LoggerConfiguration()
.Enrich.WithWebApiActionName()
.WriteTo.File("D:/mytestresults.txt", outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} \[{Level:u3}\] {Message:lj}{Properties}{NewLine}{Exception}")
.CreateLogger();
(或 {Properties:j}
将它们格式化为 JSON)。
这将输出附加到事件但不位于输出模板中其他任何位置的所有属性。
如果您只对 WebApiAction
感兴趣,您也可以这样做:
Log.Logger = new LoggerConfiguration()
.Enrich.WithWebApiActionName()
.WriteTo.File("D:/mytestresults.txt", outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} \[{Level:u3}\]<{WebApiAction}> {Message:lj}{NewLine}{Exception}")
.CreateLogger();
... 然后你会在输出中得到这样的行:
2019-03-26 10:09:13.621 -04:00 [INF]<MyActionName> HTTP GET /api/actions/ responded 200 in 9ms
更新
看起来这不是“输出格式”问题,因为您可以正确显示一些 附加属性...
.WithUserName
和 .WithRequestUrl
不是特定于 WebApi 的,可以为 任何 ASP.NET 应用程序轻松收集。 .WithWebApi*
扩展依赖于 IAuthenticationFilter
我们在 Web API 中声明 on start up谢谢to this line ...
以下是可以解释缺乏浓缩的可能情况:- 由于某种原因,PreApplicationStartMethod
程序集属性未按预期工作- 由于某种原因,在 Web API 中注册 StoreWebApInfoInHttpContextAuthenticationFilter
不起作用- 由于某种原因,我们无法从 ActionContext
您是否可能在启动时使用已注册的 AuthenticationFilter
做“奇怪”的事情?
最好尝试将其作为您在此处报告的问题的一部分进行追踪:https://github.com/serilog-web/classic-webapi/issues/18 ;)
关于c# - 带有 Asp.net Web Api 的 Serilog 不使用 enricher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55359440/
我正在寻找一种为 serilog 提供独立 XML/JSON 配置文件的方法,该文件是从应用程序本身运行的目录中动态加载的。 我正在寻找类似的东西 NLog provides .如 Nlog#Conf
我在我的 aspnet core 应用程序中使用 Serilog 进行日志记录。我需要频繁地将日志事件写入控制台(每秒 300-500 个事件)。我在 docker 容器内运行我的应用程序,并使用 O
是否可以创建一个自动为每条消息添加前缀的记录器? 我通常在每条消息前加上帐户前缀,因为这样更容易阅读,像这样: user1 - did something user2 - did another th
我具有动态更改日志文件路径的功能。但是,当我更改 Consul 中可配置的路径时,它会在两个地方(即旧路径和新路径)写入部分日志。更改日志文件路径应该可以在没有任何服务重启的情况下工作。我们如何存档?
我有很多这样的日志: Log.Information("Submitting order {@order}", order); 此日志通过 RabbitMq -> LogStash -> Elasti
我有很多这样的日志: Log.Information("Submitting order {@order}", order); 此日志通过 RabbitMq -> LogStash -> Elasti
我在服务器端使用 Serilog 为我所有的 .NETCore 服务使用控制台、文件和 Graylog 接收器。我也喜欢在我的 Windows 胖客户端(WPF 应用程序)中使用它。 与 后者我有问题
我正在使用 Serilog.Extensions.Logging 并使用此 outputTemplate 输出到控制台: "{Timestamp:HH:mm} [{Level:u3}] {Messag
Date时间的RollingFile Sink的当前输出如下 2015-04-06 18:40:54.400 +10:00 [Information] Hello World! 无论如何,有没有要消除
我使用 Serilog 作为 .NET 的库,它为文件、控制台和其他地方提供诊断日志记录。 我的问题是我在我的代码中声明了一些日志记录事件,但是在查看 Windows 事件查看器时,分配给我的日志的事
Serilog 的 Azure 表存储接收器是否可以像其他接收器(例如 Elasticsearch 和 Seq)一样通过 app/Web.config 配置,这些接收器可以从配置文件进行配置。 Azu
我正在使用 SeriLog 登录基于 IdentityServer3 的身份验证服务。我刚刚将 serilog.sinks.literate 插件替换为 serilog.sinks.file 插件,以
我使用 Serilog 作为 .NET 的库,它为文件、控制台和其他地方提供诊断日志记录。 我的问题是我在我的代码中声明了一些日志记录事件,但是在查看 Windows 事件查看器时,分配给我的日志的事
我正在尝试安装 serilog,但出现错误 PM> Install-Package Serilog Install-Package : 'Serilog' already has a dependen
从 nlog 转移到 serilog,我希望我的 .NET 框架桌面应用程序在每次运行时重用一个静态命名的日志文件,但在每个新进程中清除文件的内容。可以这样配置serilog吗? This is a
serilog 的可用接收器位于此处:https://github.com/serilog/serilog/wiki/Provided-Sinks 但不包括蔚蓝服务巴士。 目前是否正在努力创建一个?如
我要写 Serilog Warning .NET 集合中的事件,以便它们可以包含在给用户的报告中。我该怎么做 configure the static Log.Logger 写信给类似 static
我尝试在结构化模式下将 JSNLog 与 Serilog 一起使用,如文档中所述: http://jsnlog.com/Documentation/HowTo/StructuredLogging 我在
我正在从 log4net 切换到 Serilog,但错过了我在 log4net 中的一些格式化可能性。我没有找到关于我可以在 outputTemplate 中使用哪些格式化程序的任何文档。有什么方法可
我远不是具有任何 .net 经验的开发人员,但工作中的开发团队希望使用 Serilog 和 serilog-sinks-elasticsearch 将日志推送到我的 ELK 堆栈中。 查看 seril
我是一名优秀的程序员,十分优秀!