我Serilog在一个.net core. 我想配置应用程序目录的日志路径。
我看到有一个扩展https://github.com/serilog/serilog-settings-configuration可以Serilog从Configuration. 在示例中,路径配置为"%TEMP%\\Logs\\serilog-configuration-sample.txt". 如何将其设置为工作目录?
我已经搜索过了,并且知道它可以通过代码来完成,但似乎没有人问如何通过配置文件来做到这一点,即appsettings.json.
当前配置:
{
"Serilog": {
"Using": [
"Serilog.Sinks.File"
],
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{
"Name": "File",
"Args": { "path": "Logs\\serilog-configuration-sample.txt" }
}
],
"Enrich": [ "FromLogContext", "WithMachineName" ],
"Destructure": [
],
"Properties": {
}
},
"AllowedHosts": "*"
}
Run Code Online (Sandbox Code Playgroud)
我希望将日志路径设置为工作目录。但目前它在“C:\Program Files\IIS Express”中。
当Serilog通过配置文件(使用 nuget 包Serilog.Settings.Configuration)进行配置时,达到大小限制时不会创建滚动日志文件。
正如这个问题和这个问题中所建议的,我正在使用Serlog.Sinks.File(版本4.0.0),但未创建滚动文件。
这是我的 Serilog 配置文件appsettings.json:
{
"Serilog": {
"Using": [
"Serilog.Sinks.File",
"Serilog.Sinks.Console"
],
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "%LogPath%\\Logs\\log.txt",
"rollOnFileSizeLimit ": true,
"retainedFileCountLimit ": 20,
"rollingInterval": "Day",
"fileSizeLimitBytes": 10000
}
},
{
"Name": "Console"
}
],
"Enrich": [ "FromLogContext", "WithMachineName" ],
"Destructure": [
],
"Properties": {
}
}
}
Run Code Online (Sandbox Code Playgroud)
Serilog这是我告诉从配置中读取的代码: …
.net coreBackgroundService或IHostedService的 start 方法是异步的:
//IHostedService
Task StartAsync(CancellationToken cancellationToken);
//BackgroundService
Task ExecuteAsync(CancellationToken stoppingToken);
Run Code Online (Sandbox Code Playgroud)
那么我应该在ExecuteAsync/StartAsync方法中编写所有逻辑,还是应该启动一个新线程并立即返回?
例如,以下哪两个是正确的实现?
1.
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
new Thread(async () => await DoWork(stoppingToken)).Start();
await Task.CompletedTask;
}
private async Task DoWork(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
//actual works
}
Run Code Online (Sandbox Code Playgroud)
2.
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
//actual works
await Task.Delay(1000);//e.g
}
}
Run Code Online (Sandbox Code Playgroud)
从语义上讲,我认为第二个似乎是正确的,但是如果有几个IHostedServices,它们可以与第二种形式并行运行吗?
编辑 1
我还编写了一个示例程序,说明托管服务本身不是作为单独的线程运行的。
在"Waiting for signal.."我键入 a 之前,不会将消息写入控制台 …
我想创建一个Reactive Observable,它可以同时观察Renamed和。Changed
我正在监视文件夹中是否有已修改和重命名的文件FileSystemWatcher。我只想在事件稳定下来后处理该事件(因为有时Changed事件可能会引发多次)。所以我选择Throttle.net的功能Reactive Extension。
我可以通过观察单个Changed事件来完成这项工作,但无法弄清楚如何Changed在Renamed单个Observable.
这是我为单个Changed事件所做的事情:
var watcher = new FileSystemWatcher();
watcher.Path = "d:\\test";
var observable = Observable.FromEventPattern<FileSystemEventHandler, FileSystemEventArgs>(
ev => watcher.Changed += ev,
ev => watcher.Changed -= ev
);
var d = observable.Throttle(TimeSpan.FromSeconds(5))
.Subscribe(
a => Console.WriteLine($"Watcher type:{a.EventArgs.ChangeType }, file:{a.EventArgs.Name }, sender: {a.Sender}"),
ex => Console.WriteLine("observer error:" + ex.ToString()),
() => Console.WriteLine("observer complete.")
);
Run Code Online (Sandbox Code Playgroud)
但是当我想观看这两个事件时,VS 告诉我 …