# AppLogger **Namespace:** `FrymasterBadgeApp` **Type:** `static class` **Purpose:** Centralized, thread-safe logging utility that writes timestamped messages to daily rotating log files, console, and debug output. Includes automatic file rotation and scheduled cleanup. ## 🔑 Fields | Name | Type | Access | Description | |------|------|--------|-------------| | `LogDirectory` | `string` | `private static readonly` | Path to `%LOCALAPPDATA%` where logs are stored. | | `BaseLogName` | `string` | `private static readonly` | Base filename prefix (`FrymasterBadgeApp`). | | `MaxFileSizeBytes` | `long` | `private static readonly` | Maximum log file size before rotation (`5 MB`). | | `_lock` | `object` | `private static readonly` | Synchronization object for thread-safe file writes. | ## 🛠 Constructor ### `static AppLogger()` - **Access:** `static` - **Behavior:** Automatically logs a `DEBUG` message upon first access to confirm initialization. ## 📦 Methods ### `GetCurrentLogPath()` - **Access:** `private static` - **Returns:** `string` - **Behavior:** Constructs a log file path using the current date in `yyyy-MM-dd` format (e.g., `...\FrymasterBadgeApp_2026-04-13.log`). ### `Info(string message)` - **Access:** `public static` - **Parameters:** | Name | Type | Description | |------|------|-------------| | `message` | `string` | The informational text to log. | - **Behavior:** Wrapper that calls `Log("INFO ", message)`. ### `Warn(string message)` - **Access:** `public static` - **Parameters:** `message` (`string`) - **Behavior:** Logs a warning-level message (`"WARN "`). ### `Warning(string message)` - **Access:** `public static` - **Parameters:** `message` (`string`) - **Behavior:** Alias for `Warn`, logs `"WARNING "` level. ### `Error(string message, Exception? ex = null)` - **Access:** `public static` - **Parameters:** | Name | Type | Description | |------|------|-------------| | `message` | `string` | Primary error description. | | `ex` | `Exception?` | Associated exception (optional). | - **Behavior:** Appends `\nException: {ex}` if `ex` is provided, then logs at `"ERROR "` level. ### `Debug(string message)` - **Access:** `public static` - **Parameters:** `message` (`string`) - **Behavior:** Logs at `"DEBUG"` level. Wrapped in `#if DEBUG`, so calls are compiled out in Release builds. ### `Log(string level, string message)` - **Access:** `private static` - **Parameters:** | Name | Type | Description | |------|------|-------------| | `level` | `string` | Log level string (`INFO`, `ERROR`, etc.) | | `message` | `string` | Log content. | - **Behavior:** 1. Formats timestamp (`yyyy-MM-dd HH:mm:ss.fff`). 2. Acquires `_lock` for thread safety. 3. Checks if current log exceeds `MaxFileSizeBytes`. If so, renames to `.old` (deleting existing `.old` first). 4. Appends formatted line to file. Catches & logs `Console.WriteLine` if file I/O fails. 5. Writes to `Console` and `System.Diagnostics.Debug`. ### `CleanupOldLogs(int daysToKeep = 30)` - **Access:** `public static` - **Parameters:** `daysToKeep` (`int`, default: `30`) - **Behavior:** Scans `LogDirectory` for `FrymasterBadgeApp_*.log`, checks `File.GetCreationTime`, and deletes expired files. Exceptions during deletion are silently caught. --- **Notes:** - Thread-safe via `lock (_lock)`. - Log rotation prevents unbounded disk growth. - Safe to call from any thread.