我碰到 了停产通知的的SerilogWeb.Owin包,并在阅读GitHub的问题有关于给出的包〜5K +下载"重定向人某处"的讨论.
但我无法弄清楚我被重定向到哪里!
那么,在将Serilog与(OWIN)自托管Web API一起使用时,我应该在哪里寻找"Serilog-blessed"集成?
我正在使用Serilog.我想写一个SourceContext包含类的日志条目.
这样做是否安全(包括线程安全):
using Serilog;
...
class Foo
{
private static readonly ILogger Log =
Serilog.Log.ForContext<Foo>();
/* Invoke Log.Debug(...) etc. in other methods */
}
Run Code Online (Sandbox Code Playgroud)
文档(链接)有一个小例子,它在方法中添加上下文,而不是像上面那样为类型创建一个共享.我宁愿不必将相同的锅炉板代码放入我正在记录的每个方法中.根据经验,上述似乎有效,但任何人都可以提供明确的指导吗?
背景
在Serilog被选为记录器的新项目中,我自动开始绕过ILogger界面.代码访问Log.Logger一次,从那时起,希望日志记录的类ILogger通过构造函数注入接受.
我受到了这种做法的挑战,建议是在Log课堂上使用静态方法,例如Serilog.Log.Debug(...).这个论点是,有一set;对Log.Logger如此嘲讽是很容易.
看看api,我可以看到传递的好处之一ILogger就是ForContext方法.
我花了一些时间在网上和Serilog的文档中,但是我找不到有关在整个应用程序代码中访问日志的规范方法的信息.
题
是否存在规范的,即大多数情况下更好的方式来访问/传递Serilog记录器,如果存在,是否ILogger在Serilog.Log类上传递或使用静态API ?
我正在使用.NET Core 2.1 HostBuilder类来设置和运行GRPC服务器,并且无法正确配置SeriLog,以便.NET Core日志管道使用它以及在其他地方可用(通过依赖注入)我的应用.
class Program
{
private static async Task Main(string[] args)
{
var hostBuilder = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddSingleton<ILogger>(BuildLogger);
// other services here
})
.ConfigureLogging((hostContext, loggingBuilder) =>
loggingBuilder.AddSerilog(dispose: true));
await hostBuilder.RunConsoleAsync();
}
private static ILogger BuildLogger(IServiceProvider provider)
{
// create a (global) logger
Log.Logger = new LoggerConfiguration()
...
.CreateLogger();
return Log.Logger;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我需要调用才能loggingBuilder.AddSerilog()使用在ILogger上面几行中使用DI服务配置注册的单例.
我意识到我可以直接调用BuildLogger()获取ILogger实例并使用DI服务配置注册该实例,但似乎我不应该这样做.我正在寻找的是一种方法,从.ConfigureLogging()方法中访问一个ServiceProvider实例,所以我可以得到注册ILogger可能喜欢
serviceProvider.GetRequiredService<ILogger>();
Run Code Online (Sandbox Code Playgroud)
并将其传递给AddSerilog()电话.有任何想法吗?
我环顾四周,但找不到有效的解决方案,并且由于所有示例看起来都相似,因此我认为一定是我忽略了明显的内容。还要注意,这是我使用.NET Core和Serilog进行的第一个实际项目。
我试图将一些自定义属性登录(使用serilog)到数据库中自己定义的列中,这些定义在appsettings.json管道中通过中间件定义并通过中间件添加。但是,即使在属性XML列中正确填充了相同的项目,这些值仍为NULL。
因此,对于身份验证的用户,我具有预期的新属性:
<properties>
<property key="UserId">ff88ddb9-6f5a-4ad5-a2a8-1d016ff99398</property>
<property key="UserName">ernst</property>
<properties>
Run Code Online (Sandbox Code Playgroud)
但是我也想将这些值添加到它们自己的列中,以进行一些查询优化。
代码是.NET Core 2.1+,并且我已经设置了Serilog,如https://github.com/serilog/serilog-aspnetcore/blob/dev/samples/SimpleWebSample/Program.cs所示:
private static IConfiguration Configuration { get; } = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
.AddEnvironmentVariables()
.Build();
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.Enrich.FromLogContext()
.MinimumLevel.Debug()
.CreateLogger();
try
{
Log.Information($"Starting web host in {Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"} environment, version {Util.Version.Long}");
BuildWebHost(args).Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated …Run Code Online (Sandbox Code Playgroud) 我有一个包含多个 .NET Core API 和 Windows 服务的解决方案。如何集成 Serilog,以便不需要在几个不同的位置进行更改来添加列或更改某些属性?
我正在考虑在公共库中添加 Serilog 并在所有其他项目中使用该自定义库,但是如何调用 Serilog 的起点,如我们在 Program.cs 中的以下代码中看到的那样,任何代码参考都会有所帮助。
.UseSerilog((hostingContext, loggerConfiguration) =>
{
loggerConfiguration.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.File(path: Path.Combine(Environment.CurrentDirectory, "Logs", "log.txt"),
rollOnFileSizeLimit: true,
retainedFileCountLimit: 20,
rollingInterval: RollingInterval.Day,
fileSizeLimitBytes: 10000
)
.WriteTo.Console();
})
Run Code Online (Sandbox Code Playgroud)
===============已更新===================
For windows service, I have the code in common library.
public class LogManager : ILogManager
{
public LogManager()
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.Enrich.FromLogContext()
// .WriteTo.Console(LogEventLevel.Debug, OutputTemplate, theme: AnsiConsoleTheme.Code)
.WriteTo.RollingFile(@"C:\Users\hnq6ww\Documents\Important\logs.txt",
LogEventLevel.Verbose,
// OutputTemplate,
retainedFileCountLimit: (int?)RollingInterval.Day,
buffered: true, fileSizeLimitBytes: 10000)
.CreateLogger(); …Run Code Online (Sandbox Code Playgroud) 在文件中的 Serilog 输出中,我看到默认值是
{
"Timestamp": "2016-05-28T21:21:59.0932348+08:00",
"Level": "Information",
"MessageTemplate": "Processed {@Number} records in {@Time} ms",
"Properties": {
"Number": 500,
"Time": 120
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法删除时间戳、级别、消息模板和属性,这样我就只剩下这个了
{
"Number": 500,
"Time": 120
}
Run Code Online (Sandbox Code Playgroud)
Log.Logger 是这样分配的
Log.Logger = new LoggerConfiguration()
.WriteTo.Sink(new FileSink(ConfigurationManager.AppSettings["serilogPath"], new JsonFormatter(), null))
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
谢谢
我实际上是在尝试解决 MSSqlServer 接收器未向我的数据库表写入任何内容的问题。有人建议我连接 SelfLog 以查看发生了什么,但它实际上并没有输出任何内容,我不确定我是否遗漏了什么。这是设置方法:
public SerilogLogger()
{
Serilog.Debugging.SelfLog.Enable(
msg => System.Diagnostics.Trace.WriteLine(msg));
_logger = new LoggerConfiguration()
.WriteTo.MSSqlServer(@"Server=<MyConnectionString>", "Logs")
.WriteTo.Trace()
.CreateLogger();
}
Run Code Online (Sandbox Code Playgroud)
此类中的方法只是调用_logger此处设置的日志方法。我正在创建的日志正在通过跟踪接收器写入输出窗口,但没有任何内容进入数据库并且 Serilog 没有输出任何内容,更不用说任何错误了。我什至故意弄乱连接字符串只是为了让它输出任何东西而不是骰子。有什么想法吗?
我正在尝试在 appsettings .json 文件中指定此过滤器
.Filter.ByExcluding(Matching.FromSource("Microsoft.AspNetCore.Hosting.Internal.WebHost"))
Run Code Online (Sandbox Code Playgroud)
上述语法在 c# 中指定时有效
但是试图在 json 文件中指定相同的内容是行不通的。
"Filter": [
{
"Name": "ByExcluding",
"Args": {
"expression": "Matching.FromSource = 'Microsoft.AspNetCore.Hosting.Internal.WebHost'"
}
}
Run Code Online (Sandbox Code Playgroud) 弄清楚了 Serilog 的基础知识。现在尝试添加一些丰富器,以便我可以在每个日志行中打印用户名或机器名或类名等。
这是我到目前为止的代码,
using System;
using Serilog;
using Serilog.Sinks.SystemConsole;
using Serilog.Sinks.File;
using Serilog.Enrichers;
using Serilog.Core;
using Serilog.Events;
using System.Threading;
using Serilog.Context;
var outputTemplate = "{MachineName} | {UserName} | {Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u4}] | {ClassName} | {Message:l}{NewLine}{Exception}";
var Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console(outputTemplate: outputTemplate)
.WriteTo.File("logFile-.log",
outputTemplate: outputTemplate)
.Enrich.FromLogContext()
.Enrich.WithEnvironmentUserName()
.Enrich.WithProperty("Version", "1.0.0")
.CreateLogger();
Logger.Information("Hello, Serilog!");
var position = new { Latitude = 25, Longitude = 134 };
var elapsedMs = 35;
for (int i = 0; i < 5; i++) …Run Code Online (Sandbox Code Playgroud)