在长时间运行的进程(例如Windows服务或ASP.NET应用程序)中,有时需要暂时提高日志级别而不停止应用程序.NLog可以监视日志记录配置文件,并在每次修改时重新读取它们.
https://github.com/nlog/NLog/wiki/Configuration-file#automatic-reconfiguration
Serilog也可以吗?
来自@nblumhardt的帖子:
然后你可以继续删除任何其他记录器配置:appsettings.json中不需要"Logging"部分,任何地方都不需要AddLogging(),也不需要通过Startup.cs中的ILoggerFactory进行配置.
当我using Serilog;和ILogger我的控制器时,我得到一个例外.
private readonly ILogger _logger;
public CustomersController(ILogger logger)
{
_logger = logger;
}
Run Code Online (Sandbox Code Playgroud)
结果是:
处理请求时发生未处理的异常.
InvalidOperationException:尝试激活"Customers.Api.Controllers.CustomersController"时无法解析类型"Serilog.ILogger"的服务.
我还需要在Startup.ConfigureServices()方法中向DI提供一些信息吗?
据我所知,我的课程课程遵循帖子中的说明.
public class Program
{
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console()
.CreateLogger();
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseSerilog()
.Build();
}
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将日志写入我的db表.
以下是我尝试设置日志记录到SQL Server的细分.
1)安装Nuget包,Serilog和Serilog.Sinks.MSSqlServer
2)我建立了一个名为Logger.cs的类,它包含了Serilog的所有配置:
public static class Logger
{
private static readonly ILogger _Logger;
static Logger()
{
var connStr = "data source=DESKTOP-BLAH;Initial Catalog=DBNAME;Trusted_Connection=True;";
_Logger = new LoggerConfiguration()
.WriteTo.MSSqlServer(connStr, "ApplicationLogs",
columnOptions: GetSqlColumnOptions(), restrictedToMinimumLevel: LogEventLevel.Debug, batchPostingLimit: 1)
.CreateLogger();
Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));
}
public static ColumnOptions GetSqlColumnOptions()
{
var colOptions = new ColumnOptions();
colOptions.Store.Remove(StandardColumn.Properties);
colOptions.Store.Remove(StandardColumn.MessageTemplate);
colOptions.Store.Remove(StandardColumn.Message);
colOptions.Store.Remove(StandardColumn.Exception);
colOptions.Store.Remove(StandardColumn.TimeStamp);
colOptions.Store.Remove(StandardColumn.Level);
colOptions.AdditionalDataColumns = new Collection<DataColumn>
{
new DataColumn{DataType = typeof(DateTime), ColumnName = "LogTimeStamp"},
new DataColumn{DataType = typeof(Int32), ColumnName = "RecordNum"},
new DataColumn{DataType = typeof(string), …Run Code Online (Sandbox Code Playgroud) 我将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 …
我在我的 C# 项目中使用Serilog和serilog-sinks-console,我想知道如何修改控制台输出的格式而不创建全新的格式化程序。我只需要调整一件事信息 java (slf4j/logback) 之类的格式。
由此:
00:19:49 [DBG] Microsoft.AspNetCore.Hosting.Internal.WebHost - App starting
00:19:49 [DBG] Microsoft.AspNetCore.Hosting.Internal.WebHost - App started
Run Code Online (Sandbox Code Playgroud)
进入这个:
00:19:49 [DBG] m.a.h.i.WebHost - App starting
00:19:49 [DBG] m.a.h.i.WebHost - App started
Run Code Online (Sandbox Code Playgroud)
或者只是这个简单的格式:
00:19:49 [DBG] WebHost - App starting
00:19:49 [DBG] WebHost - App started
Run Code Online (Sandbox Code Playgroud) PS 下面的代码工作正常。问题出在显示器和椅子之间。@jpgrassi 的回答让我朝着正确的方向解决了这个问题。
我在 program.cs 中有以下内容:
public class Program {
public static void Main(string[] args) {
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseSerilog((ctx, config) => { config.ReadFrom.Configuration(ctx.Configuration); })
.UseStartup<Startup>();
}
Run Code Online (Sandbox Code Playgroud)
在 appsettings.json 中:
{
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Default": "Information",
"Microsoft": "Information",
"System": "Information"
}
},
"WriteTo": [
{
"Name": "RollingFile",
"Args": {
"pathFormat": "log-{Date}.txt",
}
}
]
},
"AllowedHosts": "*"
}
Run Code Online (Sandbox Code Playgroud)
在控制器中,我写了一个日志_logger.LogWarning("foo");,但文件没有在任何地方写出,我看不到任何错误。
我从 Nuget 导入了以下包:Serilog、Serilog.AspNetCore、Serilog.Settings.Configuration、Serilog.Sinks.RollingFile。
我错过了什么?
在 .Net Core 2.2 API 中,我尝试使用 Serilog 记录到 SQL Server,以利用其结构化日志记录功能。除了标准字段(Id、Timestamp、Level、Message、MessageTemplate、LogEvent)之外,我还需要在每个日志条目中捕获用户名和 IP 地址。我看过这篇文章,但我想在一个地方做这件事,这样开发人员就不必在每个日志语句中手动添加它。我的Startup.csctor 中有以下代码段:
public Startup(IConfiguration configuration)
{
_configuration = configuration;
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.Enrich.FromLogContext()
.Enrich.With<SerilogContextEnricher>()
.CreateLogger();
}
Run Code Online (Sandbox Code Playgroud)
该.Enrich.FromLogContext()调用使静态 LogContext 可供我在自定义中间件中添加自定义属性(用户名和 IP 地址),如下所示:
public class SerilogMiddleware
{
private static readonly ILogger Log = Serilog.Log.ForContext<SerilogMiddleware>();
private readonly RequestDelegate _next;
public SerilogMiddleware(RequestDelegate next)
{
this._next = next ?? throw new ArgumentNullException(nameof(next));
}
public async Task Invoke(HttpContext httpContext)
{
if (httpContext == null) throw new ArgumentNullException(nameof(httpContext)); …Run Code Online (Sandbox Code Playgroud) 我能找到的关于在 ASP .NET Core Web 应用程序ILogger<T>中使用 Serilog 的所有示例都使用 Microsoft 的界面,而不是使用 Serilog 的ILogger界面。
我如何才能使 Serilog 的 ILogger 可以通过构造函数注入?
using Serilog;
public class HomeController : Controller
{
ILogger logger;
public HomeController(ILogger logger)
{
this.logger = logger;
}
public IActionResult Index()
{
this.logger.Information("Index was called");
return View();
}
}
Run Code Online (Sandbox Code Playgroud) 我是编程新手,我正在尝试为 .net 核心项目实现日志记录解决方案。
我想收集默认和 Microsoft 类别日志。
APPSETTING.JSON
{
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"System": "Warning",
"Microsoft": "Information"
},
"File": {
"location": "logs/timeapi.log"
}
},
"EnableSwagger": true
}
Run Code Online (Sandbox Code Playgroud)
程序.CS
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseSerilogRequestLogging();
Run Code Online (Sandbox Code Playgroud)
启动文件
app.UseSerilogRequestLogging(options =>
options.RequestProjection =
r => new { r.IsHttps, QueryString = r.QueryString.Value });
app.UseMvc();
Run Code Online (Sandbox Code Playgroud)
https://github.com/mthamil/AspNetCore.Serilog.RequestLoggingMiddleware
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
Unable to resolve service for type 'Serilog.ILogger' while attempting to activate 'AspNetCore.Serilog.RequestLoggingMiddleware.SerilogRequestMiddleware'.
Run Code Online (Sandbox Code Playgroud) serilog ×10
c# ×6
asp.net-core ×5
logging ×2
.net ×1
.net-core ×1
asp.net-mvc ×1
nuget ×1
sql-server ×1