Code · 58 lines · 1710 bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58# VanDerHeijden.Logging.Redis

Redis log writer for [VanDerHeijden.Logging](https://www.nuget.org/packages/VanDerHeijden.Logging).

Writes batched log entries to a **Redis list** using `RPUSH`. Each entry is serialized as JSON. The list can be consumed by any Redis-compatible consumer such as Logstash, a worker service, or a custom processor via `BLPOP`.

## Installation

```bash
dotnet add package VanDerHeijden.Logging.Redis
```

## Usage

```csharp
var redis = await ConnectionMultiplexer.ConnectAsync("localhost:6379");
var db = redis.GetDatabase();

builder.Logging.AddRedisLogger(
    database: db,
    listKey: "logs",
    ttl: TimeSpan.FromDays(7));   // optional: auto-expire the key
```

## Log entry format (JSON)

```json
{
  "timestamp": "2026-02-22T14:03:12.456Z",
  "level": "Information",
  "category": "MyApp.Service",
  "message": "MyApp.Service: User logged in",
  "exception": null,
  "path": "/api/users/login",
  "method": "POST",
  "clientIp": "203.0.113.42",
  "referer": "https://example.com/login",
  "userAgent": "Mozilla/5.0 ..."
}
```

The HTTP fields are populated automatically when `IHttpContextAccessor` is registered:

```csharp
builder.Services.AddHttpContextAccessor();
```

Outside an HTTP context they are `null` and omitted from the JSON output.

## Notes

- The Redis list grows until consumed. Make sure a consumer drains it via `BLPOP`/`LPOP`.
- Use `ttl` to automatically expire the key if no consumer is configured.
- `fullMode: DropOldest` is the default — under extreme load, oldest log entries are dropped to protect application throughput.

## Repository

[https://github.com/alphons/VanDerHeijden.Logging](https://github.com/alphons/VanDerHeijden.Logging)