markbattistella/simplelogger
`SimpleLogger` is a modern Swift logging utility built on Apple's Unified Logging system (`OSLog`). It provides strongly typed categories, queryable log access, advanced time-based filtering, and multiple export formats, designed primarily for SwiftUI applications.
Features
- Type-safe logger categories with duplicate detection
- Unified Logging integration (
OSLog) - Observable log manager for SwiftUI
- Advanced filtering
- Specific date - Date range - Hour range - Rolling presets (minutes → years)
- Export formats
- Plain text - JSON - JSON Lines (.jsonl) - CSV (configurable delimiters) - Optional gzip compression
- System log exclusion
- Severity-level filtering
Installation
Add SimpleLogger to your Swift project using Swift Package Manager.
dependencies: [
.package(
url: "https://github.com/markbattistella/SimpleLogger",
from: "1.0.0"
)
]Alternatively, you can add SimpleLogger using Xcode by navigating to File > Add Packages and entering the package repository URL.
Usage
### Basic Usage
`SimpleLogger` wraps over `OSLog.Logger` under a simplified name and provides a convenience initialiser that automatically uses your app's bundle identifier as the subsystem.
```swift
import SimpleLogger
let logger = Logger(category: .ui)
logger.info("User tapped the start button")
```
#### Logger Categories
Categories are strongly typed using `LoggerCategory`.
##### Architecture and Patterns
| Logger Category | Description |
| - | - |
| `routing` | Logger category for routing-related logs. |
| `navigation` | Logger category for navigation-related logs. |
| `stateManagement` | Logger category for state management-related logs. |
| `dependencyInjection` | Logger category for dependency injection-related logs. |
| `observers` | Logger category for observer-related logs. |
| `publishers` | Logger category for publisher-related logs. |
| `subscribers` | Logger category for subscriber-related logs. |
| `events` | Logger category for event-related logs. |
| `signals` | Logger category for signal-related logs. |
##### Miscellaneous
| Logger Category | Description |
| - | - |
| `analytics` | Logger category for analytics-related logs. |
| `configuration` | Logger category for configuration-related logs. |
| `errorHandling` | Logger category for error handling-related logs. |
| `logging` | Logger category for logging-related logs. |
| `configurationManagement` | Logger category for configuration management-related logs. |
| `imageProcessing` | Logger category for image processing-related logs. |
| `videoProcessing` | Logger category for video processing-related logs. |
| `audioProcessing` | Logger category for audio processing-related logs. |
| `sensors` | Logger category for sensor-related logs. |
| `camera` | Logger category for camera-related logs. |
| `location` | Logger category for location-related logs. |
| `maps` | Logger category for maps-related logs. |
##### Networking and Connectivity
| Logger Category | Description |
| - | - |
| `network` | Logger category for network-related logs. |
| `api` | Logger category for API-related logs. |
| `upload` | Logger category for upload-related logs. |
| `download` | Logger category for download-related logs. |
| `sync` | Logger category for synchronisation-related logs. |
| `connectivity` | Logger category for connectivity-related logs. |
| `reachability` | Logger category for reachability-related logs. |
| `streaming` | Logger category for streaming-related logs. |
| `bluetooth` | Logger category for Bluetooth-related logs. |
##### Performance and Optimisation
| Logger Category | Description |
| - | - |
| `performance` | Logger category for performance-related logs. |
| `memoryManagement` | Logger category for memory management-related logs. |
| `concurrency` | Logger category for concurrency-related logs. |
| `threading` | Logger category for threading-related logs. |
| `debugging` | Logger category for debugging-related logs. |
| `monitoring` | Logger category for monitoring-related logs. |
##### Data Management and Persistence
| Logger Category | Description |
| - | - |
| `coreData` | Logger category for Core Data-related logs. |
| `swiftData` | Logger category for Swift Data-related logs. |
| `database` | Logger category for database-related logs. |
| `caching` | Logger category for caching-related logs. |
| `persistence` | Logger category for persistence-related logs. |
| `serialization` | Logger category for serialisation-related logs. |
| `deserialization` | Logger category for deserialisation-related logs. |
| `parsing` | Logger category for parsing-related logs. |
| `keychain` | Logger category for keychain-related logs. |
| `userDefaults` | Logger category for UserDefaults-related logs. |
| `backup` | Logger category for backup-related logs. |
| `restore` | Logger category for restore-related logs. |
##### Security and Permissions
| Logger Category | Description |
| - | - |
| `security` | Logger category for security-related logs. |
| `encryption` | Logger category for encryption-related logs. |
| `decryption` | Logger category for decryption-related logs. |
| `permissions` | Logger category for permissions-related logs. |
| `authentication` | Logger category for authentication-related logs. |
| `authorization` | Logger category for authorisation-related logs. |
##### System and OS
| Logger Category | Description |
| - | - |
| `lifecycle` | Logger category for lifecycle-related logs. |
| `initialization` | Logger category for initialisation-related logs. |
| `deinitialization` | Logger category for de-initialisation-related logs. |
| `fileSystem` | Logger category for file system-related logs. |
| `backgroundTasks` | Logger category for background tasks-related logs. |
| `scheduling` | Logger category for scheduling-related logs. |
| `notifications` | Logger category for notifications-related logs. |
| `timers` | Logger category for timers-related logs. |
##### Testing and Validation
| Logger Category | Description |
| - | - |
| `testing` | Logger category for testing-related logs. |
| `unitTesting` | Logger category for unit testing-related logs. |
| `integrationTesting` | Logger category for integration testing-related logs. |
| `uiTesting` | Logger category for UI testing-related logs. |
| `mocking` | Logger category for mocking-related logs. |
| `stubbing` | Logger category for stubbing-related logs. |
| `validation` | Logger category for validation-related logs. |
##### UI and User Interaction
| Logger Category | Description |
| - | - |
| `ui` | Logger category for UI-related logs. |
| `gestures` | Logger category for gesture-related logs. |
| `animations` | Logger category for animation-related logs. |
| `transitions` | Logger category for transition-related logs. |
| `accessibility` | Logger category for accessibility-related logs. |
| `localization` | Logger category for localisation-related logs. |
| `internationalization` | Logger category for internationalisation-related logs. |
| `theming` | Logger category for theming-related logs. |
| `styling` | Logger category for styling-related logs. |
| `layout` | Logger category for layout-related logs. |
| `rendering` | Logger category for rendering-related logs. |
##### Utilities and Helpers
| Logger Category | Description |
| - | - |
| `utils` | Logger category for utility-related logs. |
| `extensions` | Logger category for extension-related logs. |
| `helpers` | Logger category for helper-related logs. |
| `factories` | Logger category for factory-related logs. |
| `builders` | Logger category for builder-related logs. |
| `commands` | Logger category for command-related logs. |
| `handlers` | Logger category for handler-related logs. |
| `middlewares` | Logger category for middleware-related logs. |
| `interceptors` | Logger category for interceptor-related logs. |
#### Custom Categories
You can define your own categories safely:
```swift
extension LoggerCategory {
static let payments = LoggerCategory("Payments")
}
let logger = Logger(category: .payments)
```
If a duplicate category is registered at runtime (case-insensitive), `SimpleLogger` logs a warning automatically.
### LoggerManager
`LoggerManager` is the central observable object for fetching, filtering, and exporting logs.
```swift
import SwiftUI
import SimpleLogger
@main
struct MyApp: App {
@StateObject private var loggerManager = LoggerManager()
var body: some Scene {
WindowGroup {
ContentView()
.environment(loggerManager)
}
}
}
```
### Filtering Logs
Filtering is controlled by a filter kind plus associated state.
#### Filter Kinds
```swift
loggerManager.kind = .specificDate
```
Available kinds:
- `.specificDate`
- `.dateRange`
- `.hourRange`
- `.preset`
#### Specific Date
```swift
loggerManager.kind = .specificDate
loggerManager.specificDate = Date()
```
#### Date Range
```swift
loggerManager.kind = .dateRange
loggerManager.dateRangeStart = startDate
loggerManager.dateRangeEnd = endDate
```
#### Hour Range
```swift
loggerManager.kind = .hourRange
loggerManager.hourRangeDate = Date()
loggerManager.hourRangeStartHour = 9
loggerManager.hourRangeEndHour = 17
```
#### Presets
```swift
loggerManager.kind = .preset
loggerManager.preset = .lastTwentyFourHours
```
Presets range from 5 minutes up to 1 year, grouped logically for UI presentation.
### Log Levels
You can filter by severity:
```swift
loggerManager.levels = [.error, .fault]
```
Available levels:
- `debug`
- `info`
- `notice`
- `error`
- `fault`
### Fetching Logs
Fetching is explicit and cancellable.
```swift
loggerManager.fetch()
```
State exposed for UI:
- `logs`
- `isFetching`
- `hasValidResults`
- `lastError`
### Exporting Logs
Exports are asynchronous and return `Result<Data, LoggerManagerError>`.
Supported Formats
```text
.log
.json
.jsonLines
.csv(.comma | .semicolon | .tab | .pipe)
.gzip(Format)
```
#### Example
```swift
let result = await loggerManager.export(
format: .gzip(.jsonLines)
)
switch result {
case .success(let data):
// write data to file
case .failure(let error):
print(error.localizedDescription)
}
```
#### CSV Delimiters
```text
.csv(.semicolon)
.csv(.tab)
```
All CSV values are safely quoted and escaped.
### Error Handling
Errors are surfaced via `LoggerManagerError`:
```swift
.fetch(Error)
.export(Error)
```
Each error provides a user-friendly `errorDescription`.Contributing
Contributions are welcome! Please fork the repository and submit a pull request for any features, fixes, or improvements.
License
SimpleLogger is available under the MIT license. See the LICENCE file for more information.
Package Metadata
Repository: markbattistella/simplelogger
Default branch: main
README: README.md