AyCode.Core/AyCode.Services/docs/LOGGING/README.md

70 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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` |