JustLog brings logging on iOS to the next level. It supports console, file and remote Logstash logging via TCP socket with no effort. Support for logz.io available.

Overview

JustLog Banner

JustLog

Build Status Version License Platform

JustLog takes logging on iOS to the next level. It supports console, file and remote Logstash logging via TCP socket with no effort. Support for logz.io available.

Overview

At Just Eat, logging and monitoring are fundamental parts of our job as engineers. Whether you are a back-end engineer or a front-end one, you'll often find yourself in the situation where understanding how your software behaves in production is important, if not critical. The ELK stack for real-time logging has gained great adoption over recent years, mainly in the back-end world where multiple microservices often interact with each other.

In the mobile world, the common approach to investigating issues is gathering logs from devices or trying to reproduce the issue by following a sequence of reported steps. Mobile developers are mostly familiar with tools such as Google Analytics or Fabric.io but they are tracking systems, not fully fledged logging solutions.

We believe tracking is different in nature from logging and that mobile apps should take advantage of ELK too in order to take their monitoring and analysis to another level. Remote logging the right set of information could provide valuable information that would be difficult to gather otherwise, unveil unexpected behaviours and bugs, and even if the data was properly anonymized, identify the sequences of actions of singular users.

JustLog takes logging on iOS to the next level. It supports console, file and remote Logstash logging via TCP socket out of the box. You can also setup JustLog to use logz.io with no effort. JustLog relies on SwiftyBeaver, exposes a simple swifty API but it also plays just fine with Objective-C.

JustLog sets the focus on remote logging, but fully covers the basic needs of local console and file logging.

Usage

JustLog, is available through CocoaPods. To install it, simply add the following line to your Podfile:

New in 3.2.1 JustLog is also available via the Swift Package Manager. Simply import the package via the Xcode UI and import the JustLog package.

pod "JustLog"

Import it into your files like so:

// swift
import JustLog

// Objective-C
@import JustLog;

This logging system strongly relies on SwiftyBeaver. We decided to adopt SwiftyBeaver due to the following reasons:

  • good and extensible design
  • ability to upload logs to the cloud
  • macOS app to analyze logs

