Swiftpack.co - gruffins/birch-swift as Swift Package

Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
See all packages published by gruffins.
gruffins/birch-swift 1.8.0
Remote logger used with the Birch logging platform
⭐️ 6
🕓 4 weeks ago
iOS macOS tvOS
.package(url: "https://github.com/gruffins/birch-swift.git", from: "1.8.0")


Tests Carthage compatible CocoaPods compatible Swift Package Manager compatible codecov Platforms

Simple, lightweight remote logging for Swift iOS / macOS / tvOS.

Sign up for your free account at Birch.

Birch allows you to log to a variety of drains regardless of whether they have a native implementation or not. On top of that, Birch provides the ability to remotely adjust log configurations on any of your apps in production.

Birch can drain to

  • New Relic
  • Datadog
  • Logtail
  • Loggly
  • Elasticsearch
  • Papertrail
  • Logz
  • CloudWatch
  • S3
  • Wasabi
  • Google Cloud Logging
  • A custom webhook


Using CocoaPods

pod 'Birch'
pod 'BirchLumberjack' # optional. only used if you use CocoaLumberjack
pod 'BirchXCGLogger' # optional. only used if you use XCGLogger

Using Carthage

github "gruffins/birch-swift"

Using Swift Package Manager

.package(url: "https://github.com/gruffins/birch-swift.git", majorVersion: 1)


In your app delegate class, initialize the logger.

import Birch

class AppDelegate: UIResponder, UIApplicationDelegate {

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    #if DEBUG
      Birch.level = .trace // This overrides the server configuration during local development. The default is null.
      Birch.synchronous = true // This makes the logger log synchronously. The default is false.
      Birch.console = false // Disable console logging in production.

    Birch.debug = true // This line should be removed after you've successfully integrated.
    Birch.initialize("YOUR_API_KEY", publicKey: "YOUR_PUBLIC_ENCRYPTION_KEY")

    return true


Use the logger as you would with any logger.

Birch.t("trace message") // simplest
Birch.t { "trace message" } // most performant especially if it's expensive to build the log message.

Birch.d("debug message")
Birch.d { "debug message" }

Birch.i("info message")
Birch.i { "info message" }

Birch.w("warn message")
Birch.w { "warn message" }

Birch.e("error message")
Birch.e { "error message" }

Block based logging is more performant since the blocks do not get executed unless the current log level includes the level of the log. See the following example:

Birch.d {
  return "hello" + someExpensiveFunction()

If the current log level is INFO, the log will not get constructed.


Device level configuration is left to the server so you can remotely control it. There are a few things you can control on the client side.


During local development, it is useful to see the logs in the console. These console logs are not useful in production since you cannot read them remotely. The default is true.

Birch.console = true


During local development, it's unlikely that you'll need remote logging. You can optionally turn it off to minimize your usage on Birch. The default is true.

Birch.remote = false


During local development, you may want to quickly override the server configuration. The default is null which allows the server to set the remote level. Setting a value will ALWAYS override the server and prevent you from being able to remotely adjust the level.

Birch.level = .trace


During local development, you may want logs to print immediately when you're stepping through with a debugger. To do this, you'll need to use synchronous logging. The default value is false. Synchronous logging is slower since it has to perform the logging inline.

Birch.synchronous = true


When integrating the library, you may be curious to see the logger at work.

Birch.debug = true


We HIGHLY recommend using encryption to encrypt your logs at rest. If you leave out the public encryption key, Birch will save logs on the device in clear text.

An invalid public key will throw an exception.

To learn more, see our Encryption documentation.


You should set an identifier so you can identify the source in the dashboard. If you do not set one, you will only be able to find devices by the assigned uuid via Birch.uuid.

You can also set custom properties on the source that will propagate to all drains.

func onLogin(user: User) {
  Birch.identifier = user.id
  Birch.customProperties = ["country": user.country]

Opt Out

To comply with different sets of regulations such as GDPR or CCPA, you may be required to allow users to opt out of log collection.

Birch.optOut = true

Log Scrubbing

Birch comes preconfigured with an email and password scrubber to ensure sensitive data is NOT logged. Emails and passwords are replaced with [FILTERED] at the logger level so the data never reaches Birch servers.

If you wish to configure additional scrubbers, implement the Scrubber protocol and initialize the logger with all the scrubbers you want to use.

import Birch

class YourScrubber: Scrubber {

    init() {}

    public func scrub(input: String) -> String {
        return input.replacingOccurrences(
            of: "YOUR_REGEX",
            with: "[FILTERED]",
            options: [.regularExpression, .caseInsensitive]
let options = Options()
options.scrubbers = [PasswordScrubber(), EmailScrubber(), YourScrubber()]

Birch.initialize("API_KEY", publicKey: "YOUR_PUBLIC_ENCRYPTION_KEY", options: options)


You can use the supplied wrapper if you want to send your logs from CocoaLumberjack to Birch.

See Birch-Lumberjack for more details.

import BirchLumberjack



You can use the supplied wrapper if you want to send your logs from XCGLogger to Birch.

See Birch-XCGLogger for more details.

import BirchXCGLogger

let logger = XCGLogger(identifier: "your_identifier", includeDefaultDestinations: false)
logger.add(destination: BirchXCGLogger())


Stars: 6
Last commit: 4 weeks ago
Advertisement: IndiePitcher.com - Cold Email Software for Startups

Release Notes

4 weeks ago


  • Support for XCode 15

Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics