70 lines
3.0 KiB
Markdown
70 lines
3.0 KiB
Markdown
# Remote Log Writers
|
||
|
||
Client-side log writers sending log data to remote endpoints. Source: `Loggers/`. Core logging framework: `AyCode.Core/AyCode.Core/docs/LOGGING/README.md` | Server-side GlobalLogger: `AyCode.Core.Server/docs/LOGGING/README.md`.
|
||
|
||
## AcBrowserConsoleLogWriter
|
||
|
||
Blazor browser console writer. Extends `AcTextLogWriterBase` (text branch, not structured). Uses `IJSRuntime` to invoke browser console methods:
|
||
|
||
| LogLevel | JS method |
|
||
|----------|-----------|
|
||
| Detail – Suggest | `console.info` |
|
||
| Warning | `console.warn` |
|
||
| Error | `console.error` |
|
||
|
||
Implements `IAcLogWriterClientBase` (client-side marker).
|
||
|
||
## AcHttpClientLogItemWriter\<TLogItem\>
|
||
|
||
HTTP POST writer. Extends `AcLogItemWriterBase<TLogItem>` (structured branch). Manages its own `HttpClient` + `HttpClientHandler`. Sends log items as JSON:
|
||
|
||
```csharp
|
||
_httpClient.PostAsJsonAsync(_url, logItem).Forget();
|
||
```
|
||
|
||
Note: `Forget()` — fire-and-forget, no await on the HTTP response. HTTP/2 by default.
|
||
|
||
## AcSignaRClientLogItemWriter
|
||
|
||
SignalR log transport writer. Extends `AcLogItemWriterBase<AcLogItemClient>`. Sends items to a dedicated logger hub. Manages its own `HubConnection`:
|
||
|
||
```csharp
|
||
_hubConnection.SendAsync("AddLogItem", logItem).Forget();
|
||
```
|
||
|
||
**UTC conversion note:** SignalR doesn't transmit `DateTime.Kind`. The writer calls `logItem.TimeStampUtc.ToUniversalTime()` before sending to ensure the server receives actual UTC.
|
||
|
||
Connection lifecycle: `StartConnection()` waits up to 10s for `Connected` state. `StopConnection()` stops and disposes the hub.
|
||
|
||
## Remote Logging Flow
|
||
|
||
Client applications can send log items to a server via SignalR:
|
||
|
||
```
|
||
Client App Server
|
||
────────── ──────
|
||
AcSignaRClientLogItemWriter AcLoggerSignalRHub<TLogger>
|
||
│ │
|
||
│ logItem.ToUniversalTime() │
|
||
│ StartConnection() │
|
||
├──SendAsync("AddLogItem", item)──► │
|
||
│ ├─ logItem.TimeStampUtc = UtcNow
|
||
│ ├─ _logger.Write(logItem)
|
||
│ │ ├─ Console writer
|
||
│ │ ├─ DB writer
|
||
│ │ └─ ... (all server writers)
|
||
```
|
||
|
||
Note: `AcLoggerSignalRHub` overrides client's `TimeStampUtc` with `DateTime.UtcNow` server-side for authoritative timestamps. The hub is a simple `Hub` (not `AcWebSignalRHubBase`) — does NOT use tag-based dispatch.
|
||
|
||
## Key Source Files
|
||
|
||
| Component | Path |
|
||
|-----------|------|
|
||
| Browser writer | `Loggers/AcBrowserConsoleLogWriter.cs` |
|
||
| HTTP writer | `Loggers/AcHttpClientLogItemWriter.cs` |
|
||
| SignalR writer | `Loggers/AcSignaRClientLogItemWriter.cs` |
|
||
| Structured writer base | `AyCode.Entities/AcLogItemWriterBase.cs` |
|
||
| DB writer | `AyCode.Database/AcDbLogItemWriter.cs` |
|
||
| Logger hub (server) | `AyCode.Services.Server/SignalRs/AcLoggerSignalRHub.cs` |
|