A log can be of one of 5 different types, to be used according to the specific need. A reasonable adopted convention on mobile could be the following:

  • 📣 verbose: Use to trace the code, trying to find one part of a function specifically, sort of debugging with extensive information.
  • 📝 debug: Information that is helpful to developers to diagnose an issue.
  • ℹ️ info: Generally useful information to log (service start/stop, configuration assumptions, etc). Info to always have available but usually don't care about under normal circumstances. Out-of-the-box config level.
  • ⚠️ warning: Anything that can potentially cause application oddities but an automatic recovery is possible (such as retrying an operation, missing data, etc.)
  • ☠️ error: Any error which is fatal to the operation, but not the service or application (can't open a required file, missing data, etc.). These errors will force user intervention. These are usually reserved for failed API calls, missing services, etc.

When using JustLog, the only object to interact with is the shared instance of the Logger class, which supports 3 destinations:

  • sync writing to Console (custom destination)
  • sync writing to File (custom destination)
  • async sending logs to Logstash (usually part of an ELK stack)

Following is a code sample to configure and setup the Logger. It should be done at app startup time, in the applicationDidFinishLaunchingWithOptions method in the AppDelegate.

let logger = Logger.shared

// file destination
logger.logFilename = "justeat-demo.log"

// logstash destination
logger.logstashHost = "my.logstash.endpoint.com"
logger.logstashPort = 3515
logger.logstashTimeout = 5
logger.logLogstashSocketActivity = true

// default info
logger.defaultUserInfo = ["app": "my iOS App",
                          "environment": "production",
                          "tenant": "UK",
                          "sessionID": someSessionID]
logger.setup()

The defaultUserInfo dictionary contains a set of basic information to add to every log.

The Logger class exposes 5 functions for the different types of logs. The only required parameter is the message, optional error and userInfo can be provided. Here are some examples of sending logs to JustLog:

Logger.shared.verbose("not so important")
Logger.shared.debug("something to debug")
Logger.shared.info("a nice information", userInfo: ["some key": "some extra info"])
Logger.shared.warning("oh no, that won’t be good", userInfo: ["some key": "some extra info"])
Logger.shared.error("ouch, an error did occur!", error: someError, userInfo: ["some key": "some extra info"])

It plays nicely with Objective-C too:

[Logger.shared debug_objc:@"some message"];
[Logger.shared info_objc:@"some message" userInfo:someUserInfo];
[Logger.shared error_objc:@"some message" error:someError];
[Logger.shared error_objc:@"some message" error:someError userInfo:someUserInfo];

Please note that metadata such as filename and line number are unavailable in Objective-C.

The message is the only required argument for each log type, while userInfo and error are optional. The Logger unifies the information from message, error, error.userInfo, userInfo, defaultUserInfo and call-site info/metadata in a single dictionary with the following schema form of type [String : Any] (we call this 'aggregated form'). E.g. in JSON representation:

{
  "message": "the log message",
  "user_info": {
    "app": "my iOS App",
    "environment": "production",
    "custom_key": "some custom value",
    ...
  },
  "errors": [
  {
    "error_domain" : "com.domain",
    "error_code" : "1234",
    "NSLocalizedDescription": ...,
    "NSLocalizedFailureReasonError": ...,
    ...
  },
  {
    "errorDomain" : "com.domain.inner",
    "errorCode" : "5678",
    "NSLocalizedDescription": ...,
    "NSLocalizedFailureReasonError": ...,
    ...
  }],  
  "metadata": {
    "file": ...,
    "function": ...,
    "line": ...,
    ...
  }
}

All destinations (console, file, logstash) are enabled by default but they can be disabled at configuration time like so:

logger.enableConsoleLogging = false
logger.enableFileLogging = false
logger.enableLogstashLogging = false

The above 5 logs are treated and showed differently on the each destination:

Console

The console prints only the message.

Console

File

On file we store all the log info in the 'aggregated form'.

2016-12-24 12:31:02.734  📣 VERBOSE: {"metadata":{"file":"ViewController.swift","app_version":"1.0 (1)","version":"10.1","function":"verbose()","device":"x86_64","line":"15"},"user_info":{"environment":"production","app":"my iOS App","log_type":"verbose","tenant":"UK"},"message":"not so important"}
2016-12-24 12:31:36.777  📝 DEBUG: {"metadata":{"file":"ViewController.swift","app_version":"1.0 (1)","version":"10.1","function":"debug()","device":"x86_64","line":"19"},"user_info":{"environment":"production","app":"my iOS App","log_type":"debug","tenant":"UK"},"message":"something to debug"}
2016-12-24 12:31:37.368  ℹ️ INFO: {"metadata":{"file":"ViewController.swift","app_version":"1.0 (1)","version":"10.1","function":"info()","device":"x86_64","line":"23"},"user_info":{"environment":"production","app":"my iOS App","log_type":"info","tenant":"UK","some key":"some extra info"},"message":"a nice information"}
2016-12-24 12:31:37.884  ⚠️ WARNING: {"metadata":{"file":"ViewController.swift","app_version":"1.0 (1)","version":"10.1","function":"warning()","device":"x86_64","line":"27"},"user_info":{"environment":"production","app":"my iOS App","log_type":"warning","tenant":"UK","some key":"some extra info"},"message":"oh no, that won’t be good"}
2016-12-24 12:31:38.475  ☠️ ERROR: {"metadata":{"file":"ViewController.swift","app_version":"1.0 (1)","version":"10.1","function":"error()","device":"x86_64","line":"47"},"user_info":{"environment":"production","log_type":"error","some key":"some extra info","app":"my iOS App","tenant":"UK","NSLocalizedFailureReason":"error value"},"errors":[{"error_code":1234,"error_domain":"com.just-eat.test","NSLocalizedDescription":"description","NSLocalizedRecoverySuggestion":"recovery suggestion"}],"message":"ouch, an error did occur!"}

Logstash

Before sending a log to Logstash, the 'aggregated form' is flattened to a simpler `[String : Any] dictionary, easily understood by Logstash and handy to be displayed on Kibana. E.g. in JSON representation:

{
  "message": "ouch, an error did occur!",

  "environment": "production",
  "log_type": "error",
  "version": "10.1",
  "app": "iOS UK app",
  "tenant": "UK",
  "app_version": "1.0 (1)",
  "device": "x86_64",

  "file": "ViewController.swift",
  "function": "error()",
  "line": "47",
  "errors": [{
    "error_domain": "com.just-eat.test",
    "error_code": "1234",
    "NSLocalizedDescription": "description",
    "NSLocalizedFailureReason": "error value"
  }]
}

Which would be shown in Kibana as follows:

Kibana

A note on Logstash destination

The logstash destination is configured via properties exposed by the Logger. E.g.:

let logger = Logger.shared
logger.logstashHost = "my.logstash.endpoint.com"
logger.logstashPort = 3515
logger.logstashTimeout = 5
logger.logLogstashSocketActivity = true

When the logLogstashSocketActivity is set to true, socket activity is printed to the console:

Socket Activity

This destination is the only asynchronous destination that comes with JustLog. This means that logs to Logstash are batched and sent at some point in future when the timer fires. The logstashTimeout property can be set to the number of seconds for the dispatch. In some cases, it might be important to dispatch the logs immediately after an event occurs like so:

Logger.shared.forceSend()

or, more generally, in the applicationDidEnterBackground and applicationWillTerminate methods in the AppDelegate like so:

func applicationDidEnterBackground(_ application: UIApplication) {
  forceSendLogs(application)
}

func applicationWillTerminate(_ application: UIApplication) {
  forceSendLogs(application)
}

private func forceSendLogs(_ application: UIApplication) {

  var identifier = UIBackgroundTaskIdentifier(rawValue: 0)

  identifier = application.beginBackgroundTask(expirationHandler: {
    application.endBackgroundTask(identifier)
    identifier = UIBackgroundTaskIdentifier.invalid
  })

  Logger.shared.forceSend { completionHandler in
    application.endBackgroundTask(identifier)
    identifier = UIBackgroundTaskIdentifier.invalid
  }
}

Sending logs to logz.io

JustLog supports sending logs to logz.io.

At the time of writing, logz.io uses the following host and port (please refer to the official documentation):

logger.logstashHost = "listener.logz.io"
logger.logstashPort = 5052

When configuring the Logger (before calling setup()), simply set the token like so:

logger.logzioToken = <logzio_token>

Custom

From 3.2.0 onward JustLog supports a custom destination that can be defined by you. To implement a custom logger, all you need to do is provide a type that conforms to the CustomDestinationSender protocol to the new overloaded setupWithCustomLogSender() method.

Don't forget to set the enableCustomLogging property to true before calling setupWithCustomLogSender.

class MyCustomDestinationSender: CustomDestinationSender {
    func log(_ string: String) {
        // send the log somewhere
    }
}

let customSender = MyCustomDestinationSender()
let logger = Logger.shared
logger.enableCustomLogging = true
logger.setupWithCustomLogSender(customSender)

Log Sanitization

JustLog supports the implementation of a sanitize method that can be set within the client. This method accepts two placeholder variables:

  • Message: This variable concerns the log message that you wish to sanitize.
  • Log Type: This variable concerns the log level applied to the given log message.
public var sanitize: (_ message: String, _ minimumLogType: LogType) -> String = { message, minimumLogType in

    return message
}

This closure method is set up and called within Logger.Swift. If this method not expanded upon within the client it will simply return the original message, as expected. An example of how we have adopted this sanitize method can be seen within AppDelegate.swift in which we redact certain values based upon an input list. Clicking on 'Sanitized Log Message' in the example app will provide an example of the santizer method in action.

Conclusion

JustLog aims to be an easy-to-use working solution with minimal setup. It covers the most basic logging needs (console and file logging) via the great foundations given by SwiftBeaver, but also provides an advanced remote logging solution for Logstash (which is usually paired with Elasticsearch and Kibana in an ELK stack). JustLog integrates with logz.io, one of the most widely used ELK SaaS, placing itself as the only solution in the market (at the time of writing) to leverage such stack on iOS.

We hope this library will ease the process of setting up the logging for your team and help you find solutions to the issues you didn't know you had.

  • Just Eat iOS team
Comments
  • Upgrade to Swift 5 & Xcode 10.2. Upgrade SwiftyBeaver to 1.7.0

    Upgrade to Swift 5 & Xcode 10.2. Upgrade SwiftyBeaver to 1.7.0

    In order to use JustLog in Xcode 10.2 with Swift 5.0, the dependency of SwiftyBeaver needs to be upgraded.

    This PR upgrades:

    • SwiftyBeaver to 1.7.0
    • The Swift version to 5.0
    • The project versions to Xcode 10.2

    Also, I ran the tests and the example app with no issues.

    opened by fguchelaar 7
  • crash when logstashHost isn't set

    crash when logstashHost isn't set

    during setup(), this will crash

    logstash = LogstashDestination(host: logstashHost, port: logstashPort, timeout: logstashTimeout, logActivity: logLogstashSocketActivity)

    because logstashHost is of type String!.

    easy way to solve would be to just give a default of "" like the other logstash vars.

    opened by augusteo 7
  • What is JustLog default character encoding?

    What is JustLog default character encoding?

    Hello,

    I want to ask what is JustLog default character encoding? I have received the error from my Logstash server. Can I set the JustLog default to UTF-8?

    logstash log:
    Received an event that has a different character encoding than you configured. {:text=>"\u0016\u0003\u0001\u0000\xB5\u0001\u0000\u0000\xB1\u0003\u0003[\xBE\xD3N\xE0&\x9C(wQ.\u0010&jH\u0014\xE3\"4ct\xA4\xCB)\xD6\xDB\xE4\x8C\u0004\x90ߥ\u0000\u0000,\u0000\xFF\xC0,\xC0+\xC0$\xC0#\xC0", :expected_charset=>"UTF-8"} [2018-10-11T04:36:30,425][WARN ][logstash.codecs.line ] Received an event that has a different character encoding than you configured. {:text=>"\xC0\t\xC0\b\xC00\xC0/\xC0(\xC0'\xC0\u0014\xC0\u0013\xC0\u0012\u0000\x9D\u0000\x9C\u0000=\u0000<\u00005\u0000/\u0000", :expected_charset=>"UTF-8"}

    My conf file in conf.d: input { tcp { port => 5000

    ssl_enable => false
    }
    

    } ...

    Thanks

    opened by javaone360 6
  • Use baseUrl as parameter

    Use baseUrl as parameter

    Hey,

    It would be really helpful if baseUrl parameter for saving logs as files would be a variable.

    Why?

    Imagine using App Groups to sync your log files. With this change all you will need to do this is: logger.baseUrlForFileLogging = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "your-group-id")

    All best, Peter

    opened by piotr-adamczak-mobica 4
  • Add an option to allow for unsecure socket

    Add an option to allow for unsecure socket

    I had trouble setting up a Logstash instance with a self-signed certificate just for debugging and figured it would be simpler just to skip this entirely and edit JustLog.

    So, this PR add an option called useSecureSocket which default to true to allow the use of unsecure socket.

    opened by the0neyouseek 4
  • Implement CocoaAsyncSocket 7.6.1

    Implement CocoaAsyncSocket 7.6.1

    I'd like to use this for my project, but this pod depends on CocoaAsyncSocket 7.5.0 and I'm already depending on 7.6.1.

    I'd love to help out if possible, but it doesn't appear that the files are complete. There appears to be no way to open this project. That could just be my inexperience with developing pods. Let me know.

    opened by molynerd 4
  • Proposal: Smaller API

    Proposal: Smaller API

    We are currently using JustLog in our project, but we find the current API area quite extensive:

    public protocol Logging {
    
        public func verbose(_ message: String, error: NSError?, userInfo: [String : Any]?, _ file: StaticString, _ function: StaticString, _ line: UInt)
    
        public func debug(_ message: String, error: NSError?, userInfo: [String : Any]?, _ file: StaticString, _ function: StaticString, _ line: UInt)
    
        public func info(_ message: String, error: NSError?, userInfo: [String : Any]?, _ file: StaticString, _ function: StaticString, _ line: UInt)
    
        public func warning(_ message: String, error: NSError?, userInfo: [String : Any]?, _ file: StaticString, _ function: StaticString, _ line: UInt)
    
        public func error(_ message: String, error: NSError?, userInfo: [String : Any]?, _ file: StaticString, _ function: StaticString, _ line: UInt)
    }
    

    To make it easier for us, we created a wrapper around the Logging protocol like so:

    extension BabylonLogging {
        func log(_ level: LogLevel,
                  _ message: String,
                  error: Error?,
                  userInfo: [String : Any]?,
                  _ file: StaticString,
                  _ function: StaticString,
                  _ line: UInt)
    }
    

    Where the key bit is the LogLevel:

    public enum LogLevel {
        case verbose
        case debug
        case info
        case warning
        case error
    }
    

    This is just a minor thing, but do you think it would make sense to have the same in JustLog? I am happy to make a PR.

    opened by RuiAAPeres 4
  • Fix unbalanced dispatch leave crash

    Fix unbalanced dispatch leave crash

    Changes the approach to leaving a dispatch group in an async call

    Description

    This change removes the explicit call to dispatchGroup.leave() and instead passes the group in to the dispatchQueue.async method. In my testing this fixes the random unbalanced crash that I would experience on my app.

    Additionally I made a change from the previous fix, modifying task.cancel in the dispatchGroup.notify to instead call task.closeRead and task.closeWrite. Both approaches have the same outcome, but I feared that the cancel might have unintended side effects.

    Motivation and Context

    Solves the issue mentioned in #110

    How Has This Been Tested?

    In running my app and this library with wifi turned off, I would experience a crash sometime between 1 and 10 minutes of running. After applying this patch I was initially able to run my app for about 30 minutes, after which I restarted to do a fresh test and it ran for 15 and a half hours. I restarted it again for a third fresh test and it's been running for nearly an hour without any crashes.

    Screenshots (if appropriate):

    Types of changes

    • [x] Bug fix (non-breaking change which fixes an issue)
    • [ ] New feature (non-breaking change which adds functionality)
    • [ ] Breaking change (fix or feature that would cause existing functionality to change)

    Checklist:

    • [x] My code follows the code style of this project.
    • [ ] My change requires a change to the documentation.
    • [ ] I have updated the documentation accordingly.
    opened by diemer 3
  • Fix Out of Space error

    Fix Out of Space error

    Description

    Implements the fix outlined in #120, and subsequently fixes a memory leak in my app caused by using the package. Additionally fixes an issue with the Package.swift file not being validated correctly.

    Motivation and Context

    https://github.com/justeat/JustLog/issues/120

    How Has This Been Tested?

    Run with several thousands of log events sent to my Kibana server in quick succession. No longer receiving the "No space left on device" error.

    Types of changes

    • [x] Bug fix (non-breaking change which fixes an issue)
    • [ ] New feature (non-breaking change which adds functionality)
    • [ ] Breaking change (fix or feature that would cause existing functionality to change)

    Checklist:

    • [x] My code follows the code style of this project.
    • [ ] My change requires a change to the documentation.
    • [ ] I have updated the documentation accordingly.
    opened by diemer 3
  • Adds support for TLS certificates and peerName

    Adds support for TLS certificates and peerName

    We have our own Elastic Load balancer in AWS which only allows TCP socket connections from specific SSL cert. Since this was not available I quickly added it in and created a PR for others to use.

    opened by naqi 3
  • Is this still maintained? Looking for collaborators?

    Is this still maintained? Looking for collaborators?

    Hi Guys, I've started using JustLog and it kind of fit my needs so many thanks on the great work you've done here. I didn't find any other Logz.io solution for iOS other than implementing it myself.

    But I've noticed you're not very active on PRs and issues. Do you need any help with maintaining this library? Should I fork it and maintain it on my own?

    There are a few things I'd like to improve and fix in this library. Please let me know the best way to continue with this.

    Thanks, Oron

    opened by oronbz 3
  • Logs are not shown correctly in Kibana

    Logs are not shown correctly in Kibana

    Config: image

    This is what I see in Kibana: image

    I am using the ELK stack from here: https://github.com/deviantony/docker-elk

    Why is the log message all in bytes? I expected a json like view. Are certain codec settings in Kibana necessary to get JustLog to work?

    opened by sebnil 0
  • Multiple Logger instances

    Multiple Logger instances

    Hi, Is it possible to have multiple Logger instances, like: I want to see two log files.

    • One with all the logging
    • One with only the critical ones so they are easily visible without the need for a Logfile analysis tool

    In my AppDelegate, I created:

    let genericLogger = JustLog.Logger.shared
    let criticalLogger = JustLog.Logger()
    

    And then I configured them both And then I called setup() on both

    Would that be possible? (I tried and got a crash)

    Or would there be another solution to get 2 logfiles ... or 2 instances of the Logger?

    Thanks! Wouter

    opened by Yourney 1
  • Is it possible to update defaultUserInfo dictionary after logger has been setup?

    Is it possible to update defaultUserInfo dictionary after logger has been setup?

    Hi, We want to update some fields in defaultUserInfo after the logger is set up. I tried resetting it but apparently, that didn't work. Can we update them like that or do we have to call logger.setup() after the update?

    opened by kinjal-maven 0
  • [Crash] Over committing from RepeatingTimer

    [Crash] Over committing from RepeatingTimer

    Hey there, We noticed there's a somewhat repeating crash on JustLog that looks like this:

    Crashed: com.apple.root.default-qos.overcommit
    EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000000
    
    image

    Over-comitting basically means the queue can't handle the amount of scheduled pieces of work simultaneously with the provided quality of service. I believe this is related to the fact you're using makeTimerSource and using the default queue instead of possibly creating your own queue with a different quality of service, but haven't had a chance to properly investigate.

    Are you aware of this crash? Couldn't find any other reports on it. Thanks!

    opened by freak4pc 0
  • Fatal Exception: NSInvalidArgumentException -[__NSCFNumber count] Logger.log(_:_:error:userInfo:_:_:_:)

    Fatal Exception: NSInvalidArgumentException -[__NSCFNumber count] Logger.log(_:_:error:userInfo:_:_:_:)

    Hi,

    Please let me know how to fix the following issue in your lib. Thanks

    Fatal Exception: NSInvalidArgumentException -[__NSCFNumber count]: unrecognized selector sent to instance 0x8000000000000000 Logger.log(::error:userInfo:::_:) keyboard_arrow_down

    Fatal Exception: NSInvalidArgumentException 0 CoreFoundation 0x1a4112754 __exceptionPreprocess 1 libobjc.A.dylib 0x1b8bd97a8 objc_exception_throw 2 CoreFoundation 0x1a4015c3c -[NSOrderedSet initWithSet:copyItems:] 3 CoreFoundation 0x1a41152ac forwarding 4 CoreFoundation 0x1a41175b0 CF_forwarding_prep_0 5 MyApp. 0x100b40efc Logger.log(::error:userInfo::::) () 6 MyApp. 0x100b412a0 Logger.verbose(:error:userInfo::::) 7 MyApp. 0x100b40484 Logger.verbose(:error:userInfo::::)

    opened by Ewg777 11
  • Is JustLog available or validated on macOS?

    Is JustLog available or validated on macOS?

    Hello folks.

    I'm looking for a good solution for exporting logs to an ELK stack (I'm currently using Elastic cloud), but I sometimes need to support macOS in my apps. I'm about to attempt a validation to see if JustLog is suitable, but I thought I'd ask whether you folks have any insights that might be helpful.

    Thanks in advance.

    opened by stevekellogg 2
Releases(4.0.2)
Twitter Logging Service is a robust and performant logging framework for iOS clients

Twitter Logging Service Background Twitter created a framework for logging in order to fulfill the following requirements: fast (no blocking the main

Twitter 290 Nov 15, 2022
A simple iOS app to simulate a laser level using built-in camera and gyroscope.

Laser Level A simple iOS app to simulate a laser level using built-in camera and gyroscope. Demo https://youtu.be/aB03EtQ5zsU Usage Download Open .xco

Pavel Trusov 2 Oct 30, 2022
📱💬🚦 TinyConsole is a micro-console that can help you log and display information inside an iOS application, where having a connection to a development computer is not possible.

TinyConsole TinyConsole is a tiny log console to display information while using your iOS app and written in Swift. Usage Wrap your Main ViewControlle

Devran Cosmo Uenal 2k Jan 3, 2023
Styling and coloring your XCTest logs on Xcode Console

XLTestLog Notes with Xcode 8 and XLTestLog Since Xcode 8 killed XcodeColors, the current way using XCTestLog on Xcode 8 is just plain texts with emoji

Xaree Lee 58 Feb 2, 2022
Customizable Console UI overlay with debug log on top of your iOS App

AEConsole Customizable Console UI overlay with debug log on top of your iOS App AEConsole is built on top of AELog, so you should probably see that fi

Marko Tadić 142 Dec 21, 2022
Delightful console output for Swift developers.

Rainbow adds text color, background color and style for console and command line output in Swift. It is born for cross-platform software logging in te

Wei Wang 1.7k Dec 31, 2022
Gedatsu provide readable format about AutoLayout error console log

Gedatsu Gedatsu provide readable format about AutoLayout error console log Abstract At runtime Gedatsu hooks console log and formats it to human reada

bannzai 520 Jan 6, 2023
Gedatsu provide readable format about AutoLayout error console log

Gedatsu Gedatsu provide readable format about AutoLayout error console log Abstract At runtime Gedatsu hooks console log and formats it to human reada

bannzai 475 Jun 24, 2021
A Swift-based API for reading from & writing to the Apple System Log (more commonly known somewhat inaccurately as "the console")

CleanroomASL Notice: CleanroomASL is no longer supported The Apple System Log facility has been deprecated by Apple. As a result, we've deprecated Cle

Gilt Tech 62 Jan 29, 2022
XCLog is a Swift extension that helps you print something in console when debugging your projects.

XCLog XCLog is a Swift extension that helps you print something in console when debugging your projects. Installation Open Xcode > File > Add Packages

null 1 Jan 9, 2022
Simple Design for Swift bridge with Javascript. Also can get javascript console.log.

SDBridgeOC is here. If your h5 partner confused about how to deal with iOS and Android. This Demo maybe help. YouTube video is here. bilibili Video is

null 20 Dec 28, 2022
Bugfender SDK for iOS, a remote logger tailor-made for mobile

Bugfender SDK for iOS Bugfender is a cloud service to collect mobile application logs. Developers can control log sending programmatically and manuall

Bugfender 69 Dec 4, 2022
TraceLog is a highly configurable, flexible, portable, and simple to use debug logging system for Swift and Objective-C applications running on Linux, macOS, iOS, watchOS, and tvOS.

Please star this github repository to stay up to date. TraceLog Introduction TraceLog is a highly configurable, flexible, portable, and simple to use

Tony Stone 52 Oct 28, 2022
Elegant and extensive logging facility for OS X & iOS (includes database, Telnet and HTTP servers)

Overview XLFacility, which stands for Extensive Logging Facility, is an elegant and powerful logging facility for OS X & iOS. It was written from scra

Pierre-Olivier Latour 315 Sep 7, 2022
In-App iOS Debugging Tool With Enhanced Logging, Networking Info, Crash reporting And More.

The debugger tool for iOS developer. Display logs, network request, device informations, crash logs while using the app. Easy accessible with its bubble head button ?? . Easy to integrate in any apps, to handle development or testing apps easier. First version, there is plenty of room for improvement.

Remi ROBERT 1.8k Dec 29, 2022
A fast & simple, yet powerful & flexible logging framework for Mac and iOS

CocoaLumberjack CocoaLumberjack is a fast & simple, yet powerful & flexible logging framework for macOS, iOS, tvOS and watchOS. How to get started Fir

null 12.9k Jan 9, 2023
CleanroomLogger provides an extensible Swift-based logging API that is simple, lightweight and performant

CleanroomLogger CleanroomLogger provides an extensible Swift-based logging API that is simple, lightweight and performant. The API provided by Cleanro

null 1.3k Dec 8, 2022
Logging utility for Swift and Objective C

Swell - Swift Logging A logging utility for Swift and Objective C. ##Features Turn on logging during development, turn them off when building for the

Hubert Rabago 361 Jun 29, 2022