Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

name: Build

on: [push, pull_request]
on: [push]

jobs:
build:
Expand All @@ -14,3 +14,13 @@ jobs:

- name: Build
run: swift build -v

build-android:
name: Build Android
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: "Test Swift Package on Android"
uses: skiptools/swift-android-action@v2
with:
run-tests: false
4 changes: 2 additions & 2 deletions .github/workflows/swiftlint.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

name: Swiftlint

on: [push, pull_request]
on: [push]

jobs:
swiftlint:
Expand All @@ -14,4 +14,4 @@ jobs:
- name: GitHub Action for SwiftLint with --strict
uses: norio-nomura/action-swiftlint@3.1.0
with:
args: --strict
args: --strict
12 changes: 10 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

name: Test

on: [push, pull_request]
on: [push]

jobs:
test:
Expand All @@ -13,4 +13,12 @@ jobs:
uses: actions/checkout@v4

- name: Test
run: swift test -v --enable-test-discovery --enable-code-coverage --sanitize=thread
run: swift test -v --enable-test-discovery --enable-code-coverage --sanitize=thread

test-android:
name: Test Android
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: "Test Swift Package on Android"
uses: skiptools/swift-android-action@v2

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 5 additions & 2 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import PackageDescription
//swiftlint:disable all
let package = Package(
name: "LogKit",
platforms: [.macOS(.v11), .iOS(.v14), .macCatalyst(.v14), .tvOS(.v14), .watchOS(.v7), .visionOS(.v1)],
products: [
// Products define the executables and libraries produced by a package, and make them visible to other packages.
.library(
Expand All @@ -19,14 +20,16 @@ let package = Package(
],
dependencies: [
// Dependencies declare other packages that this package depends on.
// .package(url: /* package url */, from: "1.0.0"),
.package(url: "https://github.com/skiptools/swift-android-native.git", from: "1.0.0")
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
.target(
name: "LogKit",
dependencies: []),
dependencies: [
.product(name: "AndroidLogging", package: "swift-android-native", condition: .when(platforms: [.android]))
]),
.testTarget(
name: "LogKitTests",
dependencies: ["LogKit"])
Expand Down
18 changes: 10 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
# LogKit

![Build](https://github.com/marekpridal/LogKit/actions/workflows/build.yml/badge.svg) ![Test](https://github.com/marekpridal/LogKit/actions/workflows/test.yml/badge.svg) ![Publish](https://github.com/marekpridal/LogKit/actions/workflows/Publish.yml/badge.svg) ![platforms](https://img.shields.io/badge/platform-iOS%20%7C%20watchOS%20%7C%20tvOS%20%7C%20macOS-333333) [![Swift Package Manager compatible](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager) ![GitHub](https://img.shields.io/github/license/marekpridal/LogKit) ![GitHub All Releases](https://img.shields.io/github/downloads/marekpridal/LogKit/total)
![Build](https://github.com/marekpridal/LogKit/actions/workflows/build.yml/badge.svg) ![Test](https://github.com/marekpridal/LogKit/actions/workflows/test.yml/badge.svg) ![Publish](https://github.com/marekpridal/LogKit/actions/workflows/Publish.yml/badge.svg) ![platforms](https://img.shields.io/badge/platform-iOS%20%7C%20watchOS%20%7C%20tvOS%20%7C%20macOS%20%7C%20visionOS%20%7C%20Android-333333) [![Swift Package Manager compatible](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager) ![GitHub](https://img.shields.io/github/license/marekpridal/LogKit) ![GitHub All Releases](https://img.shields.io/github/downloads/marekpridal/LogKit/total)

LogKit is logging framework to simplify work with `os.log` API provided by Apple.

## Requirements
- iOS 10.0+
- watchOS 3.0+
- macOS 10.12+
- tvOS 10.0+
## Support
- iOS 14.0+
- watchOS 7.0+
- macOS 11+
- tvOS 14.0+
- visionOS 1.0+
- Android

## Installation

Expand All @@ -32,7 +34,7 @@ import PackageDescription
let package = Package(
name: "LogKitExample",
dependencies: [
.package(url: "https://github.com/marekpridal/LogKit", from: "2.0.0")
.package(url: "https://github.com/marekpridal/LogKit", from: "3.0.0")
],
targets: [
.target(name: "LogKitExample", dependencies: ["LogKit"])
Expand Down Expand Up @@ -139,4 +141,4 @@ Log.payment(transactions: transactions)
// [<SKPaymentTransaction: 0x1051040a0>]
// ----------------------------

```
```
94 changes: 49 additions & 45 deletions Sources/LogKit/LogKit.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,15 @@
//

import Foundation
import os.log
#if os(Android) || os(Windows) || os(Linux)
import AndroidLogging
import FoundationNetworking
#else
import OSLog
import StoreKit
#endif

@available(OSX 10.12, iOS 10.0, watchOS 3.0, tvOS 10.0, *)
@available(OSX 11, iOS 10.0, watchOS 3.0, tvOS 10.0, *)
public enum Log {
public enum Category: String, CaseIterable, Sendable {
case `deinit`
Expand All @@ -23,42 +28,46 @@ public enum Log {
case dependencyInjection
}

#if canImport(Darwin)
nonisolated(unsafe) public static var subsystem = Bundle.main.bundleIdentifier!
#elseif os(Android)
nonisolated(unsafe) public static var subsystem = "com.logkit.android"
#endif
nonisolated(unsafe) public static var enabledLogging: [Category] = Category.allCases

#if canImport(Darwin)
public static func `deinit`(of object: AnyObject) {
guard enabledLogging.contains(.deinit) else { return }
let deinitLog = OSLog(subsystem: subsystem, category: Category.deinit.rawValue)
os_log("Deinit of %{PRIVATE}@", log: deinitLog, type: .info, object.debugDescription ?? "")
let logger = Logger(subsystem: subsystem, category: Category.deinit.rawValue)
logger.info("Deinit of \(object.debugDescription ?? "")")
}

#endif
public static func function(_ function: String, in file: String) {
guard enabledLogging.contains(.function) else { return }
let deinitLog = OSLog(subsystem: subsystem, category: Category.function.rawValue)
os_log("%{PRIVATE}@ %{PRIVATE}@", log: deinitLog, type: .debug, function, file)
let logger = Logger(subsystem: subsystem, category: Category.function.rawValue)
logger.debug("\(function) \(file)")
}

public static func `default`(_ string: String) {
guard enabledLogging.contains(.default) else { return }
let deinitLog = OSLog(subsystem: subsystem, category: Category.default.rawValue)
os_log("%{PRIVATE}@", log: deinitLog, type: .debug, string)
let logger = Logger(subsystem: subsystem, category: Category.default.rawValue)
logger.debug("\(string)")
}

public static func requestCalled(function: String) {
guard enabledLogging.contains(.networking) else { return }
let deinitLog = OSLog(subsystem: subsystem, category: Category.networking.rawValue)
os_log("%{PRIVATE}@ already called", log: deinitLog, type: .debug, function)
let logger = Logger(subsystem: subsystem, category: Category.networking.rawValue)
logger.debug("\(function) already called")
}

public static func expiration(date: Date) {
guard enabledLogging.contains(.expiration) else { return }
let deinitLog = OSLog(subsystem: subsystem, category: Category.expiration.rawValue)
os_log("[GMT] Valid until %{PRIVATE}@", log: deinitLog, type: .debug, date.debugDescription)
let logger = Logger(subsystem: subsystem, category: Category.expiration.rawValue)
logger.debug("[GMT] Valid until \(date.debugDescription)")
}

public static func request(_ request: URLRequest) {
guard enabledLogging.contains(.networking) else { return }
let deinitLog = OSLog(subsystem: subsystem, category: Category.networking.rawValue)
let logger = Logger(subsystem: subsystem, category: Category.networking.rawValue)
var message = "\n---REQUEST------------------\n"
message.append("URL -> \((request.url?.absoluteString ?? ""))\n")
message.append("METHOD -> \(request.httpMethod ?? "")\n")
Expand All @@ -71,12 +80,12 @@ public enum Log {
message.append("BODY -> \(String(data: body, encoding: .utf8) ?? "")\n")
}
message.append("----------------------------\n")
os_log("%{PRIVATE}@", log: deinitLog, type: .debug, message)
logger.debug("\(message)")
}

public static func response(_ response: URLResponse?, data: Data?) {
guard enabledLogging.contains(.networking) else { return }
let deinitLog = OSLog(subsystem: subsystem, category: Category.networking.rawValue)
let logger = Logger(subsystem: subsystem, category: Category.networking.rawValue)
guard let response = response, let data = data else { return }
var message = "\n---RESPONSE------------------\n"
message.append("URL -> \(response.url?.absoluteString ?? "")\n")
Expand All @@ -89,89 +98,84 @@ public enum Log {
message.append("}\n")
message.append("Response data -> \(String(data: data, encoding: .utf8) ?? "")\n")
message.append("----------------------------\n")
os_log("%{PRIVATE}@", log: deinitLog, type: .debug, message)
logger.debug("\(message)")
}

public static func function(_ function: String, text: String) {
guard enabledLogging.contains(.function) else { return }
let deinitLog = OSLog(subsystem: subsystem, category: Category.function.rawValue)
os_log("%{PRIVATE}@ %{PRIVATE}@", log: deinitLog, type: .debug, function, text)
let logger = Logger(subsystem: subsystem, category: Category.function.rawValue)
logger.debug("\(function) \(text)")
}

public static func inAppPurchase(_ string: String) {
guard enabledLogging.contains(.inAppPurchase) else { return }
let deinitLog = OSLog(subsystem: subsystem, category: Category.inAppPurchase.rawValue)
os_log("%{PRIVATE}@", log: deinitLog, type: .debug, string)
let logger = Logger(subsystem: subsystem, category: Category.inAppPurchase.rawValue)
logger.debug("\(string)")
}

public static func error(_ error: Error) {
guard enabledLogging.contains(.error) else { return }
let deinitLog = OSLog(subsystem: subsystem, category: Category.error.rawValue)
os_log("%{PRIVATE}@", log: deinitLog, type: .error, error.localizedDescription)
let logger = Logger(subsystem: subsystem, category: Category.error.rawValue)
logger.debug("\(error.localizedDescription)")
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should be error

}

public static func database(_ string: String) {
guard enabledLogging.contains(.database) else { return }
let log = OSLog(subsystem: subsystem, category: LogKit.Log.Category.database.rawValue)
os_log("%{PRIVATE}@", log: log, type: .debug, string)
let logger = Logger(subsystem: subsystem, category: Category.database.rawValue)
logger.debug("\(string)")
}

public static func dependencyInjection(_ string: String) {
guard enabledLogging.contains(.dependencyInjection) else { return }
let log = OSLog(subsystem: subsystem, category: LogKit.Log.Category.dependencyInjection.rawValue)
os_log("%{PRIVATE}@", log: log, type: .debug, string)
let logger = Logger(subsystem: subsystem, category: Category.dependencyInjection.rawValue)
logger.debug("\(string)")
}

@available(watchOS 6.2, *)
#if canImport(Darwin)
public static func products(request: SKProductsRequest) {
guard enabledLogging.contains(.inAppPurchase) else { return }
let deinitLog = OSLog(subsystem: subsystem, category: Category.inAppPurchase.rawValue)
let logger = Logger(subsystem: subsystem, category: Category.inAppPurchase.rawValue)
var requestMessage = "\n---REQUEST------------------\n"
requestMessage.append("\(request)")
requestMessage.append("\n----------------------------\n")
os_log("%{PRIVATE}@", log: deinitLog, type: .debug, requestMessage)
logger.debug("\(requestMessage)")
}

@available(watchOS 6.2, *)
public static func products(response: SKProductsResponse) {
guard enabledLogging.contains(.inAppPurchase) else { return }
let deinitLog = OSLog(subsystem: subsystem, category: Category.inAppPurchase.rawValue)
let logger = Logger(subsystem: subsystem, category: Category.inAppPurchase.rawValue)
var responseMessage = "\n---RESPONSE------------------\n"
responseMessage.append("Invalid product identifiers \(response.invalidProductIdentifiers)")
responseMessage.append("\n----------------------------\n")
responseMessage.append("Products \(response.products)")
responseMessage.append("\n----------------------------\n")
os_log("%{PRIVATE}@", log: deinitLog, type: .debug, responseMessage)
logger.debug("\(responseMessage)")
}

@available(watchOS 6.2, *)
public static func products(request: SKRequest) {
guard enabledLogging.contains(.inAppPurchase) else { return }
let deinitLog = OSLog(subsystem: subsystem, category: Category.inAppPurchase.rawValue)
let logger = Logger(subsystem: subsystem, category: Category.inAppPurchase.rawValue)
var requestMessage = "\n---REQUEST------------------\n"
requestMessage.append("\(request)")
requestMessage.append("\n----------------------------\n")
Log.default(requestMessage)
os_log("%{PRIVATE}@", log: deinitLog, type: .debug, requestMessage)
logger.debug("\(requestMessage)")
}

@available(watchOS 6.2, *)
public static func paymentQueue(_ queue: SKPaymentQueue) {
guard enabledLogging.contains(.inAppPurchase) else { return }
let deinitLog = OSLog(subsystem: subsystem, category: Category.inAppPurchase.rawValue)
let logger = Logger(subsystem: subsystem, category: Category.inAppPurchase.rawValue)
var requestMessage = "\n---QUEUE------------------\n"
requestMessage.append("\(queue)")
requestMessage.append("\n----------------------------\n")
os_log("%{PRIVATE}@", log: deinitLog, type: .debug, requestMessage)
logger.debug("\(requestMessage)")
}

@available(watchOS 6.2, *)
public static func payment(transactions: [SKPaymentTransaction]) {
guard enabledLogging.contains(.inAppPurchase) else { return }
let deinitLog = OSLog(subsystem: subsystem, category: Category.inAppPurchase.rawValue)
let logger = Logger(subsystem: subsystem, category: Category.inAppPurchase.rawValue)
var responseMessage = "\n---UPDATED TRANSACTIONS------------------\n"
responseMessage.append("\(transactions)")
responseMessage.append("\n----------------------------\n")
os_log("%{PRIVATE}@", log: deinitLog, type: .debug, responseMessage)
logger.debug("\(responseMessage)")
}
#endif
}
1 change: 0 additions & 1 deletion Tests/LinuxMain.swift

This file was deleted.

Loading