小编mos*_*aka的帖子

如何配置`Serilog`以使用cofig文件写入应用程序目录?

Serilog在一个.net core. 我想配置应用程序目录的日志路径。

我看到有一个扩展https://github.com/serilog/serilog-settings-configuration可以SerilogConfiguration. 在示例中,路径配置为"%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”中。

c# serilog .net-core

9
推荐指数
1
解决办法
1万
查看次数

Serilog `rollOnFileSizeLimit` 不适用于配置文件

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这是我告诉从配置中读取的代码: …

c# serilog .net-core

8
推荐指数
1
解决办法
7647
查看次数

.net 核心`IHostedService` 是否应该启动一个新线程

.net coreBackgroundServiceIHostedService的 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 之前,不会将消息写入控制台 …

async-await .net-core asp.net-core-hosted-services

4
推荐指数
1
解决办法
4390
查看次数

如何创建一个“Observable”来观察“FileSystemWatcher”中的“Renamed”和“Changed”事件

我想创建一个Reactive Observable,它可以同时观察Renamed和。Changed

我正在监视文件夹中是否有已修改和重命名的文件FileSystemWatcher。我只想在事件稳定下来后处理该事件(因为有时Changed事件可能会引发多次)。所以我选择Throttle.net的功能Reactive Extension

我可以通过观察单个Changed事件来完成这项工作,但无法弄清楚如何ChangedRenamed单个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 告诉我 …

filesystemwatcher system.reactive .net-core

1
推荐指数
1
解决办法
211
查看次数