Skip to content

Commit 59ede69

Browse files
committed
fixed logging and improved background task execution
1 parent 83c6b73 commit 59ede69

File tree

4 files changed

+82
-103
lines changed

4 files changed

+82
-103
lines changed

KernelMemory.FileWatcher/KernelMemory.FileWatcher.csproj

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,35 +5,26 @@
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
8-
<DockerfileRunArguments>-v G:\docker\km-filewatcher\appsettings.json:/config/appsettings.json:rw -v G:\tmp\km-filewatcher\folder_02:/data/folder_02:ro</DockerfileRunArguments>
9-
<ContainerRepository>km-filewatcher</ContainerRepository>
108
</PropertyGroup>
119
<ItemGroup>
12-
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0">
13-
<TreatAsUsed>true</TreatAsUsed>
14-
</PackageReference>
10+
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
1511
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0" />
16-
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0">
17-
<TreatAsUsed>true</TreatAsUsed>
18-
</PackageReference>
12+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
1913
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
2014
<PackageReference Include="Microsoft.Extensions.Http" Version="8.0.0" />
2115
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="8.0.3" />
22-
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0">
23-
<TreatAsUsed>true</TreatAsUsed>
24-
</PackageReference>
16+
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
2517
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" />
2618
<PackageReference Include="Microsoft.Extensions.ObjectPool" Version="8.0.3" />
2719
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.5" />
2820
<PackageReference Include="Polly.Contrib.WaitAndRetry" Version="1.1.1" />
29-
<PackageReference Include="Serilog" Version="3.1.1">
30-
<TreatAsUsed>true</TreatAsUsed>
31-
</PackageReference>
32-
<PackageReference Include="Serilog.Extensions.Hosting" Version="8.0.0" />
33-
<PackageReference Include="Serilog.Settings.Configuration" Version="8.0.0" />
34-
<PackageReference Include="Serilog.Sinks.Console" Version="5.0.1">
35-
<TreatAsUsed>true</TreatAsUsed>
36-
</PackageReference>
21+
<PackageReference Include="Serilog" Version="4.0.0"/>
22+
<PackageReference Include="Serilog.Enrichers.Environment" Version="3.0.0"/>
23+
<PackageReference Include="Serilog.Enrichers.Thread" Version="4.0.0"/>
24+
<PackageReference Include="Serilog.Extensions.Hosting" Version="8.0.0"/>
25+
<PackageReference Include="Serilog.Settings.Configuration" Version="8.0.1"/>
26+
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0"/>
27+
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0"/>
3728
</ItemGroup>
3829
<ItemGroup>
3930
<None Update="appsettings.json">

KernelMemory.FileWatcher/Program.cs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Polly.Contrib.WaitAndRetry;
99
using Polly.Extensions.Http;
1010
using Serilog;
11+
using Serilog.Events;
1112

