在长时间运行的进程(例如Windows服务或ASP.NET应用程序)中,有时需要暂时提高日志级别而不停止应用程序.NLog可以监视日志记录配置文件,并在每次修改时重新读取它们.
https://github.com/nlog/NLog/wiki/Configuration-file#automatic-reconfiguration
Serilog也可以吗?
我们使用Serilog将项目记录到带有Windows服务的数据库中,并且用户希望能够进行手动运行,因此我们创建了一个按钮(在网页上)来调用相同的代码(作为模块,而不是服务本身).
当我们在代码中添加初始化日志以便代码将继续添加到db日志表时,它也会在此之后记录所有http流量.因此,在运行此代码之后,我们希望"关闭"在Web服务器上运行的Logger.有一个简单的方法吗?
Log.Logger = new LoggerConfiguration()
.WriteTo.MSSqlServer(ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString,
"LOGS")
.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) 我有一个asp.net Core项目,我正在尝试添加一个记录器.我选择了我在其他项目中使用过的SeriLog.
但是,当我试图添加" Serilog.AspNetCore "软件包版本2.0.0时,我正在"
包恢复失败.回滚'BackEnd'的包更改.
我的csproj包含以下设置:
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<DockerComposeProjectPath>..\..\docker-compose.dcproj</DockerComposeProjectPath>
<AssemblyName>BackEnd</AssemblyName>
<RootNamespace>BackEnd</RootNamespace>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
Allready已经尝试清除所有nuget缓存,重建,重启VS.
在Win10上运行,Visual Studio 2017 15.3.0
是否有日志可以提供更多详细信息,为什么我收到此错误?任何建议如何解决?
*更新 - 详细的构建日志(感谢@ Leo-MSFT):
...
使用.NETCoreApp检查System.Security.Cryptography.Csp 4.3.0的兼容性,版本= v2.0.
使用.NETCoreApp检查runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple 4.3.0的兼容性,版本= v2.0.
所有包和项目都与.NETCoreApp兼容,版本= v2.0.
检测到的包降级:Microsoft.Extensions.DependencyInjection从2.0.0升级到1.1.1.直接从项目引用包以选择不同的版本.
BackEnd(> = 1.0.0) - > Serilog.AspNetCore(> = 2.0.0) - > Microsoft.Extensions.DependencyInjection(> = 2.0.0)
BackEnd(> = 1.0.0) - > Microsoft.Extensions.DependencyInjection(> = 1.1.1)
包恢复失败.回滚'BackEnd'的包更改.
经过的时间:00:00:01.4928161
==========完成==========
是的,它似乎与" Microsoft.Extensions.DependencyInjection "有关
弄清楚了 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) I am currently trying to change our system configuration to work with Serilog (instead of working with FileBeat as a shipper to LogStash)
We are also working with the log type field (which is easy to configure in the FileBeat config file) in our various queries and for indexing out logs on Elastic.
The problem is that when using Serilog we get the default type logevent, and I didn't find where I can configure it. I want …
我的 ASP.NET Core 2.1 应用程序登录到 Serilog 文件接收器,所有“常见的东西”——即与应用程序相关的东西,如调试、监控、性能等。
但是,我们还需要将其他数据记录到单独的文件中。与应用程序无关,但与客户相关 - 应该进入数据库的那种东西。但是由于遗留原因,该系统上没有数据库,因此需要将数据保存到文件中。显然这不能写入同一个日志文件。
我可以只写一个FileStream. 但我更喜欢使用 Serilog 进行结构化日志记录。
那么有没有办法同时拥有两个记录器?将不同的数据记录到不同的文件接收器。
(如果是这样,我如何将它们注入我的类 - 现在我只注入ILogger<ClassName>.)
我将Serilog配置appsettings.json为通过以下方式通过我的应用程序中的tcp 将条目登录到Logstash中asp net core web api:
{
"Serilog": {
"Using": [ "Serilog.Sinks.Network" ],
"MinimumLevel": {
"Default": "Information"
},
"WriteTo:0": {
"Name": "TCPSink",
"Args": {
"uri": "tcp://172.26.48.39:5066"
}
},
"Properties": {
"app_id": "my-service-api",
"index": "my-app-"
}
},
...
}
Run Code Online (Sandbox Code Playgroud)
但是它记录了太多消息。例如,我在令牌控制器中有一个CreateToken操作方法:
[HttpPost]
public ActionResult<string> CreateToken([FromBody] CredentialsModel credentials)
{
var user = _authentication.Authenticate(credentials);
if (user == null)
{
Log.Warning("Unable to authenticate an user: {Login}, {Password}",
credentials.Username, credentials.Password);
return Unauthorized();
}
return BuildToken();
}
Run Code Online (Sandbox Code Playgroud)
我只需要记录一条消息:
无法验证用户的登录密码
但是Serilog记录以下内容:
请求启动HTTP …