Logging for rookies in Swift


Learn to print variables to the debug console utilizing totally different features resembling print, dump, NSLog and the unified os.log API.


Primary output in Swift utilizing print

The very first methodology I might like to point out you is the print operate. It could write the textual illustration of the given objects to the usual output. In different phrases we will merely say that it may print textual content to the display screen. Many of the whats up phrase applications make the most of this methodology to show the well-known “Hi there world!” message. In Swift, print is kind of a strong methodology, since you’ll be able to move round a number of objects for printing out plus you’ll be able to specify a separator string and a terminator parameter. 🤔

print("Hi there World!")

The snippet above will show the Hi there World! textual content adopted by a newline character (n), it is because the default terminator is at all times a newline. You may override this habits by offering your individual terminator string.

print("Hi there World!", terminator: "")

In case you run this instance utilizing Xcode you need to see that the “Program ended with exit code: 0” textual content will seem in a newline within the first case, however within the second state of affairs it will be printed out proper after the “Hi there World!” sentence. In case you run this system utilizing a Terminal software, a % character be current as a substitute of the brand new line within the second case. 💡

What about printing out a number of variables? It’s potential to provide a number of objects to the print operate, they are often actually something, print can deal with strings, integers and all types of different variables. Print below the hood will convert the variable into a correct string illustration, so you do not have to fiddle with sort casting on a regular basis, however merely print out something.

print(1, 2, 3, 4, 5)

print(1, "two", 3.14, true)

You too can customise the separator character by an argument. So should you want a coma character (adopted by an area) in between the weather, you’ll be able to write one thing like this:

print("a", "b", "c", separator: ", ")

Effectively, in my earlier article you have got seen learn how to assemble numerous strings utilizing literals and interpolation, you need to use all these variables to print out stuff to the console.

           / _)
    .-^^^-/ /
 __/       /

For instance, here is a cute multi-line ascii artwork dinosaur. 🦕

Debugging and print

Typically it will be cool to know just a bit bit of additional data in regards to the printed variable, that is when debugPrint may also help you. The principle distinction between print and debugPrint is that whereas print merely converts all the pieces to string, debug print offers you a short debug data in regards to the given objects. The debugPrint methodology will print out numbers identical to print does, it will add double quotes round strings, and it will print some additional data about a lot of the different “complicated” sorts.




Truthfully I’ve virtually by no means used this methodology, and I at all times most popular print if I needed to print out one thing to the console, however it’s at all times good to know that there’s such an possibility accessible built-in to the usual library, nonetheless there’s a methodology that can provide you far more data… 🧐

Debugging utilizing dump

The dump methodology can print out the given object’s content material utilizing its mirror to the usual output. Lengthy story brief, this operate will present you a extra detailed view in regards to the property. For scalar values the dump methodology will produce virtually the identical output as debug-print, besides the dump line at all times begins with a splash character, however for extra complicated sorts it will output the underlying construction of the thing. Don’t fret, you needn’t perceive the output of this methodology, simply keep in mind that it may present you useful data throughout debugging. 🐞


The ClosedRange struct is a built-in sort with a lowerBound and an upperBound property. Whereas the print operate solely returned the outlined vary (1…5), the debugPrint methodology additionally revealed the kind of the thing, dump takes this one step additional by exhibiting us the precise decrease and higher certain properties of the worth. This may be extraordinarily useful when you have got a posh sort with a lot of underlying properties that you just wish to shortly examine for some cause. 🔍

By the way in which, debugging is the act of discovering (and resolving) bugs. Bugs are issues in your program code that forestall regular operation. Builders can use debugger instruments to run and examine code step-by-step, line by line or per instruction, however most of them are merely placing print statements into the code to see the present state or results of a given operate. 🤷‍♂️

Dump has a number of extra operate arguments you can configure:

dump("check", identify: "my-variable", indent: 4, maxDepth: 5, maxItems: 5)

You can provide a reputation to every dumped variable, add some additional indentation earlier than the sprint character, specify the utmost depth for descendents and the utmost variety of components for which to write down the total contents. Be happy to play with these parameters for some time. 😉

As you’ll be able to see dump is kind of a strong methodology, however nonetheless there are different features for logging functions, let me present you one that’s coming from the Goal-C occasions.

NSLog – the legacy logger operate

In case you have ever labored with Goal-C try to be acquainted with the NS prefixes. The NSLog operate can log an error message to the Apple System Log facility console. It is not a part of the Swift customary library, however you must import the Basis framework with the intention to use NSLog.

import Basis

NSLog("I am a dinosaur.")

You must know that NSLog will print the present date & time first, then it will show the identify of the operating program with the method and thread identifiers and solely then it will print your message.

Simply to be clear, NSLog is coming from the Goal-C period, it’s not a really helpful logging resolution anymore. It is usually very sluggish and that may trigger some points should you want exactly timed outputs. That is why I do NOT advocate utilizing NSLog in any respect, however you additionally need to know that till a number of years in the past there was no higher built-in different for it, I am not judging, simply saying… 😅

Unified Logging and Exercise Tracing

If you wish to ship log messages on an Apple machine to the unified logging system, you need to use the OSLog framework. This new software was launched at WWDC 2016 and lately obtained some good API refinements & updates. You must positively verify the OSLog and Unified Logging really helpful by Apple article if you wish to be taught extra about this subject it is a terrific write up.

My solely concern about this logging API is that it’s not that common. It really works nice on Apple platforms, however since Swift is an common language if you wish to add Linux and even Home windows assist, this resolution will not give you the results you want…

SwiftLog – A Logging API package deal for Swift

This open supply package deal will be simply built-in into your Swift tasks by way of the Swift Bundle Supervisor. You simply need to set it up as a dependency within the Bundle.swift manifest file or you’ll be able to hook it utilizing Xcode below the File > Swift Packages menu as an SPM dependency.

import PackageDescription

let package deal = Bundle(
    identify: "myProject",
    dependencies: [
        .package(url: "https://github.com/apple/swift-log.git", from: "1.4.0"),
    targets: [
        .target(name: "myProject", dependencies: [
            .product(name: "Logging", package: "swift-log")

The utilization is de facto easy. First you must import the Logging framework, you then create a logger and you employ that logger occasion to print out numerous log messages.

import Logging

let logger = Logger(label: "app-identifier")

logger.data("Hi there World!")

The next log ranges are supported:

  • hint
  • debug
  • data
  • discover
  • warning
  • error
  • important

You too can connect extra logging metadata to the logger, you need to verify the readme for more information about this selection. SwiftLog is utilized in many real-world tasks, resembling Vapor 4 (a server facet Swift framework), this additionally implies that it really works nice on Linux working techniques. 🐧


If it involves logging, there are a number of good choices to select from. It solely is determined by your wants which one is the most effective, however basically we will say that it’s time to depart behind NSLog, and time to make use of the brand new OSLog framework. In case you are utilizing Swift on non-Apple platform you need to think about using the SwiftLog library, which can be offered by Apple.

Alternatively in case you are simply scratching the floor and you do not want that many choices or log ranges you’ll be able to merely keep on with print and dump statements. It is completely wonderful to debug utilizing these easy methods at first. Mastering one thing takes time and debuggers will be fairly scary at first sight. Use print as a lot as you want, however at all times attempt to enhance your instruments & data over time, I hope this text provides you a greater view of the accessible logging instruments. 🤓


Leave a Reply