1213
namespace KernelMemory.FileWatcher
1314
{
@@ -16,7 +17,6 @@ public class Program
1617
static async Task Main(string[] args)
1718
{
1819
using var host = CreateHostBuilder(args).Build();
19-
2020
StartWatcher(host.Services);
2121

2222
await host.RunAsync();
@@ -33,17 +33,20 @@ private static void StartWatcher(IServiceProvider services)
3333

3434
private static IHostBuilder CreateHostBuilder(string[] args)
3535
{
36+
Log.Logger = new LoggerConfiguration()
37+
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
38+
.Enrich.FromLogContext()
39+
.WriteTo.Console()
40+
.CreateBootstrapLogger();
41+
3642
var basePath = File.Exists("/config/appsettings.json") ? "/config" : AppContext.BaseDirectory;
3743
var configuration = new ConfigurationBuilder()
3844
.SetBasePath(basePath)
3945
.AddJsonFile("appsettings.json", false)
4046
.AddUserSecrets<Program>()
47+
.AddEnvironmentVariables()
4148
.Build();
4249

43-
Log.Logger = new LoggerConfiguration()
44-
.ReadFrom.Configuration(configuration)
45-
.CreateLogger();
46-
4750
return Host.CreateDefaultBuilder(args)
4851
.ConfigureAppConfiguration(builder =>
4952
{
@@ -52,9 +55,15 @@ private static IHostBuilder CreateHostBuilder(string[] args)
5255
})
5356
.ConfigureServices(services =>
5457
{
58+
services.AddSerilog((services, lc) => lc
59+
.ReadFrom.Services(services)
60+
.Enrich.FromLogContext()
61+
.WriteTo.Console()
62+
.WriteTo.File(Path.Exists("/config/logs") ? "/config/logs/km-filewatcher.log" : "logs/km-filewatcher.log", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 14)
63+
.MinimumLevel.Warning()
64+
.ReadFrom.Configuration(configuration));
5565
services.Configure<FileWatcherOptions>(configuration.GetSection("FileWatcher"));
5666
services.Configure<KernelMemoryOptions>(configuration.GetSection("KernelMemory"));
57-
services.AddLogging(c => c.AddSerilog().AddConsole());
5867
services.AddSingleton<IMessageStore, MessageStore>();
5968
services.AddHttpClient("km-client", client =>
6069
{

KernelMemory.FileWatcher/Services/HttpWorker.cs

Lines changed: 53 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,15 @@
33
using Microsoft.Extensions.Hosting;
44
using Microsoft.Extensions.Logging;
55
using Microsoft.Extensions.Options;
6-
using System.Threading;
7-
using Serilog.Data;
86

97
namespace KernelMemory.FileWatcher.Services
108
{
11-
internal class HttpWorker : IHostedService, IDisposable
9+
internal class HttpWorker : BackgroundService
1210
{
1311
private readonly ILogger<HttpWorker> logger;
1412
private readonly IHttpClientFactory httpClientFactory;
1513
private readonly IMessageStore store;
1614
private readonly KernelMemoryOptions options;
17-
private PeriodicTimer? timer;
1815

1916
public HttpWorker(ILogger<HttpWorker> logger, IOptions<KernelMemoryOptions> options, IHttpClientFactory httpClientFactory, IMessageStore messageStore)
2017
{
@@ -24,79 +21,72 @@ public HttpWorker(ILogger<HttpWorker> logger, IOptions<KernelMemoryOptions> opti
2421
this.store = messageStore;
2522
}
2623

27-
public async Task StartAsync(CancellationToken cancellationToken)
24+
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
2825
{
29-
logger.LogInformation("Starting HttpWorker");
30-
timer = new PeriodicTimer(options.Schedule);
31-
while (await timer.WaitForNextTickAsync(cancellationToken))
26+
this.logger.LogInformation("Starting HttpWorker");
27+
28+
using PeriodicTimer timer = new PeriodicTimer(options.Schedule);
29+
try
3230
{
33-
var messages = store.TakeAll();
34-
if (messages.Any())
31+
while (await timer.WaitForNextTickAsync(stoppingToken) && !stoppingToken.IsCancellationRequested)
3532
{
36-
var tasks = new List<Action>();
37-
38-
foreach (var message in messages)
33+
var messages = store.TakeAll();
34+
if (messages.Any())
3935
{
40-
tasks.Add(async () =>
36+
var parallelOptions = new ParallelOptions
4137
{
42-
if (message.Event?.EventType != FileEventType.Ignore)
43-
{
44-
logger.LogInformation($"Processing message {message.DocumentId} for file {message.Event?.FileName} of type {message.Event?.EventType}");
45-
var client = httpClientFactory.CreateClient("km-client");
46-
string endpoint;
47-
HttpResponseMessage? response = null;
48-
49-
if (message.Event is { EventType: FileEventType.Upsert })
50-
{
51-
endpoint = "/upload";
38+
CancellationToken = stoppingToken,
39+
MaxDegreeOfParallelism = options.ParallelUploads
40+
};
41+
Parallel.Invoke(parallelOptions, messages.Select(message => (Action)(() => BuildMessageTask(message, stoppingToken))).ToArray());
42+
}
43+
else
44+
{
45+
logger.LogInformation("Nothing to process");
46+
47+
}
48+
}
49+
} catch (OperationCanceledException)
50+
{
51+
this.logger.LogInformation("Stopping HttpWorker");
52+
}
53+
}
5254

53-
var content = new MultipartFormDataContent();
54-
var fileContent = new StreamContent(File.OpenRead(message.Event.Directory));
55-
content.Add(fileContent, "file", message.Event.FileName);
56-
content.Add(new StringContent(message.Index), "index");
57-
content.Add(new StringContent(message.DocumentId), "documentid");
58-
response = await client.PostAsync(endpoint, content);
59-
}
60-
else if (message.Event is { EventType: FileEventType.Delete })
61-
{
62-
endpoint = $"/documents?index={message.Index}&documentId={message.DocumentId}";
63-
response = await client.DeleteAsync(endpoint);
64-
}
55+
private async Task BuildMessageTask(Message message, CancellationToken stoppingToken)
56+
{
57+
if (message.Event?.EventType != FileEventType.Ignore)
58+
{
59+
logger.LogInformation($"Processing message {message.DocumentId} for file {message.Event?.FileName} of type {message.Event?.EventType}");
60+
var client = httpClientFactory.CreateClient("km-client");
61+
string endpoint;
62+
HttpResponseMessage? response = null;
6563

66-
if (response is { IsSuccessStatusCode: true })
67-
{
68-
logger.LogInformation($"Sent message {message.DocumentId} to {options.Endpoint}");
69-
}
70-
else
71-
{
72-
logger.LogError($"Failed to send message {message.DocumentId} to {options.Endpoint}");
73-
}
74-
}
75-
});
76-
}
64+
if (message.Event is { EventType: FileEventType.Upsert })
65+
{
66+
endpoint = "/upload";
7767

78-
var parallelOptions = new ParallelOptions
79-
{
80-
CancellationToken = cancellationToken,
81-
MaxDegreeOfParallelism = options.ParallelUploads
82-
};
83-
Parallel.Invoke(parallelOptions, tasks.ToArray());
68+
var content = new MultipartFormDataContent();
69+
var fileContent = new StreamContent(File.OpenRead(message.Event.Directory));
70+
content.Add(fileContent, "file", message.Event.FileName);
71+
content.Add(new StringContent(message.Index), "index");
72+
content.Add(new StringContent(message.DocumentId), "documentid");
73+
response = await client.PostAsync(endpoint, content, stoppingToken);
74+
}
75+
else if (message.Event is { EventType: FileEventType.Delete })
76+
{
77+
endpoint = $"/documents?index={message.Index}&documentId={message.DocumentId}";
78+
response = await client.DeleteAsync(endpoint, stoppingToken);
79+
}
8480

81+
if (response is { IsSuccessStatusCode: true })
82+
{
83+
logger.LogInformation($"Sent message {message.DocumentId} to {options.Endpoint}");
8584
}
8685
else
8786
{
88-
logger.LogInformation("Nothing to process");
87+
logger.LogError($"Failed to send message {message.DocumentId} to {options.Endpoint}");
8988
}
9089
}
9190
}
92-
93-
public Task StopAsync(CancellationToken cancellationToken)
94-
{
95-
return Task.CompletedTask;
96-
}
97-
public void Dispose()
98-
{
99-
timer?.Dispose();
100-
}
10191
}
10292
}

KernelMemory.FileWatcher/appsettings.json

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,20 @@
11
{
22
"Serilog": {
3-
"Using": [ "Serilog.Sinks.Console" ],
4-
"MinimumLevel": "Debug",
5-
"WriteTo": [
6-
{ "Name": "Console" }
7-
]
3+
"MinimumLevel": "Information"
84
},
95
"FileWatcher": {
106
"Directories": [
11-
//{
12-
// "Path": "G:\\tmp\\km-filewatcher\\folder_01",
13-
// "Filter": "*.md",
14-
// "Index": "folder-01",
15-
// "IncludeSubdirectories": true,
16-
// "InitialScan": true
17-
//},
187
{
19-
"Path": "G:\\tmp\\km-filewatcher\\folder_02",
8+
"Path": "/tmp/tmp-docs/",
209
"Filter": "*.md",
21-
"Index": "folder-02",
10+
"Index": "tmp",
2211
"IncludeSubdirectories": true,
2312
"InitialScan": true
2413
}
2514
]
2615
},
2716
"KernelMemory": {
28-
"Endpoint": "http://192.168.65.2:9001",
17+
"Endpoint": "http://192.168.56.2:9001",
2918
"Schedule": "00:00:30",
3019
"Retries": 5,
3120
"ParallelUploads": 5

0 commit comments

Comments
 (0)