是否可以登录传入参数为通用参数的方法?例如
public async Task<TResult> Handle(TQuery query)
{
var watch = Stopwatch.StartNew();
var result = await _handler.Handle(query);
watch.Stop();
Serilog.Log.Logger.Information("Processed {@" + query.GetType().Name + "} in {Elapsed} ms",
query.GetType().Name, watch.ElapsedMilliseconds);
return result;
}
Run Code Online (Sandbox Code Playgroud)
请注意,在上面,我在模板中使用字符串连接,但我不确定这是最佳实践。还有另一种方法来记录传入的对象吗?
我有一个 .Net C# WPF 应用程序。我正在尝试将滚动日志添加到应用程序中。在 Asp.Net 应用程序中,我们之前使用过 Serilog 包。
Serilog 是否适用于 .Net 桌面(非 asp.net)应用程序?我用谷歌搜索了一下,发现有一些与此相关的问题,但尚不清楚它们是否真正得到解决。
我的 Serilog Logger 的初始化如下所示:
string logsDirectory = Path.Combine(Environment.CurrentDirectory, "logs");
// Configure Serilog pipeline
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.RollingFile(Path.Combine(logsDirectory, "log-{Date}.txt"))
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
我收到“RollingLog()”的以下编译错误。
错误 CS1061“LoggerSinkConfiguration”不包含“RollingFile”的定义,并且找不到接受“LoggerSinkConfiguration”类型的第一个参数的扩展方法“RollingFile”(您是否缺少 using 指令或程序集引用?)
如何将 git 与 WPF 一起使用?
好的,我们在 Web 应用程序中使用 Serilog 并将其发布到 SEQ。(该网站是经典 ASP 和 .NET 的混合体,但我们只有 .NET 中的 Serilog 调用)
// create the logger
Log.Logger = new LoggerConfiguration()
.MinimumLevel.ControlledBy(_levelSwitch)
.WriteTo.Seq(seqIp)
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
当我将 MaximumLoggingLevel 配置为“信息”、“调试”或“详细”时,每个GET 或 POST 都会被扔进日志中,数百个......
甚至无需调用 log.Information...、log.Debug... 或 log.Verbose。它只是将所有可能的信息扔给 SEQ。
以下是被放入 SEQ 中的一些信息。这只是“信息”,没有我明确调用来记录的内容......
这是正常功能吗?
(我现在将其设置为“警告”,因此这些多余的信息不会阻塞用户界面)
我有以下记录器配置和相关类如下。预期的日志消息如下:
2019-03-06 19:49:56.417 +05:30 [INFORMATION] [Main] Start
2019-03-06 19:49:56.435 +05:30 [INFORMATION] [Test1] Test1 logg
Run Code Online (Sandbox Code Playgroud)
我在控制台中看到了两个日志消息。但我只看到文件中的第一个日志。
namespace SerilogTest
{
public static class MyLogger
{
public static ILogger getLogger(String className)
{
string logTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u}] [{SourceContext}] {Message}{NewLine}{Exception}";
Log.Logger = new LoggerConfiguration()
.WriteTo.Console(outputTemplate: logTemplate)
.WriteTo.File("log.txt", outputTemplate: logTemplate)
.CreateLogger()
.ForContext("SourceContext", className);
return Log.Logger;
}
}
public class Program
{
private static ILogger Log = MyLogger.getLogger("Main");
private static void Main(String[] args)
{
Log.Information("Start");
Test1 t1 = new Test1();
Console.ReadKey();
}
}
public …Run Code Online (Sandbox Code Playgroud) 我正在设置 docker-compose.yml 文件来读取 docker 映像的环境变量。我的宿主项目中引用了 serilog.sinks.elasticsearch nuget 包。
如果我在 Visual Studio 中使用 appsettings.json 运行该项目,它会读取设置并将日志发送到 Elasticsearch,但不通过 docker-compose。
docker-compose.yml docker镜像的环境规范:
environment:
- serilog:MinimumLevel=Verbose
- serilog:using=Serilog.Sinks.Elasticsearch
- serilog:WriteTo:Elasticsearch.nodeUris=http://localhost:9200
Run Code Online (Sandbox Code Playgroud)
本地 appsettings.json 有效。
"Serilog": {
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "Elasticsearch",
"Args": {
"nodeUris": "http://localhost:9200"
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
docker-compose 中设置的MinimumLevel 受到尊重。
如何设置 docker-compose.yml 来读取接收器并将日志发送到elasticsearch数据库?
我有以下问题。我希望能够Serilog在 Windows 服务中使用,但我不知道它应该在哪里初始化:
目前我在我的初始化它Main:
using Serilog;
public static void RunService() {
Log.Logger = new LoggerConfiguration()
.WriteTo.RollingFile([some path])
.CreateLogger();
MyService daemon = new MyService();
Log.Information("Service initialized")
ServiceBase[] services;
services = new ServiceBase[] {
service
};
Log.Information("Before running the service");
ServiceBase.Run(services);
}
static void Main(string[] args) {
RunService();
}
Run Code Online (Sandbox Code Playgroud)
服务
public class MyService:ServiceBase{
protected override void OnSessionChange(SessionChangeDescription changeDescription) {
Log.Information("session changed");
}
protected override void OnStart(string[] args) {
Log.Information("Started service");
}
}
Run Code Online (Sandbox Code Playgroud)
因此,为了Serilog在Main运行服务集合的服务和目标服务中使用它应该如何完成?
我正在使用Serilog.Extensions.Logging.File登录文件。
这是我的appsettings.json文件:
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Information",
"System": "None",
"Microsoft": "None"
}
},
"LoggingFile": {
"IncludeScopes": false,
"pathFormat": "C:/logs/APILogs-{Date}.log",
"LogLevel": {
"Default": "Trace",
"System": "None",
"Microsoft": "None"
}
}
Run Code Online (Sandbox Code Playgroud)
我的 Startup.cs 代码:
public void Configure(
IApplicationBuilder app,
IHostingEnvironment env,
IApiVersionDescriptionProvider provider,
ILoggerFactory loggerFactory)
{
// Removed other codes
loggerFactory.AddFile(Configuration.GetSection("LoggingFile"));
}
Run Code Online (Sandbox Code Playgroud)
但它仍然记录 mvc 请求信息,如下所示:
2019-09-21T13:28:59.6337460+05:30 80000019-0004-ff00-b63f-84710c7967bb [INF] 请求开始 HTTP/1.1 GET http://localhost:53534/api/values ()
2019-09-21T13:28:59.8309629+05:30 80000019-0004-ff00-b63f-84710c7967bb [INF] 请求在 202.16ms 200 (791a596a) 完成
2019-09-21T13:29:00.1500727+05:30 8000001a-0004-ff00-b63f-84710c7967bb [INF] 请求开始 …
Serilog我刚刚学习了与 C# .Net Core 3.1 Web 应用程序结合 使用的教程。
目前一切正常,但我注意到调试消息的字体颜色是黑色,并且与runRider (Mac) 中窗格的背景颜色冲突。
这是我的appsettings.json如果有帮助:
{
"AllowedHosts": "*",
"Serilog": {
"Using": [],
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ],
"WriteTo": [
{ "Name": "Console" },
{
"Name": "File",
"Args": {
"path": "Logs/log.txt",
"outputTemplate": "{Timestamp:G} {Message}{NewLine:1}"
}
}
]
}
}
Run Code Online (Sandbox Code Playgroud) 我正在为我的 .NET Core webapi 设置日志记录,并希望为一个请求拥有一个唯一的 ID。
经过一番谷歌搜索后,我发现 Serilog 用于HttpContext.TraceIdentifier此目的,它应该看起来像“0HL0GJPLR7AOD”。
如果我在控制器方法中设置一个断点,我会得到HttpContext.TraceIdentifier一个 Guid,更糟糕的是,它每次都相同,而不是每个请求一个(800000ad-0002-fb00-b63f-84710c7967bb)。
这也是在 serilog 中显示为“RequestId”的内容,但我的主要问题是为什么不是HttpContext.TraceIdentifier“某些文本”格式以及为什么每个请求都相同?
在我们的 .Net Core 3.1 项目中,我们使用 Serilog 进行日志记录
在我的测试设置中,我创建了一个 ServiceCollection,以便我可以使用服务集合 \ - 提供程序来更新我在测试中使用的类。我有一个同时使用 DbContext 和 Serilog 记录器的存储库。
using Serilog;
using Microsoft.EntityFrameworkCore;
namespace MyApp.Persistency
{
public class MyRepository : IMyRepository
{
private readonly DataContext _dataContext;
private readonly ILogger _logger;
public OpvragenOnbekendeBurgerRegistratieRepository(DataContext dataContext, ILogger logger)
{
_dataContext = dataContext;
_logger = logger;
}
...
}
Run Code Online (Sandbox Code Playgroud)
在我的测试课中:
[TestInitialize]
public void Initialize()
{
var diCollection =
new ServiceCollection()
.AddSingleton(new SqlConnectionOption(_connectionstring))
.AddDbContext<DataContext>(
options =>
{
options.UseSqlServer(_connectionstring);
}
)
...
xxx Add some kind of Serilog registration …Run Code Online (Sandbox Code Playgroud)