Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/hemangshah/printer

A fancy logger yet lightweight, and configurable. 🖨
https://github.com/hemangshah/printer

disable-logging emoji fancy filter-logs log logger logging nslog print printer printer-logger printer-logs trace

Last synced: 10 days ago
JSON representation

A fancy logger yet lightweight, and configurable. 🖨

Awesome Lists containing this project

README

        

📣📣 Important: Printer can only print console logs if you're running an app in the Simulator. If you're running in a real device it will not print any of the logs in console, however, you can always access all logs using [PrinterViewController](#printerviewcontroller) within your app. Printer is using `print` function internally which is more [effective and speedy](https://stackoverflow.com/questions/25951195/swift-print-vs-println-vs-nslog) then `NSLog`.

![Fancy Logo](https://github.com/hemangshah/printer/blob/master/PrinterExampleApp/PrinterExampleApp/printer-logo.png)

[![Build Status](https://travis-ci.org/hemangshah/printer.svg?branch=master)](https://travis-ci.org/hemangshah/printer)
![License](https://img.shields.io/badge/License-MIT-lightgrey.svg)
![Platform](https://img.shields.io/badge/Platforms-iOS-red.svg)
![Swift 4.x](https://img.shields.io/badge/Swift-4.x-blue.svg)
![CocoaPods](https://img.shields.io/cocoapods/dt/printer-logger.svg)
![MadeWithLove](https://img.shields.io/badge/Made%20with%20%E2%9D%A4-India-green.svg)
[![Awesome-Swift](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/matteocrippa/awesome-swift/)

## You can print the following types of logs with Printer.

- ✅ Success
- ❌ Error
- 🚧 Warning
- 📣 Information
- 🚨 Alert

> With each type, it will print a particular emoji and titles which will help you to easily identify what the log is. Moreover, it will look cool too.

## Installation

1.**Manually** - Add Printer folder to your Project. All set. If you don't want [PrinterViewController](#printerviewcontroller) only add `Printer.swift`.

2.**CocoaPods**:

pod 'printer-logger'

3.**Carthage** [Coming soon]. [Reference](https://medium.com/@filippotosetto/how-to-create-a-carthage-framework-8d9d65f98ac2)

> You can read the [CHANGELOG](https://github.com/hemangshah/printer/blob/master/CHANGELOG.md) file for a particular release.

## Features

1. [Different ways to print Logs](#different-ways-to-print-logs)
3. [Plain Logs](#plainlog)
4. [Tracing](#tracing)
5. [All Logs for Print](#all-logs-for-print)
6. [All Logs for Use](#all-logs-for-use)
7. [PrinterViewController](#printerviewcontroller)
7. [Save Logs to a file](#save-logs-to-a-file)
8. [Flush](#flush)
9. [Customize Printer](#customize-printer)
10. [Filter Logs](#filter-logs-filter-by-log-types)
11. [Disable Logs](#disable-logs)
12. [Completion Block](#completion-block)
14. [Background or Foreground Logs](#background-or-foreground-logs)
13. [Shipping to AppStore?](#ready-to-ship-your-app)

## Extras

1. [ToDos](#todos)
2. [Credits](#credits)
3. [Thanks](#thank-you)
4. [License](#license)

## Let's see what you can do with Printer.

Printer has a singleton, you should always use it with its singleton.

Printer.log.show(id: "001", details: "This is a Success message.", logType: .success)

See the output. Isn't it cool?

[✅ Success] [⌚04-27-2017 10:39:26] [🆔 101] ➞ ✹✹This is a Success message.✹✹

Here are other options you can do with Printer.

Printer.log.show(id: "002", details: "This is a Error message.", logType: .error)
Printer.log.show(id: "003", details: "This is an Information message.", logType: .information)
Printer.log.show(id: "004", details: "This is a Warning message.", logType: .warning)
Printer.log.show(id: "005", details: "This is an Alert message.", logType: .alert)

Output:

[❌ Error] [⌚04-27-2017 10:41:39] [🆔 102] ➞ ✹✹This is a Error message.✹✹
[🚧 Warning] [⌚04-27-2017 10:41:39] [🆔 103] ➞ ✹✹This is a Warning message.✹✹
[📣 Information] [⌚04-27-2017 10:41:39] [🆔 104] ➞ ✹✹This is an Information message.✹✹
[🚨 Alert] [⌚04-27-2017 10:41:39] [🆔 105] ➞ ✹✹This is an Alert message.✹✹

## Different ways to print logs.

Don't want to specify the logType everytime? No problem, we have function for that too.

Printer.log.success(id: "101", details: "This is a Success message. No need to specify logType.")
Printer.log.error(id: "102", details: "This is an Error message. No need to specify logType.")
Printer.log.warning(id: "103", details: "This is a Warning message. No need to specify logType.")
Printer.log.information(id: "104", details: "This is an Information message. No need to specify logType.")
Printer.log.alert(id: "105", details: "This is an Alert message. No need to specify logType.")

Don't want to specify IDs? We have taken care of that too.

Printer.log.success(details: "This is a Success message without ID.")
Printer.log.error(details: "This is an Error message without ID.")
Printer.log.warning(details: "This is a Warning message without ID.")
Printer.log.information(details: "This is an Information message without ID.")
Printer.log.alert(details: "This is an Alert message without ID.")

We have overrided the 'show' function.

Printer.log.show(details: "This is a Success message.", logType: .success)
Printer.log.show(details: "This is an Alert message.", logType: .alert)

Show a future log.

Printer.log.showInFuture(id: "006", details: "This is a future Success message.", logType: .success, afterSeconds: 3)

> This will print a log after specified seconds. In this case, success log after three (3) seconds.

## plainLog

Don't like the fancy logs? No worries, we have a plain log option.

> **DEFAULT**: `false`
> **IMPORTANT**: Should be called in advance.

Printer.log.plainLog = true

Example when `plainLog` is set to `true`.

[04-27-2017 10:50:30] ID ➞ 001 Details ➞ This is a Success message.
[04-27-2017 10:50:30] ID ➞ 002 Details ➞ This is a Error message.
[04-27-2017 10:50:30] ID ➞ 003 Details ➞ This is an Information message.
[04-27-2017 10:50:30] ID ➞ 004 Details ➞ This is a Warning message.
[04-27-2017 10:50:30] ID ➞ 005 Details ➞ This is an Alert message.

We have a new`.plain` type added with show() function.

Printer.log.show(id: "001", details: "This is a Plain message.", logType: .plain)

> This is useful when you only want a few plain logs.

> **IMPORTANT**: Any properties you're setting should be set in advance or before printing any logs to get the exact effect.

> **SUGGESTION**: You can always set all the properties to customize the **Printer** in `AppDelegate.swift` file,

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.

//set the properties and call the specific function as per the need.

//Printer.log.plainLog = true
Printer.log.addLineAfterEachPrint = true
Printer.log.capitalizeTitles = true
Printer.log.capitalizeDetails = true
Printer.log.printOnlyIfDebugMode = true

//Applied filters to only print success and alert type logs.
//Printer.log.filterLogs = [.success, .alert]

Printer.log.onLogCompletion = { (log) in
//print(log)
//print(log.0)
}

//Printer.log.hideTitles()
//Printer.log.hideEmojis()

return true
}

> This will set the properties globally and will be available for the entire app life cycle.

## Tracing

Want to print the file name, function name and line number?

> **IMPORTANT**: Should be call everytime when you want to print a trace.

Printer.log.trace()

Printer.Trace ➞ [05-02-2017 14:58:38] ViewController.swift ➞ viewDidLoad() #40

## Auto Tracing

> **DEFAULT**: `true`
> **IMPORTANT**: `keepAutoTracing` should set to `true` before logging.

This would print same trace as if you call trace(). If you don't like it, just set `keepAutoTracing` to `false`.

## All Logs for Print

Want to print all the logs for a different use case?

> **IMPORTANT**: `keepTracking` should be set to `true` before logging. Even if `keepAutoTracing` is set to `false`; if you pass `showTrace` to `true`, you will see the traced info. This is helpful if you don't want to trace while logging.

Printer.log.all(showTrace: true)

[All Logs] [Success] [05-15-2017 14:28:03] Id:001 Details:This is a Success message.
[Trace] ➞ ViewController.swift ➞ viewDidLoad() #58
[All Logs] [Error] [05-15-2017 14:28:03] Id:002 Details:This is a Error message.
[Trace] ➞ ViewController.swift ➞ viewDidLoad() #59
[All Logs] [Information] [05-15-2017 14:28:03] Id:003 Details:This is an Information message.
[Trace] ➞ ViewController.swift ➞ viewDidLoad() #60
[All Logs] [Warning] [05-15-2017 14:28:03] Id:004 Details:This is a Warning message.
[Trace] ➞ ViewController.swift ➞ viewDidLoad() #61
[All Logs] [Alert] [05-15-2017 14:28:03] Id:005 Details:This is an Alert message.
[Trace] ➞ ViewController.swift ➞ viewDidLoad() #62

You can filter them as well.

Printer.log.all(filterLogTypes: [.alert], showTrace: true)

> This will only print `.alert` type tracked logs with tracing info.

[All Logs] [Alert] [05-15-2017 14:28:03] Id:005 Details:This is an Alert message.
[Trace] ➞ ViewController.swift ➞ viewDidLoad() #62

> all() function will always print plain logs. No fancy logs.

## All Logs for Use

Want to get all the logs?

//let array = Printer.log.getAllLogs()
let array = Printer.log.getAllLogs(filterLogTypes: [.success])
if !array.isEmpty {
array.forEach({ (log) in
print(log.details)
//or do something else.
})
}

Use cases:
- To store it somewhere.
- To make API calls with log details.
- To do anything which [Printer] isn't supports.

# PrinterViewController

See all the printer logs in `PrinterViewController`. You can also filter the logs within the view controller.

> **IMPORTANT**: `PrinterViewController` is based on the set properties for `Printer` and works exactly the same, so please be mindful of the properties that you have set.

Use cases:
- To see all the logs inside your application while testing the app either on iDevice or a Simulator.
- No need to check Xcode or Console.

Features:
- Filter Logs based on types.
- Copy a particular log.
- Easy to setup.

- [x] Search Logs.

[**Upcoming**]

- [ ] Send a Log file over email.
- [ ] Set Properties within the log file. Example: Plain Log [Switch On/Off] *Like that!*
- [ ] Clear logs.
- [ ] Air Print.
- [ ] See all the log files.
- [ ] Log files management.
- [ ] Export Text Log files to a PDF.

All Logs
No Logs
Alert Logs

How to use?

If you prefer manual installation.

> You can always use Printer without PrinterViewController. But it's suggestible to add this class for better logging.

1. Add `PrinterTableViewCell.swift`, `PrinterViewController.swift`, `Printer.storyboard` and `Printer.swift` in your Project. You can simply add **Printer** folder as well.
2. Everything is added, so now copy and paste the code below to present `PrinterViewController` from your app.

> Always add it to someplace (example: navigation bar, side menu, tabbar, app settings) from where you can always present it during development.

let printerStoryboard = UIStoryboard.init(name: "Printer", bundle: Bundle.main)
let navcontroller = UINavigationController.init(rootViewController: (printerStoryboard.instantiateViewController(withIdentifier: "PrinterViewControllerID")))
self.present(navcontroller, animated: true, completion: nil)

## Save Logs to a File

Want to create a log file for use? We have covered it too.

let array = Printer.log.getAllLogs()
if !array.isEmpty {
Printer.log.saveLogToFile(logs: array)
}

> All your logs will be created in a separate file under Printer folder.

Delete all Log files?

Printer.log.deleteLogFiles()

## Flush

Want to delete all the log files and free up some space?

Printer.log.flush()

## Customize Printer

You can add a line after each logs.

> **DEFAULT**: `false`
> **IMPORTANT**: Should be called in advance.

Printer.log.addLineAfterEachPrint = true

Example: when addLineAfterEachPrint is set to `true`.

[✅ Success] [⌚04-27-2017 10:53:28] [🆔 001] ➞ ✹✹This is a Success message.✹✹
________________________________________________________________________________________
[❌ Error] [⌚04-27-2017 10:53:28] [🆔 002] ➞ ✹✹This is a Error message.✹✹
________________________________________________________________________________________
[📣 Information] [⌚04-27-2017 10:53:28] [🆔 003] ➞ ✹✹This is an Information message.✹✹
________________________________________________________________________________________
[🚧 Warning] [⌚04-27-2017 10:53:28] [🆔 004] ➞ ✹✹This is a Warning message.✹✹
________________________________________________________________________________________
[🚨 Alert] [⌚04-27-2017 10:53:28] [🆔 005] ➞ ✹✹This is an Alert message.✹✹
________________________________________________________________________________________

## Capitalize Titles & Details

You can even capitalize the title and details of logs.

> **DEFAULT**: `false`
> **IMPORTANT**: Should be called in advance.

Printer.log.capitalizeTitles = true

> **DEFAULT**: `false`
> **IMPORTANT**: Should be called in advance.

Printer.log.capitalizeDetails = true

Example: when capitalizeTitles and capitalizeDetails are set to `true`.

[✅ SUCCESS] [⌚04-27-2017 11:09:37] [🆔 001] ➞ ✹✹THIS IS A SUCCESS MESSAGE.✹✹

Don't want to show Emojis?

> **IMPORTANT**: Should be called in advance.

Printer.log.hideEmojis()

Example: when `hideEmojis()` called.

[Success] [04-27-2017 11:08:45] [001] ➞ ✹✹This is a Success message.✹✹
[Error] [04-27-2017 11:08:45] [002] ➞ ✹✹This is a Error message.✹✹
[Information] [04-27-2017 11:08:45] [003] ➞ ✹✹This is an Information message.✹✹
[Warning] [04-27-2017 11:08:45] [004] ➞ ✹✹This is a Warning message.✹✹
[Alert] [04-27-2017 11:08:45] [005] ➞ ✹✹This is an Alert message.✹✹

Don't want to show Titles?

> **IMPORTANT**: Should be called in advance.

Printer.log.hideTitles()

Don't want to show Log Time?

> **DEFAULT**: `false`
> **IMPORTANT**: Should be called in advance.

Printer.log.hideLogsTime = true

## Customize Emojis

Don't like the current Emojis? You can override the default Emojis with your favorite Emojis.

> **IMPORTANT**: Should be called in advance.

Printer.log.successEmojiSymbol = "🎃"

Other properties for Emoji customization.

> **IMPORTANT**: Should be called in advance.

Printer.log.errorEmojiSymbol = ""
Printer.log.warningEmojiSymbol = ""
Printer.log.infoEmojiSymbol = ""
Printer.log.alertEmojiSymbol = ""

## Customize Titles

Don't like the current Titles or localize Titles? Want to set your own? You can do this.

> **IMPORTANT**: Should be called in advance.

Printer.log.successLogTitle = "Hurray!!"

Other properties for Titles customization.

> **IMPORTANT**: Should be called in advance.

Printer.log.errorLogTitle = ""
Printer.log.warningLogTitle = ""
Printer.log.infoLogTitle = ""
Printer.log.alertLogTitle = ""

## Customize Symbols

Don't like the current Symbols? Want to set your own? You can do this.

> **IMPORTANT**: Should be called in advance.

Printer.log.arrowSymbol = "⇨"

Other properties for Symbol customization.

> **IMPORTANT**: Should be called in advance.

Printer.log.starSymbol = ""

Don't like the date format in logs? You can change it too.

> **DEFAULT**: `MM-dd-yyyy HH:mm:ss`
> **IMPORTANT**: Should be called in advance.

Printer.log.logDateFormat = "hh:mm:ss a"

Example when logDateFormat is set to a different format.

[✅ Success] [⌚11:12:23 AM] [🆔 001] ➞ ✹✹This is a Success message.✹✹

## Filter Logs: Filter by Log Types
Show specific logs with filter.

Printer.log.filterLogs = [.success, .alert]

> This should only print logs of the specified types. I.e. Succes and Alert. All other logs will be ignored.

## Filter Logs: Filter by File
Written Printer logs everywhere? Want to Skip logging for `LoginViewController.swift` for security?

To Skip logs for a file: `Printer.log.skipFile()`
To Add logs for a file: `Printer.log.addFile()`

> **IMPORTANT**: You should call `addFile()` to start printing logs for the same file for which you have called `skipFile()`. This is other than the `disable` property which completely disables logging for all the files.

## Disable Logs
To disable all logs.

> **DEFAULT**: `false`
> **IMPORTANT**: You can set this anywhere and it should not print logs from where it was set.

Printer.log.disable = true

## Completion Block
Let you will notified in advance before any logging events.

> **IMPORTANT**: This block will ignore all the filters applied for Printer, meaning, it will always notify you for any logs that will print or not print.

Printer.log.onLogCompletion = { (log) in
print(log)
//print(log.0)
}

Will return current log, file name, function name, and line number. You can access it with log.0, log.1 and so on.

Use cases:

- To notify in advance before a log event.
- To print logs even if you've applied any filter.
- To call your APIs to store log information. Only code at one place. No dependencies.

> You will not get notified if `disable` is set to `true` or `printOnlyIfDebugMode` is set to `true` and if your app is in `release` mode.

## Background or Foreground Logs

Want to see a log of when your app goes to the background or foreground?

Printer.log.addAppEventsHandler()

[📣 INFORMATION] [⌚05-17-2017 13:17:38] ➞ ✹✹App is in foreground now.✹✹
________________________________________________________________________________________

Stop logging for background or foreground events?

Printer.log.removeAppEventsHandler()

> This is helpful when you're checking all the logs and want to see what happended after app went to background or comes to foreground?

## Ready to ship your app?

Don't want to print the logs in RELEASE mode?

> **DEFAULT**: `true`
> **IMPORTANT**: Should be called in advance.

Printer.log.printOnlyIfDebugMode = false

## To-Do List

- [x] Filter Logs.
- [x] Disable Logs.
- [x] Manual Tracing.
- [x] Auto Tracing.
- [x] All logs - Track all logs and print them all at once.
- [x] Future Logs – A function which will print a log after a certain time.
- [x] Skipping logs for a particular file.
- [x] Delegate calls to let you know the Printer logged.
- [x] Maintain a log file separately.
- [x] Improve README file with following: Features List for direct link to a particular point.
- [x] Log application events. Example: Background/Foreground events.
- [x] Open a ViewController to show up all the logs.
- [ ] Upcoming features of [PrinterViewController](#printerviewcontroller).

Have an idea for improvements of this class?
Please open an [issue](https://github.com/hemangshah/printer/issues/new).

   
## Credits

[Hemang Shah](https://about.me/hemang.shah)

**You can shoot me an [email](http://www.google.com/recaptcha/mailhide/d?k=01IzGihUsyfigse2G9z80rBw==&c=vU7vyAaau8BctOAIJFwHVbKfgtIqQ4QLJaL73yhnB3k=) to contact.**
 
## Thank You!!

See the [contributions](https://github.com/hemangshah/printer/blob/master/CONTRIBUTIONS.md) for details.

## License

The MIT License (MIT)

> Read the [LICENSE](https://github.com/hemangshah/printer/blob/master/LICENSE) file for details.