diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..66a942c
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,18 @@
+Software License Agreement (BSD License)
+
+Copyright (c) 2010, Deusty, LLC
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above
+  copyright notice, this list of conditions and the
+  following disclaimer.
+
+* Neither the name of Deusty nor the names of its
+  contributors may be used to endorse or promote products
+  derived from this software without specific prior
+  written permission of Deusty, LLC.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/Lumberjack/DDASLLogCapture.h b/Lumberjack/DDASLLogCapture.h
new file mode 100644
index 0000000..53dc6b0
--- /dev/null
+++ b/Lumberjack/DDASLLogCapture.h
@@ -0,0 +1,23 @@
+//
+//  DDASLLogCapture.h
+//  Lumberjack
+//
+//  Created by Dario Ahdoot on 3/17/14.
+//
+//
+
+#import "DDASLLogger.h"
+
+@protocol DDLogger;
+
+@interface DDASLLogCapture : NSObject
+
++ (void)start;
++ (void)stop;
+
+// Default log level: LOG_LEVEL_VERBOSE (i.e. capture all ASL messages).
++ (int)captureLogLevel;
++ (void)setCaptureLogLevel:(int)LOG_LEVEL_XXX;
+
+@end
+
diff --git a/Lumberjack/DDASLLogCapture.m b/Lumberjack/DDASLLogCapture.m
new file mode 100644
index 0000000..52bfc1b
--- /dev/null
+++ b/Lumberjack/DDASLLogCapture.m
@@ -0,0 +1,188 @@
+//
+//  DDASLLogCapture.m
+//  Lumberjack
+//
+//  Created by Dario Ahdoot on 3/17/14.
+//
+//
+
+#import "DDASLLogCapture.h"
+#import "DDLog.h"
+
+#include <asl.h>
+#include <notify.h>
+#include <notify_keys.h>
+#include <sys/time.h>
+
+static BOOL _cancel = YES;
+static int _captureLogLevel = LOG_LEVEL_VERBOSE;
+
+@implementation DDASLLogCapture
+
++ (void)start
+{
+    // Ignore subsequent calls
+    if (!_cancel)
+        return;
+    
+    _cancel = NO;
+    
+    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)
+                   {
+                       [DDASLLogCapture captureAslLogs];
+                   });
+}
+
++ (void)stop
+{
+    _cancel = YES;
+}
+
++ (int)captureLogLevel
+{
+    return _captureLogLevel;
+}
+
++ (void)setCaptureLogLevel:(int)LOG_LEVEL_XXX
+{
+    _captureLogLevel = LOG_LEVEL_XXX;
+}
+
+# pragma mark - Private methods
+
++ (void)configureAslQuery:(aslmsg)query
+{
+    const char param[] = "7";  // ASL_LEVEL_DEBUG, which is everything. We'll rely on regular DDlog log level to filter
+    asl_set_query(query, ASL_KEY_LEVEL, param, ASL_QUERY_OP_LESS_EQUAL | ASL_QUERY_OP_NUMERIC);
+    
+#if !TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
+    int processId = [[NSProcessInfo processInfo] processIdentifier];
+    char pid[16];
+    sprintf(pid, "%d", processId);
+    asl_set_query(query, ASL_KEY_PID, pid, ASL_QUERY_OP_EQUAL | ASL_QUERY_OP_NUMERIC);
+#endif
+}
+
++ (void)aslMessageRecieved:(aslmsg)msg
+{
+    //  NSString * sender = [NSString stringWithCString:asl_get(msg, ASL_KEY_SENDER) encoding:NSUTF8StringEncoding];
+    NSString * message = [NSString stringWithCString:asl_get(msg, ASL_KEY_MSG) encoding:NSUTF8StringEncoding];
+    NSString * level = [NSString stringWithCString:asl_get(msg, ASL_KEY_LEVEL) encoding:NSUTF8StringEncoding];
+    NSString * secondsStr = [NSString stringWithCString:asl_get(msg, ASL_KEY_TIME) encoding:NSUTF8StringEncoding];
+    NSString * nanoStr = [NSString stringWithCString:asl_get(msg, ASL_KEY_TIME_NSEC) encoding:NSUTF8StringEncoding];
+    
+    NSTimeInterval seconds = [secondsStr doubleValue];
+    NSTimeInterval nanoSeconds = [nanoStr doubleValue];
+    NSTimeInterval totalSeconds = seconds + (nanoSeconds / 1e9);
+    
+    NSDate * timeStamp = [NSDate dateWithTimeIntervalSince1970:totalSeconds];
+    
+    int flag;
+    BOOL async;
+    switch([level intValue])
+    {
+        // By default all NSLog's with a ASL_LEVEL_WARNING level
+        case ASL_LEVEL_EMERG    :
+        case ASL_LEVEL_ALERT    :
+        case ASL_LEVEL_CRIT     : flag = LOG_FLAG_ERROR;    async = LOG_ASYNC_ERROR;    break;
+        case ASL_LEVEL_ERR      : flag = LOG_FLAG_WARN;     async = LOG_ASYNC_WARN;     break;
+        case ASL_LEVEL_WARNING  : flag = LOG_FLAG_INFO;     async = LOG_ASYNC_INFO;     break;
+        case ASL_LEVEL_NOTICE   : flag = LOG_FLAG_DEBUG;    async = LOG_ASYNC_DEBUG;    break;
+        case ASL_LEVEL_INFO     :
+        case ASL_LEVEL_DEBUG    :
+        default                 : flag = LOG_FLAG_VERBOSE;  async = LOG_ASYNC_VERBOSE;  break;
+    }
+    
+    if (!(_captureLogLevel & flag))
+        return;
+    
+    DDLogMessage * logMessage = [[DDLogMessage alloc]initWithLogMsg:message
+                                                              level:_captureLogLevel
+                                                               flag:flag
+                                                            context:0
+                                                               file:"DDASLLogCapture"
+                                                           function:0
+                                                               line:0
+                                                                tag:nil
+                                                            options:0
+                                                          timestamp:timeStamp];
+    
+    [DDLog log:async message:logMessage];
+}
+
++ (void)captureAslLogs
+{
+    @autoreleasepool
+    {
+        /*
+         We use ASL_KEY_MSG_ID to see each message once, but there's no
+         obvious way to get the "next" ID. To bootstrap the process, we'll
+         search by timestamp until we've seen a message.
+         */
+        
+        struct timeval timeval = { .tv_sec = 0 };
+        gettimeofday(&timeval, NULL);
+        unsigned long long startTime = timeval.tv_sec;
+        __block unsigned long long lastSeenID = 0;
+        
+        /*
+         syslogd posts kNotifyASLDBUpdate (com.apple.system.logger.message)
+         through the notify API when it saves messages to the ASL database.
+         There is some coalescing - currently it is sent at most twice per
+         second - but there is no documented guarantee about this. In any
+         case, there may be multiple messages per notification.
+         
+         Notify notifications don't carry any payload, so we need to search
+         for the messages.
+         */
+        int notifyToken = 0;  // Can be used to unregister with notify_cancel().
+        notify_register_dispatch(kNotifyASLDBUpdate, &notifyToken, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(int token)
+                                 {
+                                     // At least one message has been posted; build a search query.
+                                     @autoreleasepool
+                                     {
+                                         aslmsg query = asl_new(ASL_TYPE_QUERY);
+                                         char stringValue[64];
+                                         if (lastSeenID > 0)
+                                         {
+                                             snprintf(stringValue, sizeof stringValue, "%llu", lastSeenID);
+                                             asl_set_query(query, ASL_KEY_MSG_ID, stringValue, ASL_QUERY_OP_GREATER | ASL_QUERY_OP_NUMERIC);
+                                         }
+                                         else
+                                         {
+                                             snprintf(stringValue, sizeof stringValue, "%llu", startTime);
+                                             asl_set_query(query, ASL_KEY_TIME, stringValue, ASL_QUERY_OP_GREATER_EQUAL | ASL_QUERY_OP_NUMERIC);
+                                         }
+                                         [DDASLLogCapture configureAslQuery:query];
+                                         
+                                         // Iterate over new messages.
+                                         aslmsg msg;
+                                         aslresponse response = asl_search(NULL, query);
+#if defined(__IPHONE_8_0) || defined(__MAC_10_10)
+                                         while ((msg = asl_next(response)))
+#else
+                                         while ((msg = aslresponse_next(response)))
+#endif
+                                         {
+                                             [DDASLLogCapture aslMessageRecieved:msg];
+                                             
+                                             // Keep track of which messages we've seen.
+                                             lastSeenID = atoll(asl_get(msg, ASL_KEY_MSG_ID));
+                                         }
+#if defined(__IPHONE_8_0) || defined(__MAC_10_10)
+                                         asl_release(response);
+#else
+                                         aslresponse_free(response);
+#endif
+                                         if(_cancel)
+                                         {
+                                             notify_cancel(notifyToken);
+                                             return;
+                                         }
+                                         free(query);
+                                     }
+                                 });
+    }
+}
+
+@end
\ No newline at end of file
diff --git a/Lumberjack/DDASLLogger.h b/Lumberjack/DDASLLogger.h
new file mode 100755
index 0000000..a55eb6f
--- /dev/null
+++ b/Lumberjack/DDASLLogger.h
@@ -0,0 +1,37 @@
+#import <Foundation/Foundation.h>
+
+#import "DDLog.h"
+
+/**
+ * Welcome to Cocoa Lumberjack!
+ * 
+ * The project page has a wealth of documentation if you have any questions.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack
+ * 
+ * If you're new to the project you may wish to read the "Getting Started" wiki.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted
+ * 
+ * 
+ * This class provides a logger for the Apple System Log facility.
+ * 
+ * As described in the "Getting Started" page,
+ * the traditional NSLog() function directs it's output to two places:
+ * 
+ * - Apple System Log
+ * - StdErr (if stderr is a TTY) so log statements show up in Xcode console
+ * 
+ * To duplicate NSLog() functionality you can simply add this logger and a tty logger.
+ * However, if you instead choose to use file logging (for faster performance),
+ * you may choose to use a file logger and a tty logger.
+**/
+
+@interface DDASLLogger : DDAbstractLogger <DDLogger>
+
++ (instancetype)sharedInstance;
+
+// Inherited from DDAbstractLogger
+
+// - (id <DDLogFormatter>)logFormatter;
+// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;
+
+@end
diff --git a/Lumberjack/DDASLLogger.m b/Lumberjack/DDASLLogger.m
new file mode 100755
index 0000000..020acb2
--- /dev/null
+++ b/Lumberjack/DDASLLogger.m
@@ -0,0 +1,95 @@
+#import "DDASLLogger.h"
+#import <asl.h>
+#import <libkern/OSAtomic.h>
+
+/**
+ * Welcome to Cocoa Lumberjack!
+ * 
+ * The project page has a wealth of documentation if you have any questions.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack
+ * 
+ * If you're new to the project you may wish to read the "Getting Started" wiki.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted
+**/
+
+#if ! __has_feature(objc_arc)
+#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
+#endif
+
+static DDASLLogger *sharedInstance;
+
+@implementation DDASLLogger
+{
+    aslclient client;
+}
+
++ (instancetype)sharedInstance
+{
+    static dispatch_once_t DDASLLoggerOnceToken;
+    dispatch_once(&DDASLLoggerOnceToken, ^{
+        sharedInstance = [[[self class] alloc] init];
+    });
+    
+    return sharedInstance;
+}
+
+- (id)init
+{
+    if (sharedInstance != nil)
+    {
+        return nil;
+    }
+    
+    if ((self = [super init]))
+    {
+        // A default asl client is provided for the main thread,
+        // but background threads need to create their own client.
+        
+        client = asl_open(NULL, "com.apple.console", 0);
+    }
+    return self;
+}
+
+- (void)logMessage:(DDLogMessage *)logMessage
+{
+    // Skip captured log messages.
+    if (strcmp(logMessage->file, "DDASLLogCapture") == 0)
+        return;
+    
+    NSString *logMsg = logMessage->logMsg;
+    
+    if (formatter)
+    {
+        logMsg = [formatter formatLogMessage:logMessage];
+    }
+    
+    if (logMsg)
+    {
+        const char *msg = [logMsg UTF8String];
+        
+        int aslLogLevel;
+        switch (logMessage->logFlag)
+        {
+            // Note: By default ASL will filter anything above level 5 (Notice).
+            // So our mappings shouldn't go above that level.
+            case LOG_FLAG_ERROR     : aslLogLevel = ASL_LEVEL_CRIT;     break;
+            case LOG_FLAG_WARN      : aslLogLevel = ASL_LEVEL_ERR;      break;
+            case LOG_FLAG_INFO      : aslLogLevel = ASL_LEVEL_WARNING;  break; // Regular NSLog's level
+            case LOG_FLAG_DEBUG     :
+            case LOG_FLAG_VERBOSE   :
+            default                 : aslLogLevel = ASL_LEVEL_NOTICE;   break;
+        }
+        
+        aslmsg m = asl_new(ASL_TYPE_MSG);
+        asl_set(m, ASL_KEY_READ_UID, "501");
+        asl_log(client, m, aslLogLevel, "%s", msg);
+        asl_free(m);
+    }
+}
+
+- (NSString *)loggerName
+{
+    return @"cocoa.lumberjack.aslLogger";
+}
+
+@end
diff --git a/Lumberjack/DDAbstractDatabaseLogger.h b/Lumberjack/DDAbstractDatabaseLogger.h
new file mode 100644
index 0000000..4e0c33c
--- /dev/null
+++ b/Lumberjack/DDAbstractDatabaseLogger.h
@@ -0,0 +1,102 @@
+#import <Foundation/Foundation.h>
+
+#import "DDLog.h"
+
+/**
+ * Welcome to Cocoa Lumberjack!
+ * 
+ * The project page has a wealth of documentation if you have any questions.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack
+ * 
+ * If you're new to the project you may wish to read the "Getting Started" wiki.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted
+ * 
+ * 
+ * This class provides an abstract implementation of a database logger.
+ * 
+ * That is, it provides the base implementation for a database logger to build atop of.
+ * All that is needed for a concrete database logger is to extend this class
+ * and override the methods in the implementation file that are prefixed with "db_".
+**/
+
+@interface DDAbstractDatabaseLogger : DDAbstractLogger {
+@protected
+    NSUInteger saveThreshold;
+    NSTimeInterval saveInterval;
+    NSTimeInterval maxAge;
+    NSTimeInterval deleteInterval;
+    BOOL deleteOnEverySave;
+    
+    BOOL saveTimerSuspended;
+    NSUInteger unsavedCount;
+    dispatch_time_t unsavedTime;
+    dispatch_source_t saveTimer;
+    dispatch_time_t lastDeleteTime;
+    dispatch_source_t deleteTimer;
+}
+
+/**
+ * Specifies how often to save the data to disk.
+ * Since saving is an expensive operation (disk io) it is not done after every log statement.
+ * These properties allow you to configure how/when the logger saves to disk.
+ * 
+ * A save is done when either (whichever happens first):
+ * 
+ * - The number of unsaved log entries reaches saveThreshold
+ * - The amount of time since the oldest unsaved log entry was created reaches saveInterval
+ * 
+ * You can optionally disable the saveThreshold by setting it to zero.
+ * If you disable the saveThreshold you are entirely dependent on the saveInterval.
+ * 
+ * You can optionally disable the saveInterval by setting it to zero (or a negative value).
+ * If you disable the saveInterval you are entirely dependent on the saveThreshold.
+ * 
+ * It's not wise to disable both saveThreshold and saveInterval.
+ * 
+ * The default saveThreshold is 500.
+ * The default saveInterval is 60 seconds.
+**/
+@property (assign, readwrite) NSUInteger saveThreshold;
+@property (assign, readwrite) NSTimeInterval saveInterval;
+
+/**
+ * It is likely you don't want the log entries to persist forever.
+ * Doing so would allow the database to grow infinitely large over time.
+ * 
+ * The maxAge property provides a way to specify how old a log statement can get
+ * before it should get deleted from the database.
+ * 
+ * The deleteInterval specifies how often to sweep for old log entries.
+ * Since deleting is an expensive operation (disk io) is is done on a fixed interval.
+ * 
+ * An alternative to the deleteInterval is the deleteOnEverySave option.
+ * This specifies that old log entries should be deleted during every save operation.
+ * 
+ * You can optionally disable the maxAge by setting it to zero (or a negative value).
+ * If you disable the maxAge then old log statements are not deleted.
+ * 
+ * You can optionally disable the deleteInterval by setting it to zero (or a negative value).
+ * 
+ * If you disable both deleteInterval and deleteOnEverySave then old log statements are not deleted.
+ * 
+ * It's not wise to enable both deleteInterval and deleteOnEverySave.
+ * 
+ * The default maxAge is 7 days.
+ * The default deleteInterval is 5 minutes.
+ * The default deleteOnEverySave is NO.
+**/
+@property (assign, readwrite) NSTimeInterval maxAge;
+@property (assign, readwrite) NSTimeInterval deleteInterval;
+@property (assign, readwrite) BOOL deleteOnEverySave;
+
+/**
+ * Forces a save of any pending log entries (flushes log entries to disk).
+**/
+- (void)savePendingLogEntries;
+
+/**
+ * Removes any log entries that are older than maxAge.
+**/
+- (void)deleteOldLogEntries;
+
+@end
diff --git a/Lumberjack/DDAbstractDatabaseLogger.m b/Lumberjack/DDAbstractDatabaseLogger.m
new file mode 100644
index 0000000..05fcbcb
--- /dev/null
+++ b/Lumberjack/DDAbstractDatabaseLogger.m
@@ -0,0 +1,727 @@
+#import "DDAbstractDatabaseLogger.h"
+#import <math.h>
+
+/**
+ * Welcome to Cocoa Lumberjack!
+ * 
+ * The project page has a wealth of documentation if you have any questions.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack
+ * 
+ * If you're new to the project you may wish to read the "Getting Started" wiki.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted
+**/
+
+#if ! __has_feature(objc_arc)
+#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
+#endif
+
+@interface DDAbstractDatabaseLogger ()
+- (void)destroySaveTimer;
+- (void)destroyDeleteTimer;
+@end
+
+#pragma mark -
+
+@implementation DDAbstractDatabaseLogger
+
+- (id)init
+{
+    if ((self = [super init]))
+    {
+        saveThreshold = 500;
+        saveInterval = 60;           // 60 seconds
+        maxAge = (60 * 60 * 24 * 7); //  7 days
+        deleteInterval = (60 * 5);   //  5 minutes
+    }
+    return self;
+}
+
+- (void)dealloc
+{
+    [self destroySaveTimer];
+    [self destroyDeleteTimer];
+    
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Override Me
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (BOOL)db_log:(DDLogMessage *)logMessage
+{
+    // Override me and add your implementation.
+    // 
+    // Return YES if an item was added to the buffer.
+    // Return NO if the logMessage was ignored.
+    
+    return NO;
+}
+
+- (void)db_save
+{
+    // Override me and add your implementation.
+}
+
+- (void)db_delete
+{
+    // Override me and add your implementation.
+}
+
+- (void)db_saveAndDelete
+{
+    // Override me and add your implementation.
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Private API
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (void)performSaveAndSuspendSaveTimer
+{
+    if (unsavedCount > 0)
+    {
+        if (deleteOnEverySave)
+            [self db_saveAndDelete];
+        else
+            [self db_save];
+    }
+    
+    unsavedCount = 0;
+    unsavedTime = 0;
+    
+    if (saveTimer && !saveTimerSuspended)
+    {
+        dispatch_suspend(saveTimer);
+        saveTimerSuspended = YES;
+    }
+}
+
+- (void)performDelete
+{
+    if (maxAge > 0.0)
+    {
+        [self db_delete];
+        
+        lastDeleteTime = dispatch_time(DISPATCH_TIME_NOW, 0);
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Timers
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (void)destroySaveTimer
+{
+    if (saveTimer)
+    {
+        dispatch_source_cancel(saveTimer);
+        if (saveTimerSuspended)
+        {
+            // Must resume a timer before releasing it (or it will crash)
+            dispatch_resume(saveTimer);
+            saveTimerSuspended = NO;
+        }
+        #if !OS_OBJECT_USE_OBJC
+        dispatch_release(saveTimer);
+        #endif
+        saveTimer = NULL;
+    }
+}
+
+- (void)updateAndResumeSaveTimer
+{
+    if ((saveTimer != NULL) && (saveInterval > 0.0) && (unsavedTime > 0.0))
+    {
+        uint64_t interval = (uint64_t)(saveInterval * NSEC_PER_SEC);
+        dispatch_time_t startTime = dispatch_time(unsavedTime, interval);
+        
+        dispatch_source_set_timer(saveTimer, startTime, interval, 1.0);
+        
+        if (saveTimerSuspended)
+        {
+            dispatch_resume(saveTimer);
+            saveTimerSuspended = NO;
+        }
+    }
+}
+
+- (void)createSuspendedSaveTimer
+{
+    if ((saveTimer == NULL) && (saveInterval > 0.0))
+    {
+        saveTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, loggerQueue);
+        
+        dispatch_source_set_event_handler(saveTimer, ^{ @autoreleasepool {
+            
+            [self performSaveAndSuspendSaveTimer];
+            
+        }});
+        
+        saveTimerSuspended = YES;
+    }
+}
+
+- (void)destroyDeleteTimer
+{
+    if (deleteTimer)
+    {
+        dispatch_source_cancel(deleteTimer);
+        #if !OS_OBJECT_USE_OBJC
+        dispatch_release(deleteTimer);
+        #endif
+        deleteTimer = NULL;
+    }
+}
+
+- (void)updateDeleteTimer
+{
+    if ((deleteTimer != NULL) && (deleteInterval > 0.0) && (maxAge > 0.0))
+    {
+        uint64_t interval = (uint64_t)(deleteInterval * NSEC_PER_SEC);
+        dispatch_time_t startTime;
+        
+        if (lastDeleteTime > 0)
+            startTime = dispatch_time(lastDeleteTime, interval);
+        else
+            startTime = dispatch_time(DISPATCH_TIME_NOW, interval);
+        
+        dispatch_source_set_timer(deleteTimer, startTime, interval, 1.0);
+    }
+}
+
+- (void)createAndStartDeleteTimer
+{
+    if ((deleteTimer == NULL) && (deleteInterval > 0.0) && (maxAge > 0.0))
+    {
+        deleteTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, loggerQueue);
+
+        if (deleteTimer != NULL) {
+            dispatch_source_set_event_handler(deleteTimer, ^{ @autoreleasepool {
+
+                [self performDelete];
+
+            }});
+
+            [self updateDeleteTimer];
+            
+            if (deleteTimer != NULL) dispatch_resume(deleteTimer);
+        }
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Configuration
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (NSUInteger)saveThreshold
+{
+    // The design of this method is taken from the DDAbstractLogger implementation.
+    // For extensive documentation please refer to the DDAbstractLogger implementation.
+    
+    // Note: The internal implementation MUST access the colorsEnabled variable directly,
+    // This method is designed explicitly for external access.
+    //
+    // Using "self." syntax to go through this method will cause immediate deadlock.
+    // This is the intended result. Fix it by accessing the ivar directly.
+    // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
+    
+    NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+    NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax.");
+    
+    dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+    
+    __block NSUInteger result;
+    
+    dispatch_sync(globalLoggingQueue, ^{
+        dispatch_sync(loggerQueue, ^{
+            result = saveThreshold;
+        });
+    });
+    
+    return result;
+}
+
+- (void)setSaveThreshold:(NSUInteger)threshold
+{
+    dispatch_block_t block = ^{ @autoreleasepool {
+        
+        if (saveThreshold != threshold)
+        {
+            saveThreshold = threshold;
+            
+            // Since the saveThreshold has changed,
+            // we check to see if the current unsavedCount has surpassed the new threshold.
+            // 
+            // If it has, we immediately save the log.
+            
+            if ((unsavedCount >= saveThreshold) && (saveThreshold > 0))
+            {
+                [self performSaveAndSuspendSaveTimer];
+            }
+        }
+    }};
+    
+    // The design of the setter logic below is taken from the DDAbstractLogger implementation.
+    // For documentation please refer to the DDAbstractLogger implementation.
+    
+    if ([self isOnInternalLoggerQueue])
+    {
+        block();
+    }
+    else
+    {
+        dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+        NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+        
+        dispatch_async(globalLoggingQueue, ^{
+            dispatch_async(loggerQueue, block);
+        });
+    }
+}
+
+- (NSTimeInterval)saveInterval
+{
+    // The design of this method is taken from the DDAbstractLogger implementation.
+    // For extensive documentation please refer to the DDAbstractLogger implementation.
+    
+    // Note: The internal implementation MUST access the colorsEnabled variable directly,
+    // This method is designed explicitly for external access.
+    //
+    // Using "self." syntax to go through this method will cause immediate deadlock.
+    // This is the intended result. Fix it by accessing the ivar directly.
+    // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
+    
+    NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+    NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax.");
+    
+    dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+    
+    __block NSTimeInterval result;
+    
+    dispatch_sync(globalLoggingQueue, ^{
+        dispatch_sync(loggerQueue, ^{
+            result = saveInterval;
+        });
+    });
+    
+    return result;
+}
+
+- (void)setSaveInterval:(NSTimeInterval)interval
+{
+    dispatch_block_t block = ^{ @autoreleasepool {
+    
+        // C99 recommended floating point comparison macro
+        // Read: isLessThanOrGreaterThan(floatA, floatB)
+        
+        if (/* saveInterval != interval */ islessgreater(saveInterval, interval))
+        {
+            saveInterval = interval;
+            
+            // There are several cases we need to handle here.
+            // 
+            // 1. If the saveInterval was previously enabled and it just got disabled,
+            //    then we need to stop the saveTimer. (And we might as well release it.)
+            // 
+            // 2. If the saveInterval was previously disabled and it just got enabled,
+            //    then we need to setup the saveTimer. (Plus we might need to do an immediate save.)
+            // 
+            // 3. If the saveInterval increased, then we need to reset the timer so that it fires at the later date.
+            // 
+            // 4. If the saveInterval decreased, then we need to reset the timer so that it fires at an earlier date.
+            //    (Plus we might need to do an immediate save.)
+            
+            if (saveInterval > 0.0)
+            {
+                if (saveTimer == NULL)
+                {
+                    // Handles #2
+                    //
+                    // Since the saveTimer uses the unsavedTime to calculate it's first fireDate,
+                    // if a save is needed the timer will fire immediately.
+                    
+                    [self createSuspendedSaveTimer];
+                    [self updateAndResumeSaveTimer];
+                }
+                else
+                {
+                    // Handles #3
+                    // Handles #4
+                    //
+                    // Since the saveTimer uses the unsavedTime to calculate it's first fireDate,
+                    // if a save is needed the timer will fire immediately.
+                    
+                    [self updateAndResumeSaveTimer];
+                }
+            }
+            else if (saveTimer)
+            {
+                // Handles #1
+                
+                [self destroySaveTimer];
+            }
+        }
+    }};
+    
+    // The design of the setter logic below is taken from the DDAbstractLogger implementation.
+    // For documentation please refer to the DDAbstractLogger implementation.
+    
+    if ([self isOnInternalLoggerQueue])
+    {
+        block();
+    }
+    else
+    {
+        dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+        NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+        
+        dispatch_async(globalLoggingQueue, ^{
+            dispatch_async(loggerQueue, block);
+        });
+    }
+}
+
+- (NSTimeInterval)maxAge
+{
+    // The design of this method is taken from the DDAbstractLogger implementation.
+    // For extensive documentation please refer to the DDAbstractLogger implementation.
+    
+    // Note: The internal implementation MUST access the colorsEnabled variable directly,
+    // This method is designed explicitly for external access.
+    //
+    // Using "self." syntax to go through this method will cause immediate deadlock.
+    // This is the intended result. Fix it by accessing the ivar directly.
+    // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
+    
+    NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+    NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax.");
+    
+    dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+    
+    __block NSTimeInterval result;
+    
+    dispatch_sync(globalLoggingQueue, ^{
+        dispatch_sync(loggerQueue, ^{
+            result = maxAge;
+        });
+    });
+    
+    return result;
+}
+
+- (void)setMaxAge:(NSTimeInterval)interval
+{
+    dispatch_block_t block = ^{ @autoreleasepool {
+        
+        // C99 recommended floating point comparison macro
+        // Read: isLessThanOrGreaterThan(floatA, floatB)
+        
+        if (/* maxAge != interval */ islessgreater(maxAge, interval))
+        {
+            NSTimeInterval oldMaxAge = maxAge;
+            NSTimeInterval newMaxAge = interval;
+            
+            maxAge = interval;
+            
+            // There are several cases we need to handle here.
+            // 
+            // 1. If the maxAge was previously enabled and it just got disabled,
+            //    then we need to stop the deleteTimer. (And we might as well release it.)
+            // 
+            // 2. If the maxAge was previously disabled and it just got enabled,
+            //    then we need to setup the deleteTimer. (Plus we might need to do an immediate delete.)
+            // 
+            // 3. If the maxAge was increased,
+            //    then we don't need to do anything.
+            // 
+            // 4. If the maxAge was decreased,
+            //    then we should do an immediate delete.
+            
+            BOOL shouldDeleteNow = NO;
+            
+            if (oldMaxAge > 0.0)
+            {
+                if (newMaxAge <= 0.0)
+                {
+                    // Handles #1
+                    
+                    [self destroyDeleteTimer];
+                }
+                else if (oldMaxAge > newMaxAge)
+                {
+                    // Handles #4
+                    shouldDeleteNow = YES;
+                }
+            }
+            else if (newMaxAge > 0.0)
+            {
+                // Handles #2
+                shouldDeleteNow = YES;
+            }
+            
+            if (shouldDeleteNow)
+            {
+                [self performDelete];
+                
+                if (deleteTimer)
+                    [self updateDeleteTimer];
+                else
+                    [self createAndStartDeleteTimer];
+            }
+        }
+    }};
+    
+    // The design of the setter logic below is taken from the DDAbstractLogger implementation.
+    // For documentation please refer to the DDAbstractLogger implementation.
+    
+    if ([self isOnInternalLoggerQueue])
+    {
+        block();
+    }
+    else
+    {
+        dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+        NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+        
+        dispatch_async(globalLoggingQueue, ^{
+            dispatch_async(loggerQueue, block);
+        });
+    }
+}
+
+- (NSTimeInterval)deleteInterval
+{
+    // The design of this method is taken from the DDAbstractLogger implementation.
+    // For extensive documentation please refer to the DDAbstractLogger implementation.
+    
+    // Note: The internal implementation MUST access the colorsEnabled variable directly,
+    // This method is designed explicitly for external access.
+    //
+    // Using "self." syntax to go through this method will cause immediate deadlock.
+    // This is the intended result. Fix it by accessing the ivar directly.
+    // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
+    
+    NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+    NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax.");
+    
+    dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+    
+    __block NSTimeInterval result;
+    
+    dispatch_sync(globalLoggingQueue, ^{
+        dispatch_sync(loggerQueue, ^{
+            result = deleteInterval;
+        });
+    });
+    
+    return result;
+}
+
+- (void)setDeleteInterval:(NSTimeInterval)interval
+{
+    dispatch_block_t block = ^{ @autoreleasepool {
+        
+        // C99 recommended floating point comparison macro
+        // Read: isLessThanOrGreaterThan(floatA, floatB)
+        
+        if (/* deleteInterval != interval */ islessgreater(deleteInterval, interval))
+        {
+            deleteInterval = interval;
+            
+            // There are several cases we need to handle here.
+            // 
+            // 1. If the deleteInterval was previously enabled and it just got disabled,
+            //    then we need to stop the deleteTimer. (And we might as well release it.)
+            // 
+            // 2. If the deleteInterval was previously disabled and it just got enabled,
+            //    then we need to setup the deleteTimer. (Plus we might need to do an immediate delete.)
+            // 
+            // 3. If the deleteInterval increased, then we need to reset the timer so that it fires at the later date.
+            // 
+            // 4. If the deleteInterval decreased, then we need to reset the timer so that it fires at an earlier date.
+            //    (Plus we might need to do an immediate delete.)
+            
+            if (deleteInterval > 0.0)
+            {
+                if (deleteTimer == NULL)
+                {
+                    // Handles #2
+                    //
+                    // Since the deleteTimer uses the lastDeleteTime to calculate it's first fireDate,
+                    // if a delete is needed the timer will fire immediately.
+                    
+                    [self createAndStartDeleteTimer];
+                }
+                else
+                {
+                    // Handles #3
+                    // Handles #4
+                    //
+                    // Since the deleteTimer uses the lastDeleteTime to calculate it's first fireDate,
+                    // if a save is needed the timer will fire immediately.
+                    
+                    [self updateDeleteTimer];
+                }
+            }
+            else if (deleteTimer)
+            {
+                // Handles #1
+                
+                [self destroyDeleteTimer];
+            }
+        }
+    }};
+    
+    // The design of the setter logic below is taken from the DDAbstractLogger implementation.
+    // For documentation please refer to the DDAbstractLogger implementation.
+    
+    if ([self isOnInternalLoggerQueue])
+    {
+        block();
+    }
+    else
+    {
+        dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+        NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+        
+        dispatch_async(globalLoggingQueue, ^{
+            dispatch_async(loggerQueue, block);
+        });
+    }
+}
+
+- (BOOL)deleteOnEverySave
+{
+    // The design of this method is taken from the DDAbstractLogger implementation.
+    // For extensive documentation please refer to the DDAbstractLogger implementation.
+    
+    // Note: The internal implementation MUST access the colorsEnabled variable directly,
+    // This method is designed explicitly for external access.
+    //
+    // Using "self." syntax to go through this method will cause immediate deadlock.
+    // This is the intended result. Fix it by accessing the ivar directly.
+    // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
+    
+    NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+    NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax.");
+    
+    dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+    
+    __block BOOL result;
+    
+    dispatch_sync(globalLoggingQueue, ^{
+        dispatch_sync(loggerQueue, ^{
+            result = deleteOnEverySave;
+        });
+    });
+    
+    return result;
+}
+
+- (void)setDeleteOnEverySave:(BOOL)flag
+{
+    dispatch_block_t block = ^{
+        
+        deleteOnEverySave = flag;
+    };
+    
+    // The design of the setter logic below is taken from the DDAbstractLogger implementation.
+    // For documentation please refer to the DDAbstractLogger implementation.
+    
+    if ([self isOnInternalLoggerQueue])
+    {
+        block();
+    }
+    else
+    {
+        dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+        NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+        
+        dispatch_async(globalLoggingQueue, ^{
+            dispatch_async(loggerQueue, block);
+        });
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Public API
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (void)savePendingLogEntries
+{
+    dispatch_block_t block = ^{ @autoreleasepool {
+        
+        [self performSaveAndSuspendSaveTimer];
+    }};
+    
+    if ([self isOnInternalLoggerQueue])
+        block();
+    else
+        dispatch_async(loggerQueue, block);
+}
+
+- (void)deleteOldLogEntries
+{
+    dispatch_block_t block = ^{ @autoreleasepool {
+        
+        [self performDelete];
+    }};
+    
+    if ([self isOnInternalLoggerQueue])
+        block();
+    else
+        dispatch_async(loggerQueue, block);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark DDLogger
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (void)didAddLogger
+{
+    // If you override me be sure to invoke [super didAddLogger];
+    
+    [self createSuspendedSaveTimer];
+    
+    [self createAndStartDeleteTimer];
+}
+
+- (void)willRemoveLogger
+{
+    // If you override me be sure to invoke [super willRemoveLogger];
+    
+    [self performSaveAndSuspendSaveTimer];
+    
+    [self destroySaveTimer];
+    [self destroyDeleteTimer];
+}
+
+- (void)logMessage:(DDLogMessage *)logMessage
+{
+    if ([self db_log:logMessage])
+    {
+        BOOL firstUnsavedEntry = (++unsavedCount == 1);
+        
+        if ((unsavedCount >= saveThreshold) && (saveThreshold > 0))
+        {
+            [self performSaveAndSuspendSaveTimer];
+        }
+        else if (firstUnsavedEntry)
+        {
+            unsavedTime = dispatch_time(DISPATCH_TIME_NOW, 0);
+            [self updateAndResumeSaveTimer];
+        }
+    }
+}
+
+- (void)flush
+{
+    // This method is invoked by DDLog's flushLog method.
+    // 
+    // It is called automatically when the application quits,
+    // or if the developer invokes DDLog's flushLog method prior to crashing or something.
+    
+    [self performSaveAndSuspendSaveTimer];
+}
+
+@end
diff --git a/Lumberjack/DDAssert.h b/Lumberjack/DDAssert.h
new file mode 100644
index 0000000..4bad8e2
--- /dev/null
+++ b/Lumberjack/DDAssert.h
@@ -0,0 +1,16 @@
+//
+//  DDAssert.h
+//  CocoaLumberjack
+//
+//  Created by Ernesto Rivera on 2014/07/07.
+//
+//
+
+#import "DDLog.h"
+
+#define DDAssert(condition, frmt, ...) if (!(condition)) {                                                           \
+                                           NSString * description = [NSString stringWithFormat:frmt, ##__VA_ARGS__]; \
+                                           DDLogError(@"%@", description);                                           \
+                                           NSAssert(NO, description); }
+#define DDAssertCondition(condition) DDAssert(condition, @"Condition not satisfied: %s", #condition)
+
diff --git a/Lumberjack/DDFileLogger.h b/Lumberjack/DDFileLogger.h
new file mode 100644
index 0000000..b319c51
--- /dev/null
+++ b/Lumberjack/DDFileLogger.h
@@ -0,0 +1,406 @@
+#import <Foundation/Foundation.h>
+#import "DDLog.h"
+
+@class DDLogFileInfo;
+
+/**
+ * Welcome to Cocoa Lumberjack!
+ * 
+ * The project page has a wealth of documentation if you have any questions.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack
+ * 
+ * If you're new to the project you may wish to read the "Getting Started" wiki.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted
+ * 
+ * 
+ * This class provides a logger to write log statements to a file.
+**/
+
+
+// Default configuration and safety/sanity values.
+// 
+// maximumFileSize         -> DEFAULT_LOG_MAX_FILE_SIZE
+// rollingFrequency        -> DEFAULT_LOG_ROLLING_FREQUENCY
+// maximumNumberOfLogFiles -> DEFAULT_LOG_MAX_NUM_LOG_FILES
+// logFilesDiskQuota       -> DEFAULT_LOG_FILES_DISK_QUOTA
+// 
+// You should carefully consider the proper configuration values for your application.
+
+#define DEFAULT_LOG_MAX_FILE_SIZE     (1024 * 1024)      //  1 MB
+#define DEFAULT_LOG_ROLLING_FREQUENCY (60 * 60 * 24)     // 24 Hours
+#define DEFAULT_LOG_MAX_NUM_LOG_FILES (5)                //  5 Files
+#define DEFAULT_LOG_FILES_DISK_QUOTA  (20 * 1024 * 1024) // 20 MB
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// The LogFileManager protocol is designed to allow you to control all aspects of your log files.
+// 
+// The primary purpose of this is to allow you to do something with the log files after they have been rolled.
+// Perhaps you want to compress them to save disk space.
+// Perhaps you want to upload them to an FTP server.
+// Perhaps you want to run some analytics on the file.
+// 
+// A default LogFileManager is, of course, provided.
+// The default LogFileManager simply deletes old log files according to the maximumNumberOfLogFiles property.
+// 
+// This protocol provides various methods to fetch the list of log files.
+// 
+// There are two variants: sorted and unsorted.
+// If sorting is not necessary, the unsorted variant is obviously faster.
+// The sorted variant will return an array sorted by when the log files were created,
+// with the most recently created log file at index 0, and the oldest log file at the end of the array.
+// 
+// You can fetch only the log file paths (full path including name), log file names (name only),
+// or an array of DDLogFileInfo objects.
+// The DDLogFileInfo class is documented below, and provides a handy wrapper that
+// gives you easy access to various file attributes such as the creation date or the file size.
+
+@protocol DDLogFileManager <NSObject>
+@required
+
+// Public properties
+
+/**
+ * The maximum number of archived log files to keep on disk.
+ * For example, if this property is set to 3,
+ * then the LogFileManager will only keep 3 archived log files (plus the current active log file) on disk.
+ * Once the active log file is rolled/archived, then the oldest of the existing 3 rolled/archived log files is deleted.
+ * 
+ * You may optionally disable this option by setting it to zero.
+**/
+@property (readwrite, assign, atomic) NSUInteger maximumNumberOfLogFiles;
+
+/**
+ * The maximum space that logs can take. On rolling logfile all old logfiles that exceed logFilesDiskQuota will
+ * be deleted.
+ *
+ * You may optionally disable this option by setting it to zero.
+**/
+@property (readwrite, assign, atomic) unsigned long long logFilesDiskQuota;
+
+// Public methods
+
+- (NSString *)logsDirectory;
+
+- (NSArray *)unsortedLogFilePaths;
+- (NSArray *)unsortedLogFileNames;
+- (NSArray *)unsortedLogFileInfos;
+
+- (NSArray *)sortedLogFilePaths;
+- (NSArray *)sortedLogFileNames;
+- (NSArray *)sortedLogFileInfos;
+
+// Private methods (only to be used by DDFileLogger)
+
+- (NSString *)createNewLogFile;
+
+@optional
+
+// Notifications from DDFileLogger
+
+- (void)didArchiveLogFile:(NSString *)logFilePath;
+- (void)didRollAndArchiveLogFile:(NSString *)logFilePath;
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Default log file manager.
+ * 
+ * All log files are placed inside the logsDirectory.
+ * If a specific logsDirectory isn't specified, the default directory is used.
+ * On Mac, this is in ~/Library/Logs/<Application Name>.
+ * On iPhone, this is in ~/Library/Caches/Logs.
+ * 
+ * Log files are named "<bundle identifier> <date> <time>.log"
+ * Example: com.organization.myapp 2013-12-03 17-14.log
+ * 
+ * Archived log files are automatically deleted according to the maximumNumberOfLogFiles property.
+**/
+@interface DDLogFileManagerDefault : NSObject <DDLogFileManager>
+{
+    NSUInteger maximumNumberOfLogFiles;
+    unsigned long long logFilesDiskQuota;
+    NSString *_logsDirectory;
+#if TARGET_OS_IPHONE
+    NSString* _defaultFileProtectionLevel;
+#endif
+}
+
+- (id)init;
+- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory;
+#if TARGET_OS_IPHONE
+/*
+ * Calling this constructor you can override the default "automagically" chosen NSFileProtection level.
+ * Useful if you are writing a command line utility / CydiaSubstrate addon for iOS that has no NSBundle
+ * or like SpringBoard no BackgroundModes key in the NSBundle:
+ *    iPhone:~ root# cycript -p SpringBoard
+ *    cy# [NSBundle mainBundle]
+ *    #"NSBundle </System/Library/CoreServices/SpringBoard.app> (loaded)"
+ *    cy# [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIBackgroundModes"];
+ *    null
+ *    cy#
+ **/
+- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory defaultFileProtectionLevel:(NSString*)fileProtectionLevel;
+#endif
+
+/*
+ * Methods to override.
+ *
+ * Log files are named "<bundle identifier> <date> <time>.log"
+ * Example: com.organization.myapp 2013-12-03 17-14.log
+ *
+ * If you wish to change default filename, you can override following two methods.
+ * - newLogFileName method would be called on new logfile creation.
+ * - isLogFile: method would be called to filter logfiles from all other files in logsDirectory.
+ *   You have to parse given filename and return YES if it is logFile.
+ *
+ * **NOTE**
+ * newLogFileName returns filename. If appropriate file already exists, number would be added
+ * to filename before extension. You have to handle this case in isLogFile: method.
+ *
+ * Example:
+ * - newLogFileName returns "com.organization.myapp 2013-12-03.log",
+ *   file "com.organization.myapp 2013-12-03.log" would be created.
+ * - after some time "com.organization.myapp 2013-12-03.log" is archived
+ * - newLogFileName again returns "com.organization.myapp 2013-12-03.log",
+ *   file "com.organization.myapp 2013-12-03 2.log" would be created.
+ * - after some time "com.organization.myapp 2013-12-03 1.log" is archived
+ * - newLogFileName again returns "com.organization.myapp 2013-12-03.log",
+ *   file "com.organization.myapp 2013-12-03 3.log" would be created.
+**/
+- (NSString *)newLogFileName;
+- (BOOL)isLogFile:(NSString *)fileName;
+
+/* Inherited from DDLogFileManager protocol:
+
+@property (readwrite, assign, atomic) NSUInteger maximumNumberOfLogFiles;
+@property (readwrite, assign, atomic) NSUInteger logFilesDiskQuota;
+
+- (NSString *)logsDirectory;
+
+- (NSArray *)unsortedLogFilePaths;
+- (NSArray *)unsortedLogFileNames;
+- (NSArray *)unsortedLogFileInfos;
+
+- (NSArray *)sortedLogFilePaths;
+- (NSArray *)sortedLogFileNames;
+- (NSArray *)sortedLogFileInfos;
+
+*/
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Most users will want file log messages to be prepended with the date and time.
+ * Rather than forcing the majority of users to write their own formatter,
+ * we will supply a logical default formatter.
+ * Users can easily replace this formatter with their own by invoking the setLogFormatter method.
+ * It can also be removed by calling setLogFormatter, and passing a nil parameter.
+ * 
+ * In addition to the convenience of having a logical default formatter,
+ * it will also provide a template that makes it easy for developers to copy and change.
+**/
+@interface DDLogFileFormatterDefault : NSObject <DDLogFormatter>
+{
+    NSDateFormatter *dateFormatter;
+}
+
+- (id)init;
+- (instancetype)initWithDateFormatter:(NSDateFormatter *)dateFormatter;
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@interface DDFileLogger : DDAbstractLogger <DDLogger>
+{
+    __strong id <DDLogFileManager> logFileManager;
+    
+    DDLogFileInfo *currentLogFileInfo;
+    NSFileHandle *currentLogFileHandle;
+    
+    dispatch_source_t currentLogFileVnode;
+    dispatch_source_t rollingTimer;
+    
+    unsigned long long maximumFileSize;
+    NSTimeInterval rollingFrequency;
+}
+
+- (id)init;
+- (instancetype)initWithLogFileManager:(id <DDLogFileManager>)logFileManager;
+
+/**
+ * Log File Rolling:
+ * 
+ * maximumFileSize:
+ *   The approximate maximum size to allow log files to grow.
+ *   If a log file is larger than this value after a log statement is appended,
+ *   then the log file is rolled.
+ * 
+ * rollingFrequency
+ *   How often to roll the log file.
+ *   The frequency is given as an NSTimeInterval, which is a double that specifies the interval in seconds.
+ *   Once the log file gets to be this old, it is rolled.
+ * 
+ * Both the maximumFileSize and the rollingFrequency are used to manage rolling.
+ * Whichever occurs first will cause the log file to be rolled.
+ * 
+ * For example:
+ * The rollingFrequency is 24 hours,
+ * but the log file surpasses the maximumFileSize after only 20 hours.
+ * The log file will be rolled at that 20 hour mark.
+ * A new log file will be created, and the 24 hour timer will be restarted.
+ * 
+ * You may optionally disable rolling due to filesize by setting maximumFileSize to zero.
+ * If you do so, rolling is based solely on rollingFrequency.
+ * 
+ * You may optionally disable rolling due to time by setting rollingFrequency to zero (or any non-positive number).
+ * If you do so, rolling is based solely on maximumFileSize.
+ * 
+ * If you disable both maximumFileSize and rollingFrequency, then the log file won't ever be rolled.
+ * This is strongly discouraged.
+**/
+@property (readwrite, assign) unsigned long long maximumFileSize;
+@property (readwrite, assign) NSTimeInterval rollingFrequency;
+@property (readwrite, assign, atomic) BOOL doNotReuseLogFiles;
+
+/**
+ * The DDLogFileManager instance can be used to retrieve the list of log files,
+ * and configure the maximum number of archived log files to keep.
+ * 
+ * @see DDLogFileManager.maximumNumberOfLogFiles
+**/
+@property (strong, nonatomic, readonly) id <DDLogFileManager> logFileManager;
+
+/**
+ * When using a custom formatter you can set the logMessage method not to append
+ * '\n' character after each output. This allows for some greater flexibility with
+ * custom formatters. Default value is YES.
+**/
+ 
+@property (readwrite, assign) BOOL automaticallyAppendNewlineForCustomFormatters;
+
+// You can optionally force the current log file to be rolled with this method.
+// CompletionBlock will be called on main queue.
+
+- (void)rollLogFileWithCompletionBlock:(void (^)())completionBlock;
+
+// Method is deprecated. Use rollLogFileWithCompletionBlock: method instead.
+
+- (void)rollLogFile __attribute((deprecated));
+
+// Inherited from DDAbstractLogger
+
+// - (id <DDLogFormatter>)logFormatter;
+// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * DDLogFileInfo is a simple class that provides access to various file attributes.
+ * It provides good performance as it only fetches the information if requested,
+ * and it caches the information to prevent duplicate fetches.
+ * 
+ * It was designed to provide quick snapshots of the current state of log files,
+ * and to help sort log files in an array.
+ * 
+ * This class does not monitor the files, or update it's cached attribute values if the file changes on disk.
+ * This is not what the class was designed for.
+ * 
+ * If you absolutely must get updated values,
+ * you can invoke the reset method which will clear the cache.
+**/
+@interface DDLogFileInfo : NSObject
+{
+    __strong NSString *filePath;
+    __strong NSString *fileName;
+    
+    __strong NSDictionary *fileAttributes;
+    
+    __strong NSDate *creationDate;
+    __strong NSDate *modificationDate;
+    
+    unsigned long long fileSize;
+}
+
+@property (strong, nonatomic, readonly) NSString *filePath;
+@property (strong, nonatomic, readonly) NSString *fileName;
+
+@property (strong, nonatomic, readonly) NSDictionary *fileAttributes;
+
+@property (strong, nonatomic, readonly) NSDate *creationDate;
+@property (strong, nonatomic, readonly) NSDate *modificationDate;
+
+@property (nonatomic, readonly) unsigned long long fileSize;
+
+@property (nonatomic, readonly) NSTimeInterval age;
+
+@property (nonatomic, readwrite) BOOL isArchived;
+
++ (instancetype)logFileWithPath:(NSString *)filePath;
+
+- (instancetype)initWithFilePath:(NSString *)filePath;
+
+- (void)reset;
+- (void)renameFile:(NSString *)newFileName;
+
+#if TARGET_IPHONE_SIMULATOR
+
+// So here's the situation.
+// Extended attributes are perfect for what we're trying to do here (marking files as archived).
+// This is exactly what extended attributes were designed for.
+// 
+// But Apple screws us over on the simulator.
+// Everytime you build-and-go, they copy the application into a new folder on the hard drive,
+// and as part of the process they strip extended attributes from our log files.
+// Normally, a copy of a file preserves extended attributes.
+// So obviously Apple has gone to great lengths to piss us off.
+// 
+// Thus we use a slightly different tactic for marking log files as archived in the simulator.
+// That way it "just works" and there's no confusion when testing.
+// 
+// The difference in method names is indicative of the difference in functionality.
+// On the simulator we add an attribute by appending a filename extension.
+// 
+// For example:
+// "mylog.txt" -> "mylog.archived.txt"
+// "mylog"     -> "mylog.archived"
+
+- (BOOL)hasExtensionAttributeWithName:(NSString *)attrName;
+
+- (void)addExtensionAttributeWithName:(NSString *)attrName;
+- (void)removeExtensionAttributeWithName:(NSString *)attrName;
+
+#else
+
+// Normal use of extended attributes used everywhere else,
+// such as on Macs and on iPhone devices.
+
+- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName;
+
+- (void)addExtendedAttributeWithName:(NSString *)attrName;
+- (void)removeExtendedAttributeWithName:(NSString *)attrName;
+
+#endif
+
+- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another;
+- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another;
+
+@end
diff --git a/Lumberjack/DDFileLogger.m b/Lumberjack/DDFileLogger.m
new file mode 100644
index 0000000..1b44093
--- /dev/null
+++ b/Lumberjack/DDFileLogger.m
@@ -0,0 +1,1589 @@
+#import "DDFileLogger.h"
+
+#import <unistd.h>
+#import <sys/attr.h>
+#import <sys/xattr.h>
+#import <libkern/OSAtomic.h>
+
+/**
+ * Welcome to Cocoa Lumberjack!
+ * 
+ * The project page has a wealth of documentation if you have any questions.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack
+ * 
+ * If you're new to the project you may wish to read the "Getting Started" wiki.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted
+**/
+
+#if ! __has_feature(objc_arc)
+#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
+#endif
+
+// We probably shouldn't be using DDLog() statements within the DDLog implementation.
+// But we still want to leave our log statements for any future debugging,
+// and to allow other developers to trace the implementation (which is a great learning tool).
+// 
+// So we use primitive logging macros around NSLog.
+// We maintain the NS prefix on the macros to be explicit about the fact that we're using NSLog.
+
+#define LOG_LEVEL 2
+
+#define NSLogError(frmt, ...)    do{ if(LOG_LEVEL >= 1) NSLog((frmt), ##__VA_ARGS__); } while(0)
+#define NSLogWarn(frmt, ...)     do{ if(LOG_LEVEL >= 2) NSLog((frmt), ##__VA_ARGS__); } while(0)
+#define NSLogInfo(frmt, ...)     do{ if(LOG_LEVEL >= 3) NSLog((frmt), ##__VA_ARGS__); } while(0)
+#define NSLogDebug(frmt, ...)    do{ if(LOG_LEVEL >= 4) NSLog((frmt), ##__VA_ARGS__); } while(0)
+#define NSLogVerbose(frmt, ...)  do{ if(LOG_LEVEL >= 5) NSLog((frmt), ##__VA_ARGS__); } while(0)
+
+@interface DDLogFileManagerDefault (PrivateAPI)
+
+- (void)deleteOldLogFiles;
+- (NSString *)defaultLogsDirectory;
+
+@end
+
+@interface DDFileLogger (PrivateAPI)
+
+- (void)rollLogFileNow;
+- (void)maybeRollLogFileDueToAge;
+- (void)maybeRollLogFileDueToSize;
+
+@end
+
+#if TARGET_OS_IPHONE
+BOOL doesAppRunInBackground(void);
+#endif
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation DDLogFileManagerDefault
+
+@synthesize maximumNumberOfLogFiles;
+@synthesize logFilesDiskQuota;
+
+
+- (id)init
+{
+    return [self initWithLogsDirectory:nil];
+}
+
+- (instancetype)initWithLogsDirectory:(NSString *)aLogsDirectory
+{
+    if ((self = [super init]))
+    {
+        maximumNumberOfLogFiles = DEFAULT_LOG_MAX_NUM_LOG_FILES;
+        logFilesDiskQuota = DEFAULT_LOG_FILES_DISK_QUOTA;
+        
+        if (aLogsDirectory)
+            _logsDirectory = [aLogsDirectory copy];
+        else
+            _logsDirectory = [[self defaultLogsDirectory] copy];
+        
+        NSKeyValueObservingOptions kvoOptions = NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew;
+        
+        [self addObserver:self forKeyPath:NSStringFromSelector(@selector(maximumNumberOfLogFiles)) options:kvoOptions context:nil];
+        [self addObserver:self forKeyPath:NSStringFromSelector(@selector(logFilesDiskQuota)) options:kvoOptions context:nil];
+        
+        NSLogVerbose(@"DDFileLogManagerDefault: logsDirectory:\n%@", [self logsDirectory]);
+        NSLogVerbose(@"DDFileLogManagerDefault: sortedLogFileNames:\n%@", [self sortedLogFileNames]);
+    }
+    return self;
+}
+
+#if TARGET_OS_IPHONE
+- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory defaultFileProtectionLevel:(NSString*)fileProtectionLevel {
+    if ((self = [self initWithLogsDirectory:logsDirectory])) {
+        if ([fileProtectionLevel isEqualToString:NSFileProtectionNone] ||
+            [fileProtectionLevel isEqualToString:NSFileProtectionComplete] ||
+            [fileProtectionLevel isEqualToString:NSFileProtectionCompleteUnlessOpen] ||
+            [fileProtectionLevel isEqualToString:NSFileProtectionCompleteUntilFirstUserAuthentication]) {
+            _defaultFileProtectionLevel = fileProtectionLevel;
+        }
+    }
+    return self;
+}
+#endif
+
+- (void)dealloc
+{
+    // try-catch because the observer might be removed or never added. In this case, removeObserver throws and exception
+    @try {
+        [self removeObserver:self forKeyPath:NSStringFromSelector(@selector(maximumNumberOfLogFiles))];
+        [self removeObserver:self forKeyPath:NSStringFromSelector(@selector(logFilesDiskQuota))];
+    }
+    @catch (NSException *exception) {
+        
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Configuration
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (void)observeValueForKeyPath:(NSString *)keyPath
+                      ofObject:(id)object
+                        change:(NSDictionary *)change
+                       context:(void *)context
+{
+    NSNumber *old = [change objectForKey:NSKeyValueChangeOldKey];
+    NSNumber *new = [change objectForKey:NSKeyValueChangeNewKey];
+    
+    if ([old isEqual:new])
+    {
+        // No change in value - don't bother with any processing.
+        return;
+    }
+    
+    if ([keyPath isEqualToString:NSStringFromSelector(@selector(maximumNumberOfLogFiles))] ||
+        [keyPath isEqualToString:NSStringFromSelector(@selector(logFilesDiskQuota))])
+    {
+        NSLogInfo(@"DDFileLogManagerDefault: Responding to configuration change: %@", keyPath);
+        
+        dispatch_async([DDLog loggingQueue], ^{ @autoreleasepool {
+            
+            [self deleteOldLogFiles];
+        }});
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark File Deleting
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Deletes archived log files that exceed the maximumNumberOfLogFiles or logFilesDiskQuota configuration values.
+**/
+- (void)deleteOldLogFiles
+{
+    NSLogVerbose(@"DDLogFileManagerDefault: deleteOldLogFiles");
+    
+    NSArray *sortedLogFileInfos = [self sortedLogFileInfos];
+
+    NSUInteger firstIndexToDelete = NSNotFound;
+
+    const unsigned long long diskQuota = self.logFilesDiskQuota;
+    const NSUInteger maxNumLogFiles = self.maximumNumberOfLogFiles;
+
+    if (diskQuota)
+    {
+        unsigned long long used = 0;
+
+        for (NSUInteger i = 0; i < sortedLogFileInfos.count; i++)
+        {
+            DDLogFileInfo *info = sortedLogFileInfos[i];
+            used += info.fileSize;
+
+            if (used > diskQuota)
+            {
+                firstIndexToDelete = i;
+                break;
+            }
+        }
+    }
+
+    if (maxNumLogFiles)
+    {
+        if (firstIndexToDelete == NSNotFound)
+        {
+            firstIndexToDelete = maxNumLogFiles;
+        }
+        else
+        {
+            firstIndexToDelete = MIN(firstIndexToDelete, maxNumLogFiles);
+        }
+    }
+
+    if (firstIndexToDelete == 0) {
+        // Do we consider the first file?
+        // We are only supposed to be deleting archived files.
+        // In most cases, the first file is likely the log file that is currently being written to.
+        // So in most cases, we do not want to consider this file for deletion.
+
+        if (sortedLogFileInfos.count > 0)
+        {
+            DDLogFileInfo *logFileInfo = [sortedLogFileInfos objectAtIndex:0];
+
+            if (! logFileInfo.isArchived)
+            {
+                // Don't delete active file.
+                ++firstIndexToDelete;
+            }
+        }
+    }
+
+    if (firstIndexToDelete != NSNotFound)
+    {
+        // removing all logfiles starting with firstIndexToDelete
+
+        for (NSUInteger i = firstIndexToDelete; i < sortedLogFileInfos.count; i++)
+        {
+            DDLogFileInfo *logFileInfo = sortedLogFileInfos[i];
+
+            NSLogInfo(@"DDLogFileManagerDefault: Deleting file: %@", logFileInfo.fileName);
+
+            [[NSFileManager defaultManager] removeItemAtPath:logFileInfo.filePath error:nil];
+        }
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Log Files
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Returns the path to the default logs directory.
+ * If the logs directory doesn't exist, this method automatically creates it.
+**/
+- (NSString *)defaultLogsDirectory
+{
+#if TARGET_OS_IPHONE
+    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
+    NSString *baseDir = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
+    NSString *logsDirectory = [baseDir stringByAppendingPathComponent:@"Logs"];
+    
+#else
+    NSString *appName = [[NSProcessInfo processInfo] processName];
+    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
+    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : NSTemporaryDirectory();
+    NSString *logsDirectory = [[basePath stringByAppendingPathComponent:@"Logs"] stringByAppendingPathComponent:appName];
+
+#endif
+
+    return logsDirectory;
+}
+
+- (NSString *)logsDirectory
+{
+    // We could do this check once, during initalization, and not bother again.
+    // But this way the code continues to work if the directory gets deleted while the code is running.
+    
+    if (![[NSFileManager defaultManager] fileExistsAtPath:_logsDirectory])
+    {
+        NSError *err = nil;
+        if (![[NSFileManager defaultManager] createDirectoryAtPath:_logsDirectory
+                                       withIntermediateDirectories:YES attributes:nil error:&err])
+        {
+            NSLogError(@"DDFileLogManagerDefault: Error creating logsDirectory: %@", err);
+        }
+    }
+    
+    return _logsDirectory;
+}
+
+/**
+ * Default log file name is "<bundle identifier> <date> <time>.log".
+ * Example: MobileSafari 2013-12-03 17-14.log
+ *
+ * You can change it by overriding newLogFileName and isLogFile: methods.
+**/
+- (BOOL)isLogFile:(NSString *)fileName
+{
+    NSString *appName = [self applicationName];
+
+    BOOL hasProperPrefix = [fileName hasPrefix:appName];
+    BOOL hasProperSuffix = [fileName hasSuffix:@".log"];
+    BOOL hasProperDate = NO;
+
+    if (hasProperPrefix && hasProperSuffix)
+    {
+        NSUInteger lengthOfMiddle = fileName.length - appName.length - @".log".length;
+
+        // Date string should have at least 16 characters - " 2013-12-03 17-14"
+        if (lengthOfMiddle >= 17)
+        {
+            NSRange range = NSMakeRange(appName.length, lengthOfMiddle);
+
+            NSString *middle = [fileName substringWithRange:range];
+            NSArray *components = [middle componentsSeparatedByString:@" "];
+
+            // When creating logfile if there is existing file with the same name, we append attemp number at the end.
+            // Thats why here we can have three or four components. For details see createNewLogFile method.
+            //
+            // Components:
+            //     "", "2013-12-03", "17-14"
+            // or
+            //     "", "2013-12-03", "17-14", "1"
+            if (components.count == 3 || components.count == 4)
+            {
+                NSString *dateString = [NSString stringWithFormat:@"%@ %@", components[1], components[2]];
+                NSDateFormatter *dateFormatter = [self logFileDateFormatter];
+
+                NSDate *date = [dateFormatter dateFromString:dateString];
+
+                if (date)
+                {
+                    hasProperDate = YES;
+                }
+            }
+        }
+    }
+
+    return (hasProperPrefix && hasProperDate && hasProperSuffix);
+}
+
+- (NSDateFormatter *)logFileDateFormatter
+{
+    NSMutableDictionary *dictionary = [[NSThread currentThread]
+                                       threadDictionary];
+    NSString *dateFormat = @"yyyy'-'MM'-'dd' 'HH'-'mm'";
+    NSString *key = [NSString stringWithFormat:@"logFileDateFormatter.%@", dateFormat];
+    NSDateFormatter *dateFormatter = [dictionary objectForKey:key];
+    if (dateFormatter == nil) {
+        dateFormatter = [[NSDateFormatter alloc] init];
+        [dateFormatter setDateFormat:dateFormat];
+        [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
+        [dictionary setObject:dateFormatter
+                       forKey:key];
+    }
+    
+    return dateFormatter;
+}
+
+/**
+ * Returns an array of NSString objects,
+ * each of which is the filePath to an existing log file on disk.
+**/
+- (NSArray *)unsortedLogFilePaths
+{
+    NSString *logsDirectory = [self logsDirectory];
+    NSArray *fileNames = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:logsDirectory error:nil];
+    
+    NSMutableArray *unsortedLogFilePaths = [NSMutableArray arrayWithCapacity:[fileNames count]];
+    
+    for (NSString *fileName in fileNames)
+    {
+        // Filter out any files that aren't log files. (Just for extra safety)
+        
+    #if TARGET_IPHONE_SIMULATOR
+        // In case of iPhone simulator there can be 'archived' extension. isLogFile:
+        // method knows nothing about it. Thus removing it for this method.
+        //
+        // See full explanation in the header file.
+        NSString *theFileName = [fileName stringByReplacingOccurrencesOfString:@".archived"
+                                                                    withString:@""];
+
+        if ([self isLogFile:theFileName])
+    #else
+        if ([self isLogFile:fileName])
+    #endif
+        {
+            NSString *filePath = [logsDirectory stringByAppendingPathComponent:fileName];
+            
+            [unsortedLogFilePaths addObject:filePath];
+        }
+    }
+    
+    return unsortedLogFilePaths;
+}
+
+/**
+ * Returns an array of NSString objects,
+ * each of which is the fileName of an existing log file on disk.
+**/
+- (NSArray *)unsortedLogFileNames
+{
+    NSArray *unsortedLogFilePaths = [self unsortedLogFilePaths];
+    
+    NSMutableArray *unsortedLogFileNames = [NSMutableArray arrayWithCapacity:[unsortedLogFilePaths count]];
+    
+    for (NSString *filePath in unsortedLogFilePaths)
+    {
+        [unsortedLogFileNames addObject:[filePath lastPathComponent]];
+    }
+    
+    return unsortedLogFileNames;
+}
+
+/**
+ * Returns an array of DDLogFileInfo objects,
+ * each representing an existing log file on disk,
+ * and containing important information about the log file such as it's modification date and size.
+**/
+- (NSArray *)unsortedLogFileInfos
+{
+    NSArray *unsortedLogFilePaths = [self unsortedLogFilePaths];
+    
+    NSMutableArray *unsortedLogFileInfos = [NSMutableArray arrayWithCapacity:[unsortedLogFilePaths count]];
+    
+    for (NSString *filePath in unsortedLogFilePaths)
+    {
+        DDLogFileInfo *logFileInfo = [[DDLogFileInfo alloc] initWithFilePath:filePath];
+        
+        [unsortedLogFileInfos addObject:logFileInfo];
+    }
+    
+    return unsortedLogFileInfos;
+}
+
+/**
+ * Just like the unsortedLogFilePaths method, but sorts the array.
+ * The items in the array are sorted by creation date.
+ * The first item in the array will be the most recently created log file.
+**/
+- (NSArray *)sortedLogFilePaths
+{
+    NSArray *sortedLogFileInfos = [self sortedLogFileInfos];
+    
+    NSMutableArray *sortedLogFilePaths = [NSMutableArray arrayWithCapacity:[sortedLogFileInfos count]];
+    
+    for (DDLogFileInfo *logFileInfo in sortedLogFileInfos)
+    {
+        [sortedLogFilePaths addObject:[logFileInfo filePath]];
+    }
+    
+    return sortedLogFilePaths;
+}
+
+/**
+ * Just like the unsortedLogFileNames method, but sorts the array.
+ * The items in the array are sorted by creation date.
+ * The first item in the array will be the most recently created log file.
+**/
+- (NSArray *)sortedLogFileNames
+{
+    NSArray *sortedLogFileInfos = [self sortedLogFileInfos];
+    
+    NSMutableArray *sortedLogFileNames = [NSMutableArray arrayWithCapacity:[sortedLogFileInfos count]];
+    
+    for (DDLogFileInfo *logFileInfo in sortedLogFileInfos)
+    {
+        [sortedLogFileNames addObject:[logFileInfo fileName]];
+    }
+    
+    return sortedLogFileNames;
+}
+
+/**
+ * Just like the unsortedLogFileInfos method, but sorts the array.
+ * The items in the array are sorted by creation date.
+ * The first item in the array will be the most recently created log file.
+**/
+- (NSArray *)sortedLogFileInfos
+{
+    return [[self unsortedLogFileInfos] sortedArrayUsingSelector:@selector(reverseCompareByCreationDate:)];
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Creation
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Generates log file name with default format "<bundle identifier> <date> <time>.log"
+ * Example: MobileSafari 2013-12-03 17-14.log
+ *
+ * You can change it by overriding newLogFileName and isLogFile: methods.
+**/
+- (NSString *)newLogFileName
+{
+    NSString *appName = [self applicationName];
+
+    NSDateFormatter *dateFormatter = [self logFileDateFormatter];
+    NSString *formattedDate = [dateFormatter stringFromDate:[NSDate date]];
+
+    return [NSString stringWithFormat:@"%@ %@.log", appName, formattedDate];
+}
+
+/**
+ * Generates a new unique log file path, and creates the corresponding log file.
+**/
+- (NSString *)createNewLogFile
+{
+    NSString *fileName = [self newLogFileName];
+    NSString *logsDirectory = [self logsDirectory];
+
+    NSUInteger attempt = 1;
+    do
+    {
+        NSString *actualFileName = fileName;
+
+        if (attempt > 1) {
+            NSString *extension = [actualFileName pathExtension];
+
+            actualFileName = [actualFileName stringByDeletingPathExtension];
+            actualFileName = [actualFileName stringByAppendingFormat:@" %lu", (unsigned long)attempt];
+            if (extension.length) {
+                actualFileName = [actualFileName stringByAppendingPathExtension:extension];
+            }
+        }
+
+        NSString *filePath = [logsDirectory stringByAppendingPathComponent:actualFileName];
+
+        if (![[NSFileManager defaultManager] fileExistsAtPath:filePath])
+        {
+            NSLogVerbose(@"DDLogFileManagerDefault: Creating new log file: %@", actualFileName);
+
+            NSDictionary *attributes = nil;
+
+        #if TARGET_OS_IPHONE
+             // When creating log file on iOS we're setting NSFileProtectionKey attribute to NSFileProtectionCompleteUnlessOpen.
+             // 
+             // But in case if app is able to launch from background we need to have an ability to open log file any time we
+             // want (even if device is locked). Thats why that attribute have to be changed to
+             // NSFileProtectionCompleteUntilFirstUserAuthentication.
+
+            NSString *key = _defaultFileProtectionLevel ? :
+                            (doesAppRunInBackground() ? NSFileProtectionCompleteUntilFirstUserAuthentication : NSFileProtectionCompleteUnlessOpen);
+
+            attributes = @{ NSFileProtectionKey : key };
+        #endif
+            
+            [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:attributes];
+            
+            // Since we just created a new log file, we may need to delete some old log files
+            [self deleteOldLogFiles];
+            
+            return filePath;
+        } else {
+            attempt++;
+        }
+        
+    } while(YES);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Utility
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (NSString *)applicationName
+{
+    static NSString *_appName;
+    static dispatch_once_t onceToken;
+
+    dispatch_once(&onceToken, ^{
+        _appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIdentifier"];
+
+        if (! _appName)
+        {
+            _appName = [[NSProcessInfo processInfo] processName];
+        }
+
+        if (! _appName)
+        {
+            _appName = @"";
+        }
+    });
+
+    return _appName;
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation DDLogFileFormatterDefault
+
+- (id)init
+{
+    return [self initWithDateFormatter:nil];
+}
+
+- (instancetype)initWithDateFormatter:(NSDateFormatter *)aDateFormatter
+{
+    if ((self = [super init]))
+    {
+        if (aDateFormatter)
+        {
+            dateFormatter = aDateFormatter;
+        }
+        else
+        {
+            dateFormatter = [[NSDateFormatter alloc] init];
+            [dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4]; // 10.4+ style
+            [dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss:SSS"];
+        }
+    }
+    return self;
+}
+
+- (NSString *)formatLogMessage:(DDLogMessage *)logMessage
+{
+    NSString *dateAndTime = [dateFormatter stringFromDate:(logMessage->timestamp)];
+    
+    return [NSString stringWithFormat:@"%@  %@", dateAndTime, logMessage->logMsg];
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation DDFileLogger
+
+- (id)init
+{
+    DDLogFileManagerDefault *defaultLogFileManager = [[DDLogFileManagerDefault alloc] init];
+    
+    return [self initWithLogFileManager:defaultLogFileManager];
+}
+
+- (instancetype)initWithLogFileManager:(id <DDLogFileManager>)aLogFileManager
+{
+    if ((self = [super init]))
+    {
+        maximumFileSize = DEFAULT_LOG_MAX_FILE_SIZE;
+        rollingFrequency = DEFAULT_LOG_ROLLING_FREQUENCY;
+        _automaticallyAppendNewlineForCustomFormatters = YES;
+        
+        logFileManager = aLogFileManager;
+        
+        formatter = [[DDLogFileFormatterDefault alloc] init];
+    }
+    return self;
+}
+
+- (void)dealloc
+{
+    [currentLogFileHandle synchronizeFile];
+    [currentLogFileHandle closeFile];
+
+    if (currentLogFileVnode) {
+        dispatch_source_cancel(currentLogFileVnode);
+        currentLogFileVnode = NULL;
+    }
+
+    if (rollingTimer)
+    {
+        dispatch_source_cancel(rollingTimer);
+        rollingTimer = NULL;
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Properties
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@synthesize logFileManager;
+
+- (unsigned long long)maximumFileSize
+{
+    __block unsigned long long result;
+    
+    dispatch_block_t block = ^{
+        result = maximumFileSize;
+    };
+    
+    // The design of this method is taken from the DDAbstractLogger implementation.
+    // For extensive documentation please refer to the DDAbstractLogger implementation.
+    
+    // Note: The internal implementation MUST access the maximumFileSize variable directly,
+    // This method is designed explicitly for external access.
+    //
+    // Using "self." syntax to go through this method will cause immediate deadlock.
+    // This is the intended result. Fix it by accessing the ivar directly.
+    // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
+    
+    NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+    NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax.");
+    
+    dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+    
+    dispatch_sync(globalLoggingQueue, ^{
+        dispatch_sync(loggerQueue, block);
+    });
+    
+    return result;
+}
+
+- (void)setMaximumFileSize:(unsigned long long)newMaximumFileSize
+{
+    dispatch_block_t block = ^{ @autoreleasepool {
+        
+        maximumFileSize = newMaximumFileSize;
+        [self maybeRollLogFileDueToSize];
+        
+    }};
+    
+    // The design of this method is taken from the DDAbstractLogger implementation.
+    // For extensive documentation please refer to the DDAbstractLogger implementation.
+    
+    // Note: The internal implementation MUST access the maximumFileSize variable directly,
+    // This method is designed explicitly for external access.
+    //
+    // Using "self." syntax to go through this method will cause immediate deadlock.
+    // This is the intended result. Fix it by accessing the ivar directly.
+    // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
+    
+    NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+    NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax.");
+    
+    dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+    
+    dispatch_async(globalLoggingQueue, ^{
+        dispatch_async(loggerQueue, block);
+    });
+}
+
+- (NSTimeInterval)rollingFrequency
+{
+    __block NSTimeInterval result;
+    
+    dispatch_block_t block = ^{
+        result = rollingFrequency;
+    };
+    
+    // The design of this method is taken from the DDAbstractLogger implementation.
+    // For extensive documentation please refer to the DDAbstractLogger implementation.
+    
+    // Note: The internal implementation should access the rollingFrequency variable directly,
+    // This method is designed explicitly for external access.
+    //
+    // Using "self." syntax to go through this method will cause immediate deadlock.
+    // This is the intended result. Fix it by accessing the ivar directly.
+    // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
+    
+    NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+    NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax.");
+    
+    dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+    
+    dispatch_sync(globalLoggingQueue, ^{
+        dispatch_sync(loggerQueue, block);
+    });
+    
+    return result;
+}
+
+- (void)setRollingFrequency:(NSTimeInterval)newRollingFrequency
+{
+    dispatch_block_t block = ^{ @autoreleasepool {
+        
+        rollingFrequency = newRollingFrequency;
+        [self maybeRollLogFileDueToAge];
+    }};
+    
+    // The design of this method is taken from the DDAbstractLogger implementation.
+    // For extensive documentation please refer to the DDAbstractLogger implementation.
+    
+    // Note: The internal implementation should access the rollingFrequency variable directly,
+    // This method is designed explicitly for external access.
+    //
+    // Using "self." syntax to go through this method will cause immediate deadlock.
+    // This is the intended result. Fix it by accessing the ivar directly.
+    // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
+    
+    NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+    NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax.");
+    
+    dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+    
+    dispatch_async(globalLoggingQueue, ^{
+        dispatch_async(loggerQueue, block);
+    });
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark File Rolling
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (void)scheduleTimerToRollLogFileDueToAge
+{
+    if (rollingTimer)
+    {
+        dispatch_source_cancel(rollingTimer);
+        rollingTimer = NULL;
+    }
+    
+    if (currentLogFileInfo == nil || rollingFrequency <= 0.0)
+    {
+        return;
+    }
+    
+    NSDate *logFileCreationDate = [currentLogFileInfo creationDate];
+    
+    NSTimeInterval ti = [logFileCreationDate timeIntervalSinceReferenceDate];
+    ti += rollingFrequency;
+    
+    NSDate *logFileRollingDate = [NSDate dateWithTimeIntervalSinceReferenceDate:ti];
+    
+    NSLogVerbose(@"DDFileLogger: scheduleTimerToRollLogFileDueToAge");
+    
+    NSLogVerbose(@"DDFileLogger: logFileCreationDate: %@", logFileCreationDate);
+    NSLogVerbose(@"DDFileLogger: logFileRollingDate : %@", logFileRollingDate);
+    
+    rollingTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, loggerQueue);
+    
+    dispatch_source_set_event_handler(rollingTimer, ^{ @autoreleasepool {
+        
+        [self maybeRollLogFileDueToAge];
+        
+    }});
+    
+    #if !OS_OBJECT_USE_OBJC
+    dispatch_source_t theRollingTimer = rollingTimer;
+    dispatch_source_set_cancel_handler(rollingTimer, ^{
+        dispatch_release(theRollingTimer);
+    });
+    #endif
+    
+    uint64_t delay = (uint64_t)([logFileRollingDate timeIntervalSinceNow] * NSEC_PER_SEC);
+    dispatch_time_t fireTime = dispatch_time(DISPATCH_TIME_NOW, delay);
+    
+    dispatch_source_set_timer(rollingTimer, fireTime, DISPATCH_TIME_FOREVER, 1.0);
+    dispatch_resume(rollingTimer);
+}
+
+
+- (void)rollLogFile
+{
+    [self rollLogFileWithCompletionBlock:nil];
+}
+
+- (void)rollLogFileWithCompletionBlock:(void (^)())completionBlock
+{
+    // This method is public.
+    // We need to execute the rolling on our logging thread/queue.
+    
+    dispatch_block_t block = ^{ @autoreleasepool {
+        
+        [self rollLogFileNow];
+
+        if (completionBlock)
+        {
+            dispatch_async(dispatch_get_main_queue(), ^{
+                completionBlock();
+            });
+        }
+    }};
+    
+    // The design of this method is taken from the DDAbstractLogger implementation.
+    // For extensive documentation please refer to the DDAbstractLogger implementation.
+    
+    if ([self isOnInternalLoggerQueue])
+    {
+        block();
+    }
+    else
+    {
+        dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+        NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+        
+        dispatch_async(globalLoggingQueue, ^{
+            dispatch_async(loggerQueue, block);
+        });
+    }
+}
+
+- (void)rollLogFileNow
+{
+    NSLogVerbose(@"DDFileLogger: rollLogFileNow");
+    
+    
+    if (currentLogFileHandle == nil) return;
+    
+    [currentLogFileHandle synchronizeFile];
+    [currentLogFileHandle closeFile];
+    currentLogFileHandle = nil;
+    
+    currentLogFileInfo.isArchived = YES;
+    
+    if ([logFileManager respondsToSelector:@selector(didRollAndArchiveLogFile:)])
+    {
+        [logFileManager didRollAndArchiveLogFile:(currentLogFileInfo.filePath)];
+    }
+    
+    currentLogFileInfo = nil;
+    
+    if (currentLogFileVnode) {
+        dispatch_source_cancel(currentLogFileVnode);
+        currentLogFileVnode = NULL;
+    }
+
+    if (rollingTimer)
+    {
+        dispatch_source_cancel(rollingTimer);
+        rollingTimer = NULL;
+    }
+}
+
+- (void)maybeRollLogFileDueToAge
+{
+    if (rollingFrequency > 0.0 && currentLogFileInfo.age >= rollingFrequency)
+    {
+        NSLogVerbose(@"DDFileLogger: Rolling log file due to age...");
+        
+        [self rollLogFileNow];
+    }
+    else
+    {
+        [self scheduleTimerToRollLogFileDueToAge];
+    }
+}
+
+- (void)maybeRollLogFileDueToSize
+{
+    // This method is called from logMessage.
+    // Keep it FAST.
+    
+    // Note: Use direct access to maximumFileSize variable.
+    // We specifically wrote our own getter/setter method to allow us to do this (for performance reasons).
+    
+    if (maximumFileSize > 0)
+    {
+        unsigned long long fileSize = [currentLogFileHandle offsetInFile];
+        
+        if (fileSize >= maximumFileSize)
+        {
+            NSLogVerbose(@"DDFileLogger: Rolling log file due to size (%qu)...", fileSize);
+            
+            [self rollLogFileNow];
+        }
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark File Logging
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Returns the log file that should be used.
+ * If there is an existing log file that is suitable,
+ * within the constraints of maximumFileSize and rollingFrequency, then it is returned.
+ * 
+ * Otherwise a new file is created and returned.
+**/
+- (DDLogFileInfo *)currentLogFileInfo
+{
+    if (currentLogFileInfo == nil)
+    {
+        NSArray *sortedLogFileInfos = [logFileManager sortedLogFileInfos];
+        
+        if ([sortedLogFileInfos count] > 0)
+        {
+            DDLogFileInfo *mostRecentLogFileInfo = [sortedLogFileInfos objectAtIndex:0];
+            
+            BOOL shouldArchiveMostRecent = NO;
+            
+            if (mostRecentLogFileInfo.isArchived)
+            {
+                shouldArchiveMostRecent = NO;
+            }
+            else if (maximumFileSize > 0 && mostRecentLogFileInfo.fileSize >= maximumFileSize)
+            {
+                shouldArchiveMostRecent = YES;
+            }
+            else if (rollingFrequency > 0.0 && mostRecentLogFileInfo.age >= rollingFrequency)
+            {
+                shouldArchiveMostRecent = YES;
+            }
+
+
+        #if TARGET_OS_IPHONE
+            // When creating log file on iOS we're setting NSFileProtectionKey attribute to NSFileProtectionCompleteUnlessOpen.
+            // 
+            // But in case if app is able to launch from background we need to have an ability to open log file any time we
+            // want (even if device is locked). Thats why that attribute have to be changed to
+            // NSFileProtectionCompleteUntilFirstUserAuthentication.
+            //
+            // If previous log was created when app wasn't running in background, but now it is - we archive it and create
+            // a new one.
+            //
+            // If user has owerwritten to NSFileProtectionNone there is no neeed to create a new one.
+
+            if (!_doNotReuseLogFiles && doesAppRunInBackground()) {
+                NSString *key = mostRecentLogFileInfo.fileAttributes[NSFileProtectionKey];
+
+                if (! ([key isEqualToString:NSFileProtectionCompleteUntilFirstUserAuthentication] || [key isEqualToString:NSFileProtectionNone])) {
+                    shouldArchiveMostRecent = YES;
+                }
+            }
+        #endif
+
+            if (!_doNotReuseLogFiles && !mostRecentLogFileInfo.isArchived && !shouldArchiveMostRecent)
+            {
+                NSLogVerbose(@"DDFileLogger: Resuming logging with file %@", mostRecentLogFileInfo.fileName);
+                
+                currentLogFileInfo = mostRecentLogFileInfo;
+            }
+            else
+            {
+                if (shouldArchiveMostRecent)
+                {
+                    mostRecentLogFileInfo.isArchived = YES;
+                    
+                    if ([logFileManager respondsToSelector:@selector(didArchiveLogFile:)])
+                    {
+                        [logFileManager didArchiveLogFile:(mostRecentLogFileInfo.filePath)];
+                    }
+                }
+            }
+        }
+        
+        if (currentLogFileInfo == nil)
+        {
+            NSString *currentLogFilePath = [logFileManager createNewLogFile];
+            
+            currentLogFileInfo = [[DDLogFileInfo alloc] initWithFilePath:currentLogFilePath];
+        }
+    }
+    
+    return currentLogFileInfo;
+}
+
+- (NSFileHandle *)currentLogFileHandle
+{
+    if (currentLogFileHandle == nil)
+    {
+        NSString *logFilePath = [[self currentLogFileInfo] filePath];
+        
+        currentLogFileHandle = [NSFileHandle fileHandleForWritingAtPath:logFilePath];
+        [currentLogFileHandle seekToEndOfFile];
+        
+        if (currentLogFileHandle)
+        {
+            [self scheduleTimerToRollLogFileDueToAge];
+
+            // Here we are monitoring the log file. In case if it would be deleted ormoved
+            // somewhere we want to roll it and use a new one.
+            currentLogFileVnode = dispatch_source_create(
+                DISPATCH_SOURCE_TYPE_VNODE,
+                [currentLogFileHandle fileDescriptor],
+                DISPATCH_VNODE_DELETE | DISPATCH_VNODE_RENAME,
+                loggerQueue
+            );
+
+            dispatch_source_set_event_handler(currentLogFileVnode, ^{ @autoreleasepool {
+                NSLogInfo(@"DDFileLogger: Current logfile was moved. Rolling it and creating a new one");
+                [self rollLogFileNow];
+            }});
+
+            #if !OS_OBJECT_USE_OBJC
+            dispatch_source_t vnode = currentLogFileVnode;
+            dispatch_source_set_cancel_handler(currentLogFileVnode, ^{
+                dispatch_release(vnode);
+            });
+            #endif
+
+            dispatch_resume(currentLogFileVnode);
+        }
+    }
+    
+    return currentLogFileHandle;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark DDLogger Protocol
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static int exception_count = 0;
+- (void)logMessage:(DDLogMessage *)logMessage
+{
+    NSString *logMsg = logMessage->logMsg;
+    BOOL isFormatted = NO;
+
+    if (formatter)
+    {
+        logMsg = [formatter formatLogMessage:logMessage];
+        isFormatted = logMsg != logMessage->logMsg;
+    }
+    
+    if (logMsg)
+    {
+        if ((!isFormatted || _automaticallyAppendNewlineForCustomFormatters) &&
+        (![logMsg hasSuffix:@"\n"]))
+        {
+                logMsg = [logMsg stringByAppendingString:@"\n"];
+        }
+        
+        NSData *logData = [logMsg dataUsingEncoding:NSUTF8StringEncoding];
+
+        @try {
+            [[self currentLogFileHandle] writeData:logData];
+
+            [self maybeRollLogFileDueToSize];
+        }
+        @catch (NSException *exception) {
+            exception_count++;
+            if (exception_count <= 10) {
+                NSLogError(@"DDFileLogger.logMessage: %@", exception);
+                if (exception_count == 10)
+                    NSLogError(@"DDFileLogger.logMessage: Too many exceptions -- will not log any more of them.");
+            }
+        }
+    }
+}
+
+- (void)willRemoveLogger
+{
+    // If you override me be sure to invoke [super willRemoveLogger];
+    
+    [self rollLogFileNow];
+}
+
+- (NSString *)loggerName
+{
+    return @"cocoa.lumberjack.fileLogger";
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#if TARGET_IPHONE_SIMULATOR
+  #define XATTR_ARCHIVED_NAME  @"archived"
+#else
+  #define XATTR_ARCHIVED_NAME  @"lumberjack.log.archived"
+#endif
+
+@implementation DDLogFileInfo
+
+@synthesize filePath;
+
+@dynamic fileName;
+@dynamic fileAttributes;
+@dynamic creationDate;
+@dynamic modificationDate;
+@dynamic fileSize;
+@dynamic age;
+
+@dynamic isArchived;
+
+
+#pragma mark Lifecycle
+
++ (instancetype)logFileWithPath:(NSString *)aFilePath
+{
+    return [[self alloc] initWithFilePath:aFilePath];
+}
+
+- (instancetype)initWithFilePath:(NSString *)aFilePath
+{
+    if ((self = [super init]))
+    {
+        filePath = [aFilePath copy];
+    }
+    return self;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Standard Info
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (NSDictionary *)fileAttributes
+{
+    if (fileAttributes == nil)
+    {
+        fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];
+    }
+    return fileAttributes;
+}
+
+- (NSString *)fileName
+{
+    if (fileName == nil)
+    {
+        fileName = [filePath lastPathComponent];
+    }
+    return fileName;
+}
+
+- (NSDate *)modificationDate
+{
+    if (modificationDate == nil)
+    {
+        modificationDate = [[self fileAttributes] objectForKey:NSFileModificationDate];
+    }
+    
+    return modificationDate;
+}
+
+- (NSDate *)creationDate
+{
+    if (creationDate == nil)
+    {
+        creationDate = [[self fileAttributes] objectForKey:NSFileCreationDate];
+    }
+    return creationDate;
+}
+
+- (unsigned long long)fileSize
+{
+    if (fileSize == 0)
+    {
+        fileSize = [[[self fileAttributes] objectForKey:NSFileSize] unsignedLongLongValue];
+    }
+    
+    return fileSize;
+}
+
+- (NSTimeInterval)age
+{
+    return [[self creationDate] timeIntervalSinceNow] * -1.0;
+}
+
+- (NSString *)description
+{
+    return [@{@"filePath": self.filePath ?: @"",
+              @"fileName": self.fileName ?: @"",
+              @"fileAttributes": self.fileAttributes ?: @"",
+              @"creationDate": self.creationDate ?: @"",
+              @"modificationDate": self.modificationDate ?: @"",
+              @"fileSize": @(self.fileSize),
+              @"age": @(self.age),
+              @"isArchived": @(self.isArchived)} description];
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Archiving
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (BOOL)isArchived
+{
+    
+#if TARGET_IPHONE_SIMULATOR
+    
+    // Extended attributes don't work properly on the simulator.
+    // So we have to use a less attractive alternative.
+    // See full explanation in the header file.
+    
+    return [self hasExtensionAttributeWithName:XATTR_ARCHIVED_NAME];
+    
+#else
+    
+    return [self hasExtendedAttributeWithName:XATTR_ARCHIVED_NAME];
+    
+#endif
+}
+
+- (void)setIsArchived:(BOOL)flag
+{
+    
+#if TARGET_IPHONE_SIMULATOR
+    
+    // Extended attributes don't work properly on the simulator.
+    // So we have to use a less attractive alternative.
+    // See full explanation in the header file.
+    
+    if (flag)
+        [self addExtensionAttributeWithName:XATTR_ARCHIVED_NAME];
+    else
+        [self removeExtensionAttributeWithName:XATTR_ARCHIVED_NAME];
+    
+#else
+    
+    if (flag)
+        [self addExtendedAttributeWithName:XATTR_ARCHIVED_NAME];
+    else
+        [self removeExtendedAttributeWithName:XATTR_ARCHIVED_NAME];
+    
+#endif
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Changes
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (void)reset
+{
+    fileName = nil;
+    fileAttributes = nil;
+    creationDate = nil;
+    modificationDate = nil;
+}
+
+- (void)renameFile:(NSString *)newFileName
+{
+    // This method is only used on the iPhone simulator, where normal extended attributes are broken.
+    // See full explanation in the header file.
+    
+    if (![newFileName isEqualToString:[self fileName]])
+    {
+        NSString *fileDir = [filePath stringByDeletingLastPathComponent];
+        
+        NSString *newFilePath = [fileDir stringByAppendingPathComponent:newFileName];
+        
+        NSLogVerbose(@"DDLogFileInfo: Renaming file: '%@' -> '%@'", self.fileName, newFileName);
+
+        NSError *error = nil;
+        if ([[NSFileManager defaultManager] fileExistsAtPath:newFilePath] &&
+           ![[NSFileManager defaultManager] removeItemAtPath:newFilePath error:&error])
+        {
+            NSLogError(@"DDLogFileInfo: Error deleting archive (%@): %@", self.fileName, error);
+        }
+
+        if (![[NSFileManager defaultManager] moveItemAtPath:filePath toPath:newFilePath error:&error])
+        {
+            NSLogError(@"DDLogFileInfo: Error renaming file (%@): %@", self.fileName, error);
+        }
+
+        filePath = newFilePath;
+        [self reset];
+    }
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Attribute Management
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#if TARGET_IPHONE_SIMULATOR
+
+// Extended attributes don't work properly on the simulator.
+// So we have to use a less attractive alternative.
+// See full explanation in the header file.
+
+- (BOOL)hasExtensionAttributeWithName:(NSString *)attrName
+{
+    // This method is only used on the iPhone simulator, where normal extended attributes are broken.
+    // See full explanation in the header file.
+    
+    // Split the file name into components. File name may have various format, but generally
+    // structure is same:
+    //
+    // <name part>.<extension part> and <name part>.archived.<extension part>
+    // or
+    // <name part> and <name part>.archived
+    //
+    // So we want to search for the attrName in the components (ignoring the first array index).
+    
+    NSArray *components = [[self fileName] componentsSeparatedByString:@"."];
+    
+    // Watch out for file names without an extension
+
+    for (NSUInteger i = 1; i < components.count; i++)
+    {
+        NSString *attr = [components objectAtIndex:i];
+
+        if ([attrName isEqualToString:attr])
+        {
+            return YES;
+        }
+    }
+
+    return NO;
+}
+
+- (void)addExtensionAttributeWithName:(NSString *)attrName
+{
+    // This method is only used on the iPhone simulator, where normal extended attributes are broken.
+    // See full explanation in the header file.
+    
+    if ([attrName length] == 0) return;
+    
+    // Example:
+    // attrName = "archived"
+    //
+    // "mylog.txt" -> "mylog.archived.txt"
+    // "mylog"     -> "mylog.archived"
+
+    NSArray *components = [[self fileName] componentsSeparatedByString:@"."];
+    
+    NSUInteger count = [components count];
+    
+    NSUInteger estimatedNewLength = [[self fileName] length] + [attrName length] + 1;
+    NSMutableString *newFileName = [NSMutableString stringWithCapacity:estimatedNewLength];
+    
+    if (count > 0)
+    {
+        [newFileName appendString:[components objectAtIndex:0]];
+    }
+    
+    NSString *lastExt = @"";
+    
+    NSUInteger i;
+    for (i = 1; i < count; i++)
+    {
+        NSString *attr = [components objectAtIndex:i];
+        if ([attr length] == 0)
+        {
+            continue;
+        }
+        
+        if ([attrName isEqualToString:attr])
+        {
+            // Extension attribute already exists in file name
+            return;
+        }
+        
+        if ([lastExt length] > 0)
+        {
+            [newFileName appendFormat:@".%@", lastExt];
+        }
+        
+        lastExt = attr;
+    }
+    
+    [newFileName appendFormat:@".%@", attrName];
+    
+    if ([lastExt length] > 0)
+    {
+        [newFileName appendFormat:@".%@", lastExt];
+    }
+    
+    [self renameFile:newFileName];
+}
+
+- (void)removeExtensionAttributeWithName:(NSString *)attrName
+{
+    // This method is only used on the iPhone simulator, where normal extended attributes are broken.
+    // See full explanation in the header file.
+    
+    if ([attrName length] == 0) return;
+    
+    // Example:
+    // attrName = "archived"
+    // 
+    // "mylog.archived.txt" -> "mylog.txt"
+    // "mylog.archived"     -> "mylog"
+    
+    NSArray *components = [[self fileName] componentsSeparatedByString:@"."];
+    
+    NSUInteger count = [components count];
+    
+    NSUInteger estimatedNewLength = [[self fileName] length];
+    NSMutableString *newFileName = [NSMutableString stringWithCapacity:estimatedNewLength];
+    
+    if (count > 0)
+    {
+        [newFileName appendString:[components objectAtIndex:0]];
+    }
+    
+    BOOL found = NO;
+    
+    NSUInteger i;
+    for (i = 1; i < count; i++)
+    {
+        NSString *attr = [components objectAtIndex:i];
+        
+        if ([attrName isEqualToString:attr])
+        {
+            found = YES;
+        }
+        else
+        {
+            [newFileName appendFormat:@".%@", attr];
+        }
+    }
+    
+    if (found)
+    {
+        [self renameFile:newFileName];
+    }
+}
+
+#else
+
+- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName
+{
+    const char *path = [filePath UTF8String];
+    const char *name = [attrName UTF8String];
+    
+    ssize_t result = getxattr(path, name, NULL, 0, 0, 0);
+    
+    return (result >= 0);
+}
+
+- (void)addExtendedAttributeWithName:(NSString *)attrName
+{
+    const char *path = [filePath UTF8String];
+    const char *name = [attrName UTF8String];
+    
+    int result = setxattr(path, name, NULL, 0, 0, 0);
+    
+    if (result < 0)
+    {
+        NSLogError(@"DDLogFileInfo: setxattr(%@, %@): error = %s",
+                   attrName,
+                   self.fileName,
+                   strerror(errno));
+    }
+}
+
+- (void)removeExtendedAttributeWithName:(NSString *)attrName
+{
+    const char *path = [filePath UTF8String];
+    const char *name = [attrName UTF8String];
+    
+    int result = removexattr(path, name, 0);
+    
+    if (result < 0 && errno != ENOATTR)
+    {
+        NSLogError(@"DDLogFileInfo: removexattr(%@, %@): error = %s",
+                   attrName,
+                   self.fileName,
+                   strerror(errno));
+    }
+}
+
+#endif
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Comparisons
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (BOOL)isEqual:(id)object
+{
+    if ([object isKindOfClass:[self class]])
+    {
+        DDLogFileInfo *another = (DDLogFileInfo *)object;
+        
+        return [filePath isEqualToString:[another filePath]];
+    }
+    
+    return NO;
+}
+
+- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another
+{
+    NSDate *us = [self creationDate];
+    NSDate *them = [another creationDate];
+    
+    NSComparisonResult result = [us compare:them];
+    
+    if (result == NSOrderedAscending)
+        return NSOrderedDescending;
+    
+    if (result == NSOrderedDescending)
+        return NSOrderedAscending;
+    
+    return NSOrderedSame;
+}
+
+- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another
+{
+    NSDate *us = [self modificationDate];
+    NSDate *them = [another modificationDate];
+    
+    NSComparisonResult result = [us compare:them];
+    
+    if (result == NSOrderedAscending)
+        return NSOrderedDescending;
+    
+    if (result == NSOrderedDescending)
+        return NSOrderedAscending;
+    
+    return NSOrderedSame;
+}
+
+@end
+
+#if TARGET_OS_IPHONE
+/**
+ * When creating log file on iOS we're setting NSFileProtectionKey attribute to NSFileProtectionCompleteUnlessOpen.
+ *
+ * But in case if app is able to launch from background we need to have an ability to open log file any time we
+ * want (even if device is locked). Thats why that attribute have to be changed to
+ * NSFileProtectionCompleteUntilFirstUserAuthentication.
+ */
+BOOL doesAppRunInBackground()
+{
+    BOOL answer = NO;
+
+    NSArray *backgroundModes = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIBackgroundModes"];
+
+    for (NSString *mode in backgroundModes) {
+        if (mode.length > 0) {
+            answer = YES;
+            break;
+        }
+    }
+
+    return answer;
+}
+#endif
+
diff --git a/Lumberjack/DDLog+LOGV.h b/Lumberjack/DDLog+LOGV.h
new file mode 100644
index 0000000..5f67d44
--- /dev/null
+++ b/Lumberjack/DDLog+LOGV.h
@@ -0,0 +1,99 @@
+//
+//  DDLog+LOGV.h
+//  Lumberjack
+//
+//  Created by Mike Pontillo on 11/20/12.
+//
+//
+
+#ifndef Lumberjack_DDLog_LOGV_h
+#define Lumberjack_DDLog_LOGV_h
+
+#import "DDLog.h"
+
+
+#define LOGV_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, avalist) \
+  [DDLog log:isAsynchronous                                                  \
+       level:lvl                                                             \
+        flag:flg                                                             \
+     context:ctx                                                             \
+        file:__FILE__                                                        \
+    function:fnct                                                            \
+        line:__LINE__                                                        \
+         tag:atag                                                            \
+      format:frmt                                                            \
+        args:avalist]
+
+#define LOGV_OBJC_MACRO(async, lvl, flg, ctx, frmt, avalist) \
+             LOGV_MACRO(async, lvl, flg, ctx, nil, sel_getName(_cmd), frmt, avalist)
+
+#define LOGV_C_MACRO(async, lvl, flg, ctx, frmt, avalist) \
+          LOGV_MACRO(async, lvl, flg, ctx, nil, __FUNCTION__, frmt, avalist)
+
+
+
+#define  SYNC_LOGV_OBJC_MACRO(lvl, flg, ctx, frmt, avalist) \
+              LOGV_OBJC_MACRO( NO, lvl, flg, ctx, frmt, avalist)
+
+#define ASYNC_LOGV_OBJC_MACRO(lvl, flg, ctx, frmt, avalist) \
+              LOGV_OBJC_MACRO(YES, lvl, flg, ctx, frmt, avalist)
+
+#define  SYNC_LOGV_C_MACRO(lvl, flg, ctx, frmt, avalist) \
+              LOGV_C_MACRO( NO, lvl, flg, ctx, frmt, avalist)
+
+#define ASYNC_LOGV_C_MACRO(lvl, flg, ctx, frmt, avalist) \
+              LOGV_C_MACRO(YES, lvl, flg, ctx, frmt, avalist)
+
+
+
+#define LOGV_MAYBE(async, lvl, flg, ctx, fnct, frmt, avalist) \
+  do { if(lvl & flg) LOGV_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, avalist); } while(0)
+
+#define LOGV_OBJC_MAYBE(async, lvl, flg, ctx, frmt, avalist) \
+             LOGV_MAYBE(async, lvl, flg, ctx, sel_getName(_cmd), frmt, avalist)
+
+#define LOGV_C_MAYBE(async, lvl, flg, ctx, frmt, avalist) \
+          LOGV_MAYBE(async, lvl, flg, ctx, __FUNCTION__, frmt, avalist)
+
+#define  SYNC_LOGV_OBJC_MAYBE(lvl, flg, ctx, frmt, avalist) \
+              LOGV_OBJC_MAYBE( NO, lvl, flg, ctx, frmt, avalist)
+
+#define ASYNC_LOGV_OBJC_MAYBE(lvl, flg, ctx, frmt, avalist) \
+              LOGV_OBJC_MAYBE(YES, lvl, flg, ctx, frmt, avalist)
+
+#define  SYNC_LOGV_C_MAYBE(lvl, flg, ctx, frmt, avalist) \
+              LOGV_C_MAYBE( NO, lvl, flg, ctx, frmt, avalist)
+
+#define ASYNC_LOGV_C_MAYBE(lvl, flg, ctx, frmt, avalist) \
+              LOGV_C_MAYBE(YES, lvl, flg, ctx, frmt, avalist)
+
+
+
+#define LOGV_OBJC_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, avalist) \
+                 LOGV_MACRO(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, avalist)
+
+#define LOGV_C_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, avalist) \
+              LOGV_MACRO(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, avalist)
+
+#define LOGV_TAG_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, avalist) \
+  do { if(lvl & flg) LOGV_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, avalist); } while(0)
+
+#define LOGV_OBJC_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, avalist) \
+             LOGV_TAG_MAYBE(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, avalist)
+
+#define LOGV_C_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, avalist) \
+          LOGV_TAG_MAYBE(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, avalist)
+
+
+
+#define DDLogvError(frmt, avalist)   LOGV_OBJC_MAYBE(LOG_ASYNC_ERROR,   ddLogLevel, LOG_FLAG_ERROR,   0, frmt, avalist)
+#define DDLogvWarn(frmt, avalist)    LOGV_OBJC_MAYBE(LOG_ASYNC_WARN,    ddLogLevel, LOG_FLAG_WARN,    0, frmt, avalist)
+#define DDLogvInfo(frmt, avalist)    LOGV_OBJC_MAYBE(LOG_ASYNC_INFO,    ddLogLevel, LOG_FLAG_INFO,    0, frmt, avalist)
+#define DDLogvVerbose(frmt, avalist) LOGV_OBJC_MAYBE(LOG_ASYNC_VERBOSE, ddLogLevel, LOG_FLAG_VERBOSE, 0, frmt, avalist)
+
+#define DDLogvCError(frmt, avalist)   LOGV_C_MAYBE(LOG_ASYNC_ERROR,   ddLogLevel, LOG_FLAG_ERROR,   0, frmt, avalist)
+#define DDLogvCWarn(frmt, avalist)    LOGV_C_MAYBE(LOG_ASYNC_WARN,    ddLogLevel, LOG_FLAG_WARN,    0, frmt, avalist)
+#define DDLogvCInfo(frmt, avalist)    LOGV_C_MAYBE(LOG_ASYNC_INFO,    ddLogLevel, LOG_FLAG_INFO,    0, frmt, avalist)
+#define DDLogvCVerbose(frmt, avalist) LOGV_C_MAYBE(LOG_ASYNC_VERBOSE, ddLogLevel, LOG_FLAG_VERBOSE, 0, frmt, avalist)
+
+#endif
diff --git a/Lumberjack/DDLog.h b/Lumberjack/DDLog.h
new file mode 100755
index 0000000..f4aebd6
--- /dev/null
+++ b/Lumberjack/DDLog.h
@@ -0,0 +1,692 @@
+#import <Foundation/Foundation.h>
+
+/**
+ * Welcome to Cocoa Lumberjack!
+ * 
+ * The project page has a wealth of documentation if you have any questions.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack
+ * 
+ * If you're new to the project you may wish to read the "Getting Started" wiki.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted
+ * 
+ * Otherwise, here is a quick refresher.
+ * There are three steps to using the macros:
+ * 
+ * Step 1:
+ * Import the header in your implementation file:
+ * 
+ * #import "DDLog.h"
+ * 
+ * Step 2:
+ * Define your logging level in your implementation file:
+ * 
+ * // Log levels: off, error, warn, info, verbose
+ * static const int ddLogLevel = LOG_LEVEL_VERBOSE;
+ * 
+ * Step 2 [3rd party frameworks]:
+ *
+ * Define your LOG_LEVEL_DEF to a different variable/function than ddLogLevel:
+ *
+ * // #undef LOG_LEVEL_DEF // Undefine first only if needed
+ * #define LOG_LEVEL_DEF myLibLogLevel
+ *
+ * Define your logging level in your implementation file:
+ *
+ * // Log levels: off, error, warn, info, verbose
+ * static const int myLibLogLevel = LOG_LEVEL_VERBOSE;
+ *
+ * Step 3:
+ * Replace your NSLog statements with DDLog statements according to the severity of the message.
+ * 
+ * NSLog(@"Fatal error, no dohickey found!"); -> DDLogError(@"Fatal error, no dohickey found!");
+ * 
+ * DDLog works exactly the same as NSLog.
+ * This means you can pass it multiple variables just like NSLog.
+**/
+
+#ifndef LOG_LEVEL_DEF
+    #define LOG_LEVEL_DEF ddLogLevel
+#endif
+
+@class DDLogMessage;
+
+@protocol DDLogger;
+@protocol DDLogFormatter;
+
+/**
+ * This is the single macro that all other macros below compile into.
+ * This big multiline macro makes all the other macros easier to read.
+**/
+
+#define LOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \
+        [DDLog log:isAsynchronous                                       \
+             level:lvl                                                  \
+              flag:flg                                                  \
+           context:ctx                                                  \
+              file:__FILE__                                             \
+          function:fnct                                                 \
+              line:__LINE__                                             \
+               tag:atag                                                 \
+            format:(frmt), ##__VA_ARGS__]
+
+/**
+ * Define the Objective-C and C versions of the macro.
+ * These automatically inject the proper function name for either an objective-c method or c function.
+ * 
+ * We also define shorthand versions for asynchronous and synchronous logging.
+**/
+
+#define LOG_OBJC_MACRO(async, lvl, flg, ctx, frmt, ...) \
+        LOG_MACRO(async, lvl, flg, ctx, nil, sel_getName(_cmd), frmt, ##__VA_ARGS__)
+
+#define LOG_C_MACRO(async, lvl, flg, ctx, frmt, ...) \
+        LOG_MACRO(async, lvl, flg, ctx, nil, __FUNCTION__, frmt, ##__VA_ARGS__)
+
+#define SYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \
+        LOG_OBJC_MACRO(NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)
+
+#define ASYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \
+        LOG_OBJC_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)
+
+#define SYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \
+        LOG_C_MACRO(NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)
+
+#define ASYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \
+        LOG_C_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)
+
+/**
+ * Define version of the macro that only execute if the logLevel is above the threshold.
+ * The compiled versions essentially look like this:
+ * 
+ * if (logFlagForThisLogMsg & ddLogLevel) { execute log message }
+ * 
+ * When LOG_LEVEL_DEF is defined as ddLogLevel.
+ *
+ * As shown further below, Lumberjack actually uses a bitmask as opposed to primitive log levels.
+ * This allows for a great amount of flexibility and some pretty advanced fine grained logging techniques.
+ * 
+ * Note that when compiler optimizations are enabled (as they are for your release builds),
+ * the log messages above your logging threshold will automatically be compiled out.
+ * 
+ * (If the compiler sees LOG_LEVEL_DEF/ddLogLevel declared as a constant, the compiler simply checks to see
+ *  if the 'if' statement would execute, and if not it strips it from the binary.)
+ * 
+ * We also define shorthand versions for asynchronous and synchronous logging.
+**/
+
+#define LOG_MAYBE(async, lvl, flg, ctx, fnct, frmt, ...) \
+        do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, ##__VA_ARGS__); } while(0)
+
+#define LOG_OBJC_MAYBE(async, lvl, flg, ctx, frmt, ...) \
+        LOG_MAYBE(async, lvl, flg, ctx, sel_getName(_cmd), frmt, ##__VA_ARGS__)
+
+#define LOG_C_MAYBE(async, lvl, flg, ctx, frmt, ...) \
+        LOG_MAYBE(async, lvl, flg, ctx, __FUNCTION__, frmt, ##__VA_ARGS__)
+
+#define SYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \
+        LOG_OBJC_MAYBE(NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)
+
+#define ASYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \
+        LOG_OBJC_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)
+
+#define SYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \
+        LOG_C_MAYBE(NO, lvl, flg, ctx, frmt, ##__VA_ARGS__)
+
+#define ASYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \
+        LOG_C_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__)
+
+/**
+ * Define versions of the macros that also accept tags.
+ * 
+ * The DDLogMessage object includes a 'tag' ivar that may be used for a variety of purposes.
+ * It may be used to pass custom information to loggers or formatters.
+ * Or it may be used by 3rd party extensions to the framework.
+ * 
+ * Thes macros just make it a little easier to extend logging functionality.
+**/
+
+#define LOG_OBJC_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \
+        LOG_MACRO(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)
+
+#define LOG_C_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \
+        LOG_MACRO(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)
+
+#define LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, ...) \
+        do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0)
+
+#define LOG_OBJC_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \
+        LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__)
+
+#define LOG_C_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \
+        LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__)
+
+/**
+ * Define the standard options.
+ * 
+ * We default to only 4 levels because it makes it easier for beginners
+ * to make the transition to a logging framework.
+ * 
+ * More advanced users may choose to completely customize the levels (and level names) to suite their needs.
+ * For more information on this see the "Custom Log Levels" page:
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels
+ * 
+ * Advanced users may also notice that we're using a bitmask.
+ * This is to allow for custom fine grained logging:
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/FineGrainedLogging
+ * 
+ * -- Flags --
+ * 
+ * Typically you will use the LOG_LEVELS (see below), but the flags may be used directly in certain situations.
+ * For example, say you have a lot of warning log messages, and you wanted to disable them.
+ * However, you still needed to see your error and info log messages.
+ * You could accomplish that with the following:
+ * 
+ * static const int ddLogLevel = LOG_FLAG_ERROR | LOG_FLAG_INFO;
+ * 
+ * When LOG_LEVEL_DEF is defined as ddLogLevel.
+ *
+ * Flags may also be consulted when writing custom log formatters,
+ * as the DDLogMessage class captures the individual flag that caused the log message to fire.
+ * 
+ * -- Levels --
+ * 
+ * Log levels are simply the proper bitmask of the flags.
+ * 
+ * -- Booleans --
+ * 
+ * The booleans may be used when your logging code involves more than one line.
+ * For example:
+ * 
+ * if (LOG_VERBOSE) {
+ *     for (id sprocket in sprockets)
+ *         DDLogVerbose(@"sprocket: %@", [sprocket description])
+ * }
+ * 
+ * -- Async --
+ * 
+ * Defines the default asynchronous options.
+ * The default philosophy for asynchronous logging is very simple:
+ * 
+ * Log messages with errors should be executed synchronously.
+ *     After all, an error just occurred. The application could be unstable.
+ * 
+ * All other log messages, such as debug output, are executed asynchronously.
+ *     After all, if it wasn't an error, then it was just informational output,
+ *     or something the application was easily able to recover from.
+ * 
+ * -- Changes --
+ * 
+ * You are strongly discouraged from modifying this file.
+ * If you do, you make it more difficult on yourself to merge future bug fixes and improvements from the project.
+ * Instead, create your own MyLogging.h or ApplicationNameLogging.h or CompanyLogging.h
+ * 
+ * For an example of customizing your logging experience, see the "Custom Log Levels" page:
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels
+**/
+
+#define LOG_FLAG_ERROR    (1 << 0)  // 0...00001
+#define LOG_FLAG_WARN     (1 << 1)  // 0...00010
+#define LOG_FLAG_INFO     (1 << 2)  // 0...00100
+#define LOG_FLAG_DEBUG    (1 << 3)  // 0...01000
+#define LOG_FLAG_VERBOSE  (1 << 4)  // 0...10000
+
+#define LOG_LEVEL_OFF     0
+#define LOG_LEVEL_ERROR   (LOG_FLAG_ERROR)                                                                      // 0...00001
+#define LOG_LEVEL_WARN    (LOG_FLAG_ERROR | LOG_FLAG_WARN)                                                      // 0...00011
+#define LOG_LEVEL_INFO    (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO)                                      // 0...00111
+#define LOG_LEVEL_DEBUG   (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG)                     // 0...01111
+#define LOG_LEVEL_VERBOSE (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_DEBUG | LOG_FLAG_VERBOSE)  // 0...11111
+#define LOG_LEVEL_ALL      0xFFFFFFFF // 1111....11111 (LOG_LEVEL_VERBOSE plus any other flags)
+
+#define LOG_ERROR         (LOG_LEVEL_DEF & LOG_FLAG_ERROR)
+#define LOG_WARN          (LOG_LEVEL_DEF & LOG_FLAG_WARN)
+#define LOG_INFO          (LOG_LEVEL_DEF & LOG_FLAG_INFO)
+#define LOG_DEBUG         (LOG_LEVEL_DEF & LOG_FLAG_DEBUG)
+#define LOG_VERBOSE       (LOG_LEVEL_DEF & LOG_FLAG_VERBOSE)
+
+#define LOG_ASYNC_ENABLED YES
+
+#define LOG_ASYNC_ERROR    ( NO && LOG_ASYNC_ENABLED)
+#define LOG_ASYNC_WARN     (YES && LOG_ASYNC_ENABLED)
+#define LOG_ASYNC_INFO     (YES && LOG_ASYNC_ENABLED)
+#define LOG_ASYNC_DEBUG    (YES && LOG_ASYNC_ENABLED)
+#define LOG_ASYNC_VERBOSE  (YES && LOG_ASYNC_ENABLED)
+
+#define DDLogError(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)
+#define DDLogWarn(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)
+#define DDLogInfo(frmt, ...)    LOG_OBJC_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)
+#define DDLogDebug(frmt, ...)   LOG_OBJC_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)
+#define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)
+
+#define DDLogCError(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_ERROR,   LOG_LEVEL_DEF, LOG_FLAG_ERROR,   0, frmt, ##__VA_ARGS__)
+#define DDLogCWarn(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_WARN,    LOG_LEVEL_DEF, LOG_FLAG_WARN,    0, frmt, ##__VA_ARGS__)
+#define DDLogCInfo(frmt, ...)    LOG_C_MAYBE(LOG_ASYNC_INFO,    LOG_LEVEL_DEF, LOG_FLAG_INFO,    0, frmt, ##__VA_ARGS__)
+#define DDLogCDebug(frmt, ...)   LOG_C_MAYBE(LOG_ASYNC_DEBUG,   LOG_LEVEL_DEF, LOG_FLAG_DEBUG,   0, frmt, ##__VA_ARGS__)
+#define DDLogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)
+
+/**
+ * The THIS_FILE macro gives you an NSString of the file name.
+ * For simplicity and clarity, the file name does not include the full path or file extension.
+ * 
+ * For example: DDLogWarn(@"%@: Unable to find thingy", THIS_FILE) -> @"MyViewController: Unable to find thingy"
+**/
+
+NSString *DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy);
+
+#define THIS_FILE (DDExtractFileNameWithoutExtension(__FILE__, NO))
+
+/**
+ * The THIS_METHOD macro gives you the name of the current objective-c method.
+ * 
+ * For example: DDLogWarn(@"%@ - Requires non-nil strings", THIS_METHOD) -> @"setMake:model: requires non-nil strings"
+ * 
+ * Note: This does NOT work in straight C functions (non objective-c).
+ * Instead you should use the predefined __FUNCTION__ macro.
+**/
+
+#define THIS_METHOD NSStringFromSelector(_cmd)
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@interface DDLog : NSObject
+
+/**
+ * Provides access to the underlying logging queue.
+ * This may be helpful to Logger classes for things like thread synchronization.
+**/
+
++ (dispatch_queue_t)loggingQueue;
+
+/**
+ * Logging Primitive.
+ * 
+ * This method is used by the macros above.
+ * It is suggested you stick with the macros as they're easier to use.
+**/
+
++ (void)log:(BOOL)synchronous
+      level:(int)level
+       flag:(int)flag
+    context:(int)context
+       file:(const char *)file
+   function:(const char *)function
+       line:(int)line
+        tag:(id)tag
+     format:(NSString *)format, ... __attribute__ ((format (__NSString__, 9, 10)));
+
+/**
+ * Logging Primitive.
+ * 
+ * This method can be used if you have a prepared va_list.
+**/
+
++ (void)log:(BOOL)asynchronous
+      level:(int)level
+       flag:(int)flag
+    context:(int)context
+       file:(const char *)file
+   function:(const char *)function
+       line:(int)line
+        tag:(id)tag
+     format:(NSString *)format
+       args:(va_list)argList;
+
+/**
+ * Logging Primitive.
+ *
+ * This method can be used if you manualy prepared DDLogMessage.
+ **/
+
++ (void)log:(BOOL)asynchronous
+    message:(DDLogMessage *)logMessage;
+
+/**
+ * Since logging can be asynchronous, there may be times when you want to flush the logs.
+ * The framework invokes this automatically when the application quits.
+**/
+
++ (void)flushLog;
+
+/** 
+ * Loggers
+ * 
+ * In order for your log statements to go somewhere, you should create and add a logger.
+ * 
+ * You can add multiple loggers in order to direct your log statements to multiple places.
+ * And each logger can be configured separately.
+ * So you could have, for example, verbose logging to the console, but a concise log file with only warnings & errors.
+**/
+
+/**
+ * Adds the logger to the system.
+ * 
+ * This is equivalent to invoking [DDLog addLogger:logger withLogLevel:LOG_LEVEL_ALL].
+**/
++ (void)addLogger:(id <DDLogger>)logger;
+
+/**
+ * Adds the logger to the system.
+ * 
+ * The logLevel that you provide here is a preemptive filter (for performance).
+ * That is, the logLevel specified here will be used to filter out logMessages so that
+ * the logger is never even invoked for the messages.
+ * 
+ * More information:
+ * When you issue a log statement, the logging framework iterates over each logger,
+ * and checks to see if it should forward the logMessage to the logger.
+ * This check is done using the logLevel parameter passed to this method.
+ * 
+ * For example:
+ * [DDLog addLogger:consoleLogger withLogLevel:LOG_LEVEL_VERBOSE];
+ * [DDLog addLogger:fileLogger    withLogLevel:LOG_LEVEL_WARN];
+ *
+ * DDLogError(@"oh no"); => gets forwarded to consoleLogger & fileLogger
+ * DDLogInfo(@"hi");     => gets forwarded to consoleLogger only
+ *
+ * It is important to remember that Lumberjack uses a BITMASK.
+ * Many developers & third party frameworks may define extra log levels & flags.
+ * For example:
+ * 
+ * #define SOME_FRAMEWORK_LOG_FLAG_TRACE (1 << 6) // 0...1000000
+ *
+ * So if you specify LOG_LEVEL_VERBOSE to this method, you won't see the framework's trace messages.
+ *
+ * (SOME_FRAMEWORK_LOG_FLAG_TRACE & LOG_LEVEL_VERBOSE) => (01000000 & 00011111) => NO
+ * 
+ * Consider passing LOG_LEVEL_ALL to this method, which has all bits set.
+ * You can also use the exclusive-or bitwise operator to get a bitmask that has all flags set,
+ * except the ones you explicitly don't want. For example, if you wanted everything except verbose & debug:
+ * 
+ * ((LOG_LEVEL_ALL ^ LOG_LEVEL_VERBOSE) | LOG_LEVEL_INFO)
+**/
++ (void)addLogger:(id <DDLogger>)logger withLogLevel:(int)logLevel;
+
++ (void)removeLogger:(id <DDLogger>)logger;
++ (void)removeAllLoggers;
+
++ (NSArray *)allLoggers;
+
+/**
+ * Registered Dynamic Logging
+ * 
+ * These methods allow you to obtain a list of classes that are using registered dynamic logging,
+ * and also provides methods to get and set their log level during run time.
+**/
+
++ (NSArray *)registeredClasses;
++ (NSArray *)registeredClassNames;
+
++ (int)logLevelForClass:(Class)aClass;
++ (int)logLevelForClassWithName:(NSString *)aClassName;
+
++ (void)setLogLevel:(int)logLevel forClass:(Class)aClass;
++ (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName;
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@protocol DDLogger <NSObject>
+@required
+
+- (void)logMessage:(DDLogMessage *)logMessage;
+
+/**
+ * Formatters may optionally be added to any logger.
+ * 
+ * If no formatter is set, the logger simply logs the message as it is given in logMessage,
+ * or it may use its own built in formatting style.
+**/
+- (id <DDLogFormatter>)logFormatter;
+- (void)setLogFormatter:(id <DDLogFormatter>)formatter;
+
+@optional
+
+/**
+ * Since logging is asynchronous, adding and removing loggers is also asynchronous.
+ * In other words, the loggers are added and removed at appropriate times with regards to log messages.
+ * 
+ * - Loggers will not receive log messages that were executed prior to when they were added.
+ * - Loggers will not receive log messages that were executed after they were removed.
+ * 
+ * These methods are executed in the logging thread/queue.
+ * This is the same thread/queue that will execute every logMessage: invocation.
+ * Loggers may use these methods for thread synchronization or other setup/teardown tasks.
+**/
+- (void)didAddLogger;
+- (void)willRemoveLogger;
+
+/**
+ * Some loggers may buffer IO for optimization purposes.
+ * For example, a database logger may only save occasionaly as the disk IO is slow.
+ * In such loggers, this method should be implemented to flush any pending IO.
+ * 
+ * This allows invocations of DDLog's flushLog method to be propogated to loggers that need it.
+ * 
+ * Note that DDLog's flushLog method is invoked automatically when the application quits,
+ * and it may be also invoked manually by the developer prior to application crashes, or other such reasons.
+**/
+- (void)flush;
+
+/**
+ * Each logger is executed concurrently with respect to the other loggers.
+ * Thus, a dedicated dispatch queue is used for each logger.
+ * Logger implementations may optionally choose to provide their own dispatch queue.
+**/
+- (dispatch_queue_t)loggerQueue;
+
+/**
+ * If the logger implementation does not choose to provide its own queue,
+ * one will automatically be created for it.
+ * The created queue will receive its name from this method.
+ * This may be helpful for debugging or profiling reasons.
+**/
+- (NSString *)loggerName;
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@protocol DDLogFormatter <NSObject>
+@required
+
+/**
+ * Formatters may optionally be added to any logger.
+ * This allows for increased flexibility in the logging environment.
+ * For example, log messages for log files may be formatted differently than log messages for the console.
+ * 
+ * For more information about formatters, see the "Custom Formatters" page:
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters
+ * 
+ * The formatter may also optionally filter the log message by returning nil,
+ * in which case the logger will not log the message.
+**/
+- (NSString *)formatLogMessage:(DDLogMessage *)logMessage;
+
+@optional
+
+/**
+ * A single formatter instance can be added to multiple loggers.
+ * These methods provides hooks to notify the formatter of when it's added/removed.
+ *
+ * This is primarily for thread-safety.
+ * If a formatter is explicitly not thread-safe, it may wish to throw an exception if added to multiple loggers.
+ * Or if a formatter has potentially thread-unsafe code (e.g. NSDateFormatter),
+ * it could possibly use these hooks to switch to thread-safe versions of the code.
+**/
+- (void)didAddToLogger:(id <DDLogger>)logger;
+- (void)willRemoveFromLogger:(id <DDLogger>)logger;
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@protocol DDRegisteredDynamicLogging
+
+/**
+ * Implement these methods to allow a file's log level to be managed from a central location.
+ * 
+ * This is useful if you'd like to be able to change log levels for various parts
+ * of your code from within the running application.
+ * 
+ * Imagine pulling up the settings for your application,
+ * and being able to configure the logging level on a per file basis.
+ * 
+ * The implementation can be very straight-forward:
+ * 
+ * + (int)ddLogLevel
+ * {
+ *     return ddLogLevel;
+ * }
+ *  
+ * + (void)ddSetLogLevel:(int)logLevel
+ * {
+ *     ddLogLevel = logLevel;
+ * }
+**/
+
++ (int)ddLogLevel;
++ (void)ddSetLogLevel:(int)logLevel;
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * The DDLogMessage class encapsulates information about the log message.
+ * If you write custom loggers or formatters, you will be dealing with objects of this class.
+**/
+
+enum {
+    DDLogMessageCopyFile     = 1 << 0,
+    DDLogMessageCopyFunction = 1 << 1
+};
+typedef int DDLogMessageOptions;
+
+@interface DDLogMessage : NSObject <NSCopying>
+{
+
+// The public variables below can be accessed directly (for speed).
+// For example: logMessage->logLevel
+    
+@public
+    int logLevel;
+    int logFlag;
+    int logContext;
+    NSString *logMsg;
+    NSDate *timestamp;
+    char *file;
+    char *function;
+    int lineNumber;
+    mach_port_t machThreadID;
+    char *queueLabel;
+    NSString *threadName;
+    
+    // For 3rd party extensions to the framework, where flags and contexts aren't enough.
+    id tag;
+    
+    // For 3rd party extensions that manually create DDLogMessage instances.
+    DDLogMessageOptions options;
+}
+
+/**
+ * Standard init method for a log message object.
+ * Used by the logging primitives. (And the macros use the logging primitives.)
+ * 
+ * If you find need to manually create logMessage objects, there is one thing you should be aware of:
+ * 
+ * If no flags are passed, the method expects the file and function parameters to be string literals.
+ * That is, it expects the given strings to exist for the duration of the object's lifetime,
+ * and it expects the given strings to be immutable.
+ * In other words, it does not copy these strings, it simply points to them.
+ * This is due to the fact that __FILE__ and __FUNCTION__ are usually used to specify these parameters,
+ * so it makes sense to optimize and skip the unnecessary allocations.
+ * However, if you need them to be copied you may use the options parameter to specify this.
+ * Options is a bitmask which supports DDLogMessageCopyFile and DDLogMessageCopyFunction.
+**/
+- (instancetype)initWithLogMsg:(NSString *)logMsg
+                         level:(int)logLevel
+                          flag:(int)logFlag
+                       context:(int)logContext
+                          file:(const char *)file
+                      function:(const char *)function
+                          line:(int)line
+                           tag:(id)tag
+                       options:(DDLogMessageOptions)optionsMask;
+- (instancetype)initWithLogMsg:(NSString *)logMsg
+                         level:(int)logLevel
+                          flag:(int)logFlag
+                       context:(int)logContext
+                          file:(const char *)file
+                      function:(const char *)function
+                          line:(int)line
+                           tag:(id)tag
+                       options:(DDLogMessageOptions)optionsMask
+                     timestamp:(NSDate *)aTimestamp;
+
+/**
+ * Returns the threadID as it appears in NSLog.
+ * That is, it is a hexadecimal value which is calculated from the machThreadID.
+**/
+- (NSString *)threadID;
+
+/**
+ * Convenience property to get just the file name, as the file variable is generally the full file path.
+ * This method does not include the file extension, which is generally unwanted for logging purposes.
+**/
+- (NSString *)fileName;
+
+/**
+ * Returns the function variable in NSString form.
+**/
+- (NSString *)methodName;
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * The DDLogger protocol specifies that an optional formatter can be added to a logger.
+ * Most (but not all) loggers will want to support formatters.
+ * 
+ * However, writting getters and setters in a thread safe manner,
+ * while still maintaining maximum speed for the logging process, is a difficult task.
+ * 
+ * To do it right, the implementation of the getter/setter has strict requiremenets:
+ * - Must NOT require the logMessage method to acquire a lock.
+ * - Must NOT require the logMessage method to access an atomic property (also a lock of sorts).
+ * 
+ * To simplify things, an abstract logger is provided that implements the getter and setter.
+ * 
+ * Logger implementations may simply extend this class,
+ * and they can ACCESS THE FORMATTER VARIABLE DIRECTLY from within their logMessage method!
+**/
+
+@interface DDAbstractLogger : NSObject <DDLogger>
+{
+    id <DDLogFormatter> formatter;
+    
+    dispatch_queue_t loggerQueue;
+}
+
+- (id <DDLogFormatter>)logFormatter;
+- (void)setLogFormatter:(id <DDLogFormatter>)formatter;
+
+// For thread-safety assertions
+- (BOOL)isOnGlobalLoggingQueue;
+- (BOOL)isOnInternalLoggerQueue;
+
+@end
diff --git a/Lumberjack/DDLog.m b/Lumberjack/DDLog.m
new file mode 100755
index 0000000..b70dc10
--- /dev/null
+++ b/Lumberjack/DDLog.m
@@ -0,0 +1,1253 @@
+#import "DDLog.h"
+
+#import <pthread.h>
+#import <objc/runtime.h>
+#import <mach/mach_host.h>
+#import <mach/host_info.h>
+#import <libkern/OSAtomic.h>
+#import <Availability.h>
+#if TARGET_OS_IPHONE
+    #import <UIKit/UIDevice.h>
+#endif
+
+/**
+ * Welcome to Cocoa Lumberjack!
+ * 
+ * The project page has a wealth of documentation if you have any questions.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack
+ * 
+ * If you're new to the project you may wish to read the "Getting Started" wiki.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted
+ * 
+**/
+
+#if ! __has_feature(objc_arc)
+#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
+#endif
+
+// We probably shouldn't be using DDLog() statements within the DDLog implementation.
+// But we still want to leave our log statements for any future debugging,
+// and to allow other developers to trace the implementation (which is a great learning tool).
+// 
+// So we use a primitive logging macro around NSLog.
+// We maintain the NS prefix on the macros to be explicit about the fact that we're using NSLog.
+
+#define DD_DEBUG NO
+
+#define NSLogDebug(frmt, ...) do{ if(DD_DEBUG) NSLog((frmt), ##__VA_ARGS__); } while(0)
+
+// Specifies the maximum queue size of the logging thread.
+// 
+// Since most logging is asynchronous, its possible for rogue threads to flood the logging queue.
+// That is, to issue an abundance of log statements faster than the logging thread can keepup.
+// Typically such a scenario occurs when log statements are added haphazardly within large loops,
+// but may also be possible if relatively slow loggers are being used.
+// 
+// This property caps the queue size at a given number of outstanding log statements.
+// If a thread attempts to issue a log statement when the queue is already maxed out,
+// the issuing thread will block until the queue size drops below the max again.
+
+#define LOG_MAX_QUEUE_SIZE 1000 // Should not exceed INT32_MAX
+
+// The "global logging queue" refers to [DDLog loggingQueue].
+// It is the queue that all log statements go through.
+//
+// The logging queue sets a flag via dispatch_queue_set_specific using this key.
+// We can check for this key via dispatch_get_specific() to see if we're on the "global logging queue".
+
+static void *const GlobalLoggingQueueIdentityKey = (void *)&GlobalLoggingQueueIdentityKey;
+
+
+@interface DDLoggerNode : NSObject {
+@public 
+    id <DDLogger> logger;   
+    dispatch_queue_t loggerQueue;
+    int logLevel;
+}
+
+@property (nonatomic, assign, readonly) int logLevel;
+
++ (DDLoggerNode *)nodeWithLogger:(id <DDLogger>)logger loggerQueue:(dispatch_queue_t)loggerQueue logLevel:(int)logLevel;
+
+@end
+
+
+@interface DDLog (PrivateAPI)
+
++ (void)lt_addLogger:(id <DDLogger>)logger logLevel:(int)logLevel;
++ (void)lt_removeLogger:(id <DDLogger>)logger;
++ (void)lt_removeAllLoggers;
++ (NSArray *)lt_allLoggers;
++ (void)lt_log:(DDLogMessage *)logMessage;
++ (void)lt_flush;
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation DDLog
+
+// An array used to manage all the individual loggers.
+// The array is only modified on the loggingQueue/loggingThread.
+static NSMutableArray *loggers;
+
+// All logging statements are added to the same queue to ensure FIFO operation.
+static dispatch_queue_t loggingQueue;
+
+// Individual loggers are executed concurrently per log statement.
+// Each logger has it's own associated queue, and a dispatch group is used for synchrnoization.
+static dispatch_group_t loggingGroup;
+
+// In order to prevent to queue from growing infinitely large,
+// a maximum size is enforced (LOG_MAX_QUEUE_SIZE).
+static dispatch_semaphore_t queueSemaphore;
+
+// Minor optimization for uniprocessor machines
+static unsigned int numProcessors;
+
+/**
+ * The runtime sends initialize to each class in a program exactly one time just before the class,
+ * or any class that inherits from it, is sent its first message from within the program. (Thus the
+ * method may never be invoked if the class is not used.) The runtime sends the initialize message to
+ * classes in a thread-safe manner. Superclasses receive this message before their subclasses.
+ *
+ * This method may also be called directly (assumably by accident), hence the safety mechanism.
+**/
++ (void)initialize
+{
+    static dispatch_once_t DDLogOnceToken;
+    dispatch_once(&DDLogOnceToken, ^{
+        
+        loggers = [[NSMutableArray alloc] initWithCapacity:4];
+        
+        NSLogDebug(@"DDLog: Using grand central dispatch");
+        
+        loggingQueue = dispatch_queue_create("cocoa.lumberjack", NULL);
+        loggingGroup = dispatch_group_create();
+        
+        void *nonNullValue = GlobalLoggingQueueIdentityKey; // Whatever, just not null
+        dispatch_queue_set_specific(loggingQueue, GlobalLoggingQueueIdentityKey, nonNullValue, NULL);
+        
+        queueSemaphore = dispatch_semaphore_create(LOG_MAX_QUEUE_SIZE);
+        
+        // Figure out how many processors are available.
+        // This may be used later for an optimization on uniprocessor machines.
+        
+        host_basic_info_data_t hostInfo;
+        mach_msg_type_number_t infoCount;
+        
+        infoCount = HOST_BASIC_INFO_COUNT;
+        host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, &infoCount);
+        
+        unsigned int result = (unsigned int)(hostInfo.max_cpus);
+        unsigned int one    = (unsigned int)(1);
+        
+        numProcessors = MAX(result, one);
+        
+        NSLogDebug(@"DDLog: numProcessors = %u", numProcessors);
+        
+        
+#if TARGET_OS_IPHONE
+        NSString *notificationName = @"UIApplicationWillTerminateNotification";
+#else
+        NSString *notificationName = nil;
+        
+        // On Command Line Tool apps AppKit may not be avaliable
+#ifdef NSAppKitVersionNumber10_0
+        if (NSApp) {
+            notificationName = @"NSApplicationWillTerminateNotification";
+        }
+#endif
+        
+        if (! notificationName)
+        {
+            // If there is no NSApp -> we are running Command Line Tool app.
+            // In this case terminate notification wouldn't be fired, so we use workaround.
+            atexit_b(^{
+                [self applicationWillTerminate:nil];
+            });
+        }
+#endif
+        
+        if (notificationName) {
+            [[NSNotificationCenter defaultCenter] addObserver:self
+                                                     selector:@selector(applicationWillTerminate:)
+                                                         name:notificationName
+                                                       object:nil];
+        }
+        
+    });
+}
+
+/**
+ * Provides access to the logging queue.
+**/
++ (dispatch_queue_t)loggingQueue
+{
+    return loggingQueue;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Notifications
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
++ (void)applicationWillTerminate:(NSNotification *)notification
+{
+    [self flushLog];
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Logger Management
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
++ (void)addLogger:(id <DDLogger>)logger
+{
+    [self addLogger:logger withLogLevel:LOG_LEVEL_ALL]; // LOG_LEVEL_ALL has all bits set
+}
+
++ (void)addLogger:(id <DDLogger>)logger withLogLevel:(int)logLevel
+{
+    if (logger == nil) return;
+    
+    dispatch_async(loggingQueue, ^{ @autoreleasepool {
+        
+        [self lt_addLogger:logger logLevel:logLevel];
+    }});
+}
+
++ (void)removeLogger:(id <DDLogger>)logger
+{
+    if (logger == nil) return;
+    
+    dispatch_async(loggingQueue, ^{ @autoreleasepool {
+        
+        [self lt_removeLogger:logger];
+    }});
+}
+
++ (void)removeAllLoggers
+{
+    dispatch_async(loggingQueue, ^{ @autoreleasepool {
+        
+        [self lt_removeAllLoggers];
+    }});
+}
+
++ (NSArray *)allLoggers
+{
+    __block NSArray *theLoggers;
+
+    dispatch_sync(loggingQueue, ^{ @autoreleasepool {
+        theLoggers = [self lt_allLoggers];
+    }});
+
+    return theLoggers;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Master Logging
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
++ (void)queueLogMessage:(DDLogMessage *)logMessage asynchronously:(BOOL)asyncFlag
+{
+    // We have a tricky situation here...
+    // 
+    // In the common case, when the queueSize is below the maximumQueueSize,
+    // we want to simply enqueue the logMessage. And we want to do this as fast as possible,
+    // which means we don't want to block and we don't want to use any locks.
+    // 
+    // However, if the queueSize gets too big, we want to block.
+    // But we have very strict requirements as to when we block, and how long we block.
+    // 
+    // The following example should help illustrate our requirements:
+    // 
+    // Imagine that the maximum queue size is configured to be 5,
+    // and that there are already 5 log messages queued.
+    // Let us call these 5 queued log messages A, B, C, D, and E. (A is next to be executed)
+    // 
+    // Now if our thread issues a log statement (let us call the log message F),
+    // it should block before the message is added to the queue.
+    // Furthermore, it should be unblocked immediately after A has been unqueued.
+    // 
+    // The requirements are strict in this manner so that we block only as long as necessary,
+    // and so that blocked threads are unblocked in the order in which they were blocked.
+    // 
+    // Returning to our previous example, let us assume that log messages A through E are still queued.
+    // Our aforementioned thread is blocked attempting to queue log message F.
+    // Now assume we have another separate thread that attempts to issue log message G.
+    // It should block until log messages A and B have been unqueued.
+    
+    
+    // We are using a counting semaphore provided by GCD.
+    // The semaphore is initialized with our LOG_MAX_QUEUE_SIZE value.
+    // Everytime we want to queue a log message we decrement this value.
+    // If the resulting value is less than zero,
+    // the semaphore function waits in FIFO order for a signal to occur before returning.
+    // 
+    // A dispatch semaphore is an efficient implementation of a traditional counting semaphore.
+    // Dispatch semaphores call down to the kernel only when the calling thread needs to be blocked.
+    // If the calling semaphore does not need to block, no kernel call is made.
+    
+    dispatch_semaphore_wait(queueSemaphore, DISPATCH_TIME_FOREVER);
+    
+    // We've now sure we won't overflow the queue.
+    // It is time to queue our log message.
+    
+    dispatch_block_t logBlock = ^{ @autoreleasepool {
+        
+        [self lt_log:logMessage];
+    }};
+    
+    if (asyncFlag)
+        dispatch_async(loggingQueue, logBlock);
+    else
+        dispatch_sync(loggingQueue, logBlock);
+}
+
++ (void)log:(BOOL)asynchronous
+      level:(int)level
+       flag:(int)flag
+    context:(int)context
+       file:(const char *)file
+   function:(const char *)function
+       line:(int)line
+        tag:(id)tag
+     format:(NSString *)format, ...
+{
+    va_list args;
+    if (format)
+    {
+        va_start(args, format);
+        
+        NSString *logMsg = [[NSString alloc] initWithFormat:format arguments:args];
+        DDLogMessage *logMessage = [[DDLogMessage alloc] initWithLogMsg:logMsg
+                                                                  level:level
+                                                                   flag:flag
+                                                                context:context
+                                                                   file:file
+                                                               function:function
+                                                                   line:line
+                                                                    tag:tag
+                                                                options:0];
+        
+        [self queueLogMessage:logMessage asynchronously:asynchronous];
+        
+        va_end(args);
+    }
+}
+
++ (void)log:(BOOL)asynchronous
+      level:(int)level
+       flag:(int)flag
+    context:(int)context
+       file:(const char *)file
+   function:(const char *)function
+       line:(int)line
+        tag:(id)tag
+     format:(NSString *)format
+       args:(va_list)args
+{
+    if (format)
+    {
+        NSString *logMsg = [[NSString alloc] initWithFormat:format arguments:args];
+        DDLogMessage *logMessage = [[DDLogMessage alloc] initWithLogMsg:logMsg
+                                                                  level:level
+                                                                   flag:flag
+                                                                context:context
+                                                                   file:file
+                                                               function:function
+                                                                   line:line
+                                                                    tag:tag
+                                                                options:0];
+        
+        [self queueLogMessage:logMessage asynchronously:asynchronous];
+    }
+}
+
++ (void)log:(BOOL)asynchronous
+    message:(DDLogMessage *)logMessage
+{
+    [self queueLogMessage:logMessage asynchronously:asynchronous];
+}
+
++ (void)flushLog
+{
+    dispatch_sync(loggingQueue, ^{ @autoreleasepool {
+        
+        [self lt_flush];
+    }});
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Registered Dynamic Logging
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
++ (BOOL)isRegisteredClass:(Class)class
+{
+    SEL getterSel = @selector(ddLogLevel);
+    SEL setterSel = @selector(ddSetLogLevel:);
+    
+#if TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR
+    
+    // Issue #6 (GoogleCode) - Crashes on iOS 4.2.1 and iPhone 4
+    // 
+    // Crash caused by class_getClassMethod(2).
+    // 
+    //     "It's a bug with UIAccessibilitySafeCategory__NSObject so it didn't pop up until
+    //      users had VoiceOver enabled [...]. I was able to work around it by searching the
+    //      result of class_copyMethodList() instead of calling class_getClassMethod()"
+    
+    BOOL result = NO;
+    
+    unsigned int methodCount, i;
+    Method *methodList = class_copyMethodList(object_getClass(class), &methodCount);
+    
+    if (methodList != NULL)
+    {
+        BOOL getterFound = NO;
+        BOOL setterFound = NO;
+        
+        for (i = 0; i < methodCount; ++i)
+        {
+            SEL currentSel = method_getName(methodList[i]);
+            
+            if (currentSel == getterSel)
+            {
+                getterFound = YES;
+            }
+            else if (currentSel == setterSel)
+            {
+                setterFound = YES;
+            }
+            
+            if (getterFound && setterFound)
+            {
+                result = YES;
+                break;
+            }
+        }
+        
+        free(methodList);
+    }
+    
+    return result;
+    
+#else
+    
+    // Issue #24 (GitHub) - Crashing in in ARC+Simulator
+    // 
+    // The method +[DDLog isRegisteredClass] will crash a project when using it with ARC + Simulator.
+    // For running in the Simulator, it needs to execute the non-iOS code.
+    
+    Method getter = class_getClassMethod(class, getterSel);
+    Method setter = class_getClassMethod(class, setterSel);
+    
+    if ((getter != NULL) && (setter != NULL))
+    {
+        return YES;
+    }
+    
+    return NO;
+    
+#endif
+}
+
++ (NSArray *)registeredClasses
+{
+    NSUInteger numClasses, i;
+    
+    // We're going to get the list of all registered classes.
+    // The Objective-C runtime library automatically registers all the classes defined in your source code.
+    // 
+    // To do this we use the following method (documented in the Objective-C Runtime Reference):
+    // 
+    // int objc_getClassList(Class *buffer, int bufferLen)
+    // 
+    // We can pass (NULL, 0) to obtain the total number of
+    // registered class definitions without actually retrieving any class definitions.
+    // This allows us to allocate the minimum amount of memory needed for the application.
+    
+    numClasses = (NSUInteger)MAX(objc_getClassList(NULL, 0), 0);
+    
+    // The numClasses method now tells us how many classes we have.
+    // So we can allocate our buffer, and get pointers to all the class definitions.
+    
+    Class *classes = numClasses ? (Class *)malloc(sizeof(Class) * numClasses) : NULL;
+    if (classes == NULL) return nil;
+    
+    numClasses = (NSUInteger)MAX(objc_getClassList(classes, (int)numClasses), 0);
+    
+    // We can now loop through the classes, and test each one to see if it is a DDLogging class.
+    
+    NSMutableArray *result = [NSMutableArray arrayWithCapacity:numClasses];
+    
+    for (i = 0; i < numClasses; i++)
+    {
+        Class class = classes[i];
+        
+        if ([self isRegisteredClass:class])
+        {
+            [result addObject:class];
+        }
+    }
+    
+    free(classes);
+    
+    return result;
+}
+
++ (NSArray *)registeredClassNames
+{
+    NSArray *registeredClasses = [self registeredClasses];
+    NSMutableArray *result = [NSMutableArray arrayWithCapacity:[registeredClasses count]];
+    
+    for (Class class in registeredClasses)
+    {
+        [result addObject:NSStringFromClass(class)];
+    }
+    
+    return result;
+}
+
++ (int)logLevelForClass:(Class)aClass
+{
+    if ([self isRegisteredClass:aClass])
+    {
+        return [aClass ddLogLevel];
+    }
+    
+    return -1;
+}
+
++ (int)logLevelForClassWithName:(NSString *)aClassName
+{
+    Class aClass = NSClassFromString(aClassName);
+    
+    return [self logLevelForClass:aClass];
+}
+
++ (void)setLogLevel:(int)logLevel forClass:(Class)aClass
+{
+    if ([self isRegisteredClass:aClass])
+    {
+        [aClass ddSetLogLevel:logLevel];
+    }
+}
+
++ (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName
+{
+    Class aClass = NSClassFromString(aClassName);
+    
+    [self setLogLevel:logLevel forClass:aClass];
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Logging Thread
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
++ (void)lt_addLogger:(id <DDLogger>)logger logLevel:(int)logLevel
+{
+    // Add to loggers array.
+    // Need to create loggerQueue if loggerNode doesn't provide one.
+
+    NSAssert(dispatch_get_specific(GlobalLoggingQueueIdentityKey),
+            @"This method should only be run on the logging thread/queue");
+    
+    dispatch_queue_t loggerQueue = NULL;
+    
+    if ([logger respondsToSelector:@selector(loggerQueue)])
+    {
+        // Logger may be providing its own queue
+        
+        loggerQueue = [logger loggerQueue];
+    }
+    
+    if (loggerQueue == nil)
+    {
+        // Automatically create queue for the logger.
+        // Use the logger name as the queue name if possible.
+        
+        const char *loggerQueueName = NULL;
+        if ([logger respondsToSelector:@selector(loggerName)])
+        {
+            loggerQueueName = [[logger loggerName] UTF8String];
+        }
+        
+        loggerQueue = dispatch_queue_create(loggerQueueName, NULL);
+    }
+    
+    DDLoggerNode *loggerNode = [DDLoggerNode nodeWithLogger:logger loggerQueue:loggerQueue logLevel:logLevel];
+    [loggers addObject:loggerNode];
+    
+    if ([logger respondsToSelector:@selector(didAddLogger)])
+    {
+        dispatch_async(loggerNode->loggerQueue, ^{ @autoreleasepool {
+            
+            [logger didAddLogger];
+        }});
+    }
+}
+
++ (void)lt_removeLogger:(id <DDLogger>)logger
+{
+    // Find associated loggerNode in list of added loggers
+
+    NSAssert(dispatch_get_specific(GlobalLoggingQueueIdentityKey),
+            @"This method should only be run on the logging thread/queue");
+    
+    DDLoggerNode *loggerNode = nil;
+    
+    for (DDLoggerNode *node in loggers)
+    {
+        if (node->logger == logger)
+        {
+            loggerNode = node;
+            break;
+        }
+    }
+    
+    if (loggerNode == nil)
+    {
+        NSLogDebug(@"DDLog: Request to remove logger which wasn't added");
+        return;
+    }
+    
+    // Notify logger
+    
+    if ([logger respondsToSelector:@selector(willRemoveLogger)])
+    {
+        dispatch_async(loggerNode->loggerQueue, ^{ @autoreleasepool {
+            
+            [logger willRemoveLogger];
+        }});
+    }
+    
+    // Remove from loggers array
+    
+    [loggers removeObject:loggerNode];
+}
+
++ (void)lt_removeAllLoggers
+{
+    // Notify all loggers
+    
+    NSAssert(dispatch_get_specific(GlobalLoggingQueueIdentityKey),
+            @"This method should only be run on the logging thread/queue");
+
+    for (DDLoggerNode *loggerNode in loggers)
+    {
+        if ([loggerNode->logger respondsToSelector:@selector(willRemoveLogger)])
+        {
+            dispatch_async(loggerNode->loggerQueue, ^{ @autoreleasepool {
+                
+                [loggerNode->logger willRemoveLogger];
+            }});
+        }
+    }
+    
+    // Remove all loggers from array
+    
+    [loggers removeAllObjects];
+}
+
++ (NSArray *)lt_allLoggers
+{
+    NSAssert(dispatch_get_specific(GlobalLoggingQueueIdentityKey),
+            @"This method should only be run on the logging thread/queue");
+
+    NSMutableArray *theLoggers = [NSMutableArray new];
+
+    for (DDLoggerNode *loggerNode in loggers)
+    {
+        [theLoggers addObject:loggerNode->logger];
+    }
+
+    return [theLoggers copy];
+}
+
++ (void)lt_log:(DDLogMessage *)logMessage
+{
+    // Execute the given log message on each of our loggers.
+
+    NSAssert(dispatch_get_specific(GlobalLoggingQueueIdentityKey),
+            @"This method should only be run on the logging thread/queue");
+    
+    if (numProcessors > 1)
+    {
+        // Execute each logger concurrently, each within its own queue.
+        // All blocks are added to same group.
+        // After each block has been queued, wait on group.
+        // 
+        // The waiting ensures that a slow logger doesn't end up with a large queue of pending log messages.
+        // This would defeat the purpose of the efforts we made earlier to restrict the max queue size.
+        
+        for (DDLoggerNode *loggerNode in loggers)
+        {
+            // skip the loggers that shouldn't write this message based on the logLevel
+
+            if (!(logMessage->logFlag & loggerNode.logLevel))
+                continue;
+
+            dispatch_group_async(loggingGroup, loggerNode->loggerQueue, ^{ @autoreleasepool {
+                
+                [loggerNode->logger logMessage:logMessage];
+            
+            }});
+        }
+        
+        dispatch_group_wait(loggingGroup, DISPATCH_TIME_FOREVER);
+    }
+    else
+    {
+        // Execute each logger serialy, each within its own queue.
+        
+        for (DDLoggerNode *loggerNode in loggers)
+        {
+            // skip the loggers that shouldn't write this message based on the logLevel
+            
+            if (!(logMessage->logFlag & loggerNode.logLevel))
+                continue;
+
+            dispatch_sync(loggerNode->loggerQueue, ^{ @autoreleasepool {
+                
+                [loggerNode->logger logMessage:logMessage];
+                
+            }});
+        }
+    }
+    
+    // If our queue got too big, there may be blocked threads waiting to add log messages to the queue.
+    // Since we've now dequeued an item from the log, we may need to unblock the next thread.
+    
+    // We are using a counting semaphore provided by GCD.
+    // The semaphore is initialized with our LOG_MAX_QUEUE_SIZE value.
+    // When a log message is queued this value is decremented.
+    // When a log message is dequeued this value is incremented.
+    // If the value ever drops below zero,
+    // the queueing thread blocks and waits in FIFO order for us to signal it.
+    // 
+    // A dispatch semaphore is an efficient implementation of a traditional counting semaphore.
+    // Dispatch semaphores call down to the kernel only when the calling thread needs to be blocked.
+    // If the calling semaphore does not need to block, no kernel call is made.
+    
+    dispatch_semaphore_signal(queueSemaphore);
+}
+
++ (void)lt_flush
+{
+    // All log statements issued before the flush method was invoked have now been executed.
+    // 
+    // Now we need to propogate the flush request to any loggers that implement the flush method.
+    // This is designed for loggers that buffer IO.
+
+    NSAssert(dispatch_get_specific(GlobalLoggingQueueIdentityKey),
+            @"This method should only be run on the logging thread/queue");
+        
+    for (DDLoggerNode *loggerNode in loggers)
+    {
+        if ([loggerNode->logger respondsToSelector:@selector(flush)])
+        {
+            dispatch_group_async(loggingGroup, loggerNode->loggerQueue, ^{ @autoreleasepool {
+                
+                [loggerNode->logger flush];
+                
+            }});
+        }
+    }
+    
+    dispatch_group_wait(loggingGroup, DISPATCH_TIME_FOREVER);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Utilities
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+NSString *DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy)
+{
+    if (filePath == NULL) return nil;
+    
+    char *lastSlash = NULL;
+    char *lastDot = NULL;
+    
+    char *p = (char *)filePath;
+    
+    while (*p != '\0')
+    {
+        if (*p == '/')
+            lastSlash = p;
+        else if (*p == '.')
+            lastDot = p;
+        
+        p++;
+    }
+    
+    char *subStr;
+    NSUInteger subLen;
+    
+    if (lastSlash)
+    {
+        if (lastDot)
+        {
+            // lastSlash -> lastDot
+            subStr = lastSlash + 1;
+            subLen = (NSUInteger)(lastDot - subStr);
+        }
+        else
+        {
+            // lastSlash -> endOfString
+            subStr = lastSlash + 1;
+            subLen = (NSUInteger)(p - subStr);
+        }
+    }
+    else
+    {
+        if (lastDot)
+        {
+            // startOfString -> lastDot
+            subStr = (char *)filePath;
+            subLen = (NSUInteger)(lastDot - subStr);
+        }
+        else
+        {
+            // startOfString -> endOfString
+            subStr = (char *)filePath;
+            subLen = (NSUInteger)(p - subStr);
+        }
+    }
+    
+    if (copy)
+    {
+        return [[NSString alloc] initWithBytes:subStr
+                                        length:subLen
+                                      encoding:NSUTF8StringEncoding];
+    }
+    else
+    {
+        // We can take advantage of the fact that __FILE__ is a string literal.
+        // Specifically, we don't need to waste time copying the string.
+        // We can just tell NSString to point to a range within the string literal.
+        
+        return [[NSString alloc] initWithBytesNoCopy:subStr
+                                              length:subLen
+                                            encoding:NSUTF8StringEncoding
+                                        freeWhenDone:NO];
+    }
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation DDLoggerNode
+
+@synthesize logLevel;
+
+- (instancetype)initWithLogger:(id <DDLogger>)aLogger loggerQueue:(dispatch_queue_t)aLoggerQueue logLevel:(int)aLogLevel
+{
+    if ((self = [super init]))
+    {
+        logger = aLogger;
+        
+        if (aLoggerQueue) {
+            loggerQueue = aLoggerQueue;
+            #if !OS_OBJECT_USE_OBJC
+            dispatch_retain(loggerQueue);
+            #endif
+        }
+        logLevel = aLogLevel;
+    }
+    return self;
+}
+
++ (DDLoggerNode *)nodeWithLogger:(id <DDLogger>)logger loggerQueue:(dispatch_queue_t)loggerQueue logLevel:(int)logLevel
+{
+    return [[DDLoggerNode alloc] initWithLogger:logger loggerQueue:loggerQueue logLevel:logLevel];
+}
+
+- (void)dealloc
+{
+    #if !OS_OBJECT_USE_OBJC
+    if (loggerQueue) dispatch_release(loggerQueue);
+    #endif
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation DDLogMessage
+
+static char *dd_str_copy(const char *str)
+{
+    if (str == NULL) return NULL;
+    
+    size_t length = strlen(str);
+    char * result = malloc(length + 1);
+    if (result == NULL) return NULL;
+    strncpy(result, str, length);
+    result[length] = 0;
+    
+    return result;
+}
+
+// Can we use DISPATCH_CURRENT_QUEUE_LABEL ?
+// Can we use dispatch_get_current_queue (without it crashing) ?
+//
+// a) Compiling against newer SDK's (iOS 7+/OS X 10.9+) where DISPATCH_CURRENT_QUEUE_LABEL is defined
+//    on a (iOS 7.0+/OS X 10.9+) runtime version
+//
+// b) Systems where dispatch_get_current_queue is not yet deprecated and won't crash (< iOS 6.0/OS X 10.9)
+//
+//    dispatch_get_current_queue(void);
+//      __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_6,__MAC_10_9,__IPHONE_4_0,__IPHONE_6_0)
+
+#if TARGET_OS_IPHONE
+
+  // Compiling for iOS
+
+    #define USE_DISPATCH_CURRENT_QUEUE_LABEL ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
+    #define USE_DISPATCH_GET_CURRENT_QUEUE ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.1)
+
+#else
+
+  // Compiling for Mac OS X
+
+  #ifndef MAC_OS_X_VERSION_10_9
+    #define MAC_OS_X_VERSION_10_9 1090
+  #endif
+
+  #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9 // Mac OS X 10.9 or later required
+
+    #define USE_DISPATCH_CURRENT_QUEUE_LABEL  YES
+    #define USE_DISPATCH_GET_CURRENT_QUEUE    NO
+
+  #else
+
+    #define USE_DISPATCH_CURRENT_QUEUE_LABEL ([NSTimer instancesRespondToSelector:@selector(tolerance)]) // OS X 10.9+
+    #define USE_DISPATCH_GET_CURRENT_QUEUE  (![NSTimer instancesRespondToSelector:@selector(tolerance)]) // < OS X 10.9
+
+  #endif
+
+#endif
+
+- (instancetype)initWithLogMsg:(NSString *)msg
+                         level:(int)level
+                          flag:(int)flag
+                       context:(int)context
+                          file:(const char *)aFile
+                      function:(const char *)aFunction
+                          line:(int)line
+                           tag:(id)aTag
+                       options:(DDLogMessageOptions)optionsMask
+{
+  return [self initWithLogMsg:msg
+                        level:level
+                         flag:flag
+                      context:context
+                         file:aFile
+                     function:aFunction
+                         line:line
+                          tag:aTag
+                      options:optionsMask
+                    timestamp:nil];
+}
+
+- (instancetype)initWithLogMsg:(NSString *)msg
+                         level:(int)level
+                          flag:(int)flag
+                       context:(int)context
+                          file:(const char *)aFile
+                      function:(const char *)aFunction
+                          line:(int)line
+                           tag:(id)aTag
+                       options:(DDLogMessageOptions)optionsMask
+                     timestamp:(NSDate *)aTimestamp
+{
+  if ((self = [super init]))
+  {
+    logMsg     = msg;
+    logLevel   = level;
+    logFlag    = flag;
+    logContext = context;
+    lineNumber = line;
+    tag        = aTag;
+    options    = optionsMask;
+
+    if (options & DDLogMessageCopyFile)
+      file = dd_str_copy(aFile);
+    else
+      file = (char *)aFile;
+
+    if (options & DDLogMessageCopyFunction)
+      function = dd_str_copy(aFunction);
+    else
+      function = (char *)aFunction;
+
+    timestamp = aTimestamp;
+    if(timestamp == nil)
+      timestamp = [[NSDate alloc] init];
+
+    machThreadID = pthread_mach_thread_np(pthread_self());
+
+    // Try to get the current queue's label
+
+    if (USE_DISPATCH_CURRENT_QUEUE_LABEL)
+	{
+		queueLabel = dd_str_copy(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL));
+	}
+	else if (USE_DISPATCH_GET_CURRENT_QUEUE)
+	{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+		dispatch_queue_t currentQueue = dispatch_get_current_queue();
+#pragma clang diagnostic pop
+
+		queueLabel = dd_str_copy(dispatch_queue_get_label(currentQueue));
+	}
+	else
+	{
+		queueLabel = dd_str_copy(""); // iOS 6.x only
+	}
+
+    threadName = [[NSThread currentThread] name];
+  }
+  return self;
+}
+
+- (NSString *)threadID
+{
+    return [[NSString alloc] initWithFormat:@"%x", machThreadID];
+}
+
+- (NSString *)fileName
+{
+    return DDExtractFileNameWithoutExtension(file, NO);
+}
+
+- (NSString *)methodName
+{
+    if (function == NULL)
+        return nil;
+    else
+        return [[NSString alloc] initWithUTF8String:function];
+}
+
+- (void)dealloc
+{
+    if (file && (options & DDLogMessageCopyFile))
+        free(file);
+
+    if (function && (options & DDLogMessageCopyFunction))
+        free(function);
+    
+    free(queueLabel);
+}
+
+
+- (id)copyWithZone:(NSZone *)zone {
+    DDLogMessage *newMessage = [[DDLogMessage alloc] init];
+    
+    newMessage->logLevel = self->logLevel;
+    newMessage->logFlag = self->logFlag;
+    newMessage->logContext = self->logContext;
+    newMessage->logMsg = self->logMsg;
+    newMessage->timestamp = self->timestamp;
+    
+    if (self->options & DDLogMessageCopyFile) {
+        newMessage->file = dd_str_copy(self->file);
+        newMessage->function = dd_str_copy(self->function);
+    } else {
+        newMessage->file = self->file;
+        newMessage->function = self->function;
+    }
+    
+    newMessage->lineNumber = self->lineNumber;
+    
+    newMessage->machThreadID = self->machThreadID;
+    newMessage->queueLabel = dd_str_copy(self->queueLabel);
+    newMessage->threadName = self->threadName;
+    newMessage->tag = self->tag;
+    newMessage->options = self->options;
+    
+    return newMessage;
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation DDAbstractLogger
+
+- (id)init
+{
+    if ((self = [super init]))
+    {
+        const char *loggerQueueName = NULL;
+        if ([self respondsToSelector:@selector(loggerName)])
+        {
+            loggerQueueName = [[self loggerName] UTF8String];
+        }
+        
+        loggerQueue = dispatch_queue_create(loggerQueueName, NULL);
+        
+        // We're going to use dispatch_queue_set_specific() to "mark" our loggerQueue.
+        // Later we can use dispatch_get_specific() to determine if we're executing on our loggerQueue.
+        // The documentation states:
+        //
+        // > Keys are only compared as pointers and are never dereferenced.
+        // > Thus, you can use a pointer to a static variable for a specific subsystem or
+        // > any other value that allows you to identify the value uniquely.
+        // > Specifying a pointer to a string constant is not recommended.
+        //
+        // So we're going to use the very convenient key of "self",
+        // which also works when multiple logger classes extend this class, as each will have a different "self" key.
+        //
+        // This is used primarily for thread-safety assertions (via the isOnInternalLoggerQueue method below).
+        
+        void *key = (__bridge void *)self;
+        void *nonNullValue = (__bridge void *)self;
+        
+        dispatch_queue_set_specific(loggerQueue, key, nonNullValue, NULL);
+    }
+    return self;
+}
+
+- (void)dealloc
+{
+    #if !OS_OBJECT_USE_OBJC
+    if (loggerQueue) dispatch_release(loggerQueue);
+    #endif
+}
+
+- (void)logMessage:(DDLogMessage *)logMessage
+{
+    // Override me
+}
+
+- (id <DDLogFormatter>)logFormatter
+{
+    // This method must be thread safe and intuitive.
+    // Therefore if somebody executes the following code:
+    // 
+    // [logger setLogFormatter:myFormatter];
+    // formatter = [logger logFormatter];
+    // 
+    // They would expect formatter to equal myFormatter.
+    // This functionality must be ensured by the getter and setter method.
+    //
+    // The thread safety must not come at a cost to the performance of the logMessage method.
+    // This method is likely called sporadically, while the logMessage method is called repeatedly.
+    // This means, the implementation of this method:
+    // - Must NOT require the logMessage method to acquire a lock.
+    // - Must NOT require the logMessage method to access an atomic property (also a lock of sorts).
+    //
+    // Thread safety is ensured by executing access to the formatter variable on the loggerQueue.
+    // This is the same queue that the logMessage method operates on.
+    //
+    // Note: The last time I benchmarked the performance of direct access vs atomic property access,
+    // direct access was over twice as fast on the desktop and over 6 times as fast on the iPhone.
+    // 
+    // Furthermore, consider the following code:
+    //
+    // DDLogVerbose(@"log msg 1");
+    // DDLogVerbose(@"log msg 2");
+    // [logger setFormatter:myFormatter];
+    // DDLogVerbose(@"log msg 3");
+    //
+    // Our intuitive requirement means that the new formatter will only apply to the 3rd log message.
+    // This must remain true even when using asynchronous logging.
+    // We must keep in mind the various queue's that are in play here:
+    // 
+    // loggerQueue : Our own private internal queue that the logMessage method runs on.
+    //               Operations are added to this queue from the global loggingQueue.
+    // 
+    // globalLoggingQueue : The queue that all log messages go through before they arrive in our loggerQueue.
+    // 
+    // All log statements go through the serial gloabalLoggingQueue before they arrive at our loggerQueue.
+    // Thus this method also goes through the serial globalLoggingQueue to ensure intuitive operation.
+    
+    // IMPORTANT NOTE:
+    // 
+    // Methods within the DDLogger implementation MUST access the formatter ivar directly.
+    // This method is designed explicitly for external access.
+    //
+    // Using "self." syntax to go through this method will cause immediate deadlock.
+    // This is the intended result. Fix it by accessing the ivar directly.
+    // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
+    
+    NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+    NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax.");
+    
+    dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+    
+    __block id <DDLogFormatter> result;
+    
+    dispatch_sync(globalLoggingQueue, ^{
+        dispatch_sync(loggerQueue, ^{
+            result = formatter;
+        });
+    });
+    
+    return result;
+}
+
+- (void)setLogFormatter:(id <DDLogFormatter>)logFormatter
+{
+    // The design of this method is documented extensively in the logFormatter message (above in code).
+    
+    NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+    NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax.");
+    
+    dispatch_block_t block = ^{ @autoreleasepool {
+        
+        if (formatter != logFormatter)
+        {
+            if ([formatter respondsToSelector:@selector(willRemoveFromLogger:)]) {
+                [formatter willRemoveFromLogger:self];
+            }
+            
+            formatter = logFormatter;
+            
+            if ([formatter respondsToSelector:@selector(didAddToLogger:)]) {
+                [formatter didAddToLogger:self];
+            }
+        }
+    }};
+    
+    dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+    
+    dispatch_async(globalLoggingQueue, ^{
+        dispatch_async(loggerQueue, block);
+    });
+}
+
+- (dispatch_queue_t)loggerQueue
+{
+    return loggerQueue;
+}
+
+- (NSString *)loggerName
+{
+    return NSStringFromClass([self class]);
+}
+
+- (BOOL)isOnGlobalLoggingQueue
+{
+    return (dispatch_get_specific(GlobalLoggingQueueIdentityKey) != NULL);
+}
+
+- (BOOL)isOnInternalLoggerQueue
+{
+    void *key = (__bridge void *)self;
+    return (dispatch_get_specific(key) != NULL);
+}
+
+@end
diff --git a/Lumberjack/DDTTYLogger.h b/Lumberjack/DDTTYLogger.h
new file mode 100755
index 0000000..c76f7a5
--- /dev/null
+++ b/Lumberjack/DDTTYLogger.h
@@ -0,0 +1,188 @@
+#import <Foundation/Foundation.h>
+#if TARGET_OS_IPHONE
+#import <UIKit/UIColor.h>   // iOS
+#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)
+#import <AppKit/NSColor.h>  // OS X with AppKit
+#else
+#import "CLIColor.h"        // OS X without AppKit
+#endif
+
+#import "DDLog.h"
+
+#define LOG_CONTEXT_ALL INT_MAX
+
+/**
+ * Welcome to Cocoa Lumberjack!
+ * 
+ * The project page has a wealth of documentation if you have any questions.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack
+ * 
+ * If you're new to the project you may wish to read the "Getting Started" wiki.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted
+ * 
+ * 
+ * This class provides a logger for Terminal output or Xcode console output,
+ * depending on where you are running your code.
+ * 
+ * As described in the "Getting Started" page,
+ * the traditional NSLog() function directs it's output to two places:
+ * 
+ * - Apple System Log (so it shows up in Console.app)
+ * - StdErr (if stderr is a TTY, so log statements show up in Xcode console)
+ * 
+ * To duplicate NSLog() functionality you can simply add this logger and an asl logger.
+ * However, if you instead choose to use file logging (for faster performance),
+ * you may choose to use only a file logger and a tty logger.
+**/
+
+@interface DDTTYLogger : DDAbstractLogger <DDLogger>
+{
+    NSUInteger calendarUnitFlags;
+    
+    NSString *appName;
+    char *app;
+    size_t appLen;
+    
+    NSString *processID;
+    char *pid;
+    size_t pidLen;
+    
+    BOOL colorsEnabled;
+    NSMutableArray *colorProfilesArray;
+    NSMutableDictionary *colorProfilesDict;
+}
+
++ (instancetype)sharedInstance;
+
+/* Inherited from the DDLogger protocol:
+ * 
+ * Formatters may optionally be added to any logger.
+ * 
+ * If no formatter is set, the logger simply logs the message as it is given in logMessage,
+ * or it may use its own built in formatting style.
+ * 
+ * More information about formatters can be found here:
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters
+ * 
+ * The actual implementation of these methods is inherited from DDAbstractLogger.
+
+- (id <DDLogFormatter>)logFormatter;
+- (void)setLogFormatter:(id <DDLogFormatter>)formatter;
+ 
+*/
+
+/**
+ * Want to use different colors for different log levels?
+ * Enable this property.
+ * 
+ * If you run the application via the Terminal (not Xcode),
+ * the logger will map colors to xterm-256color or xterm-color (if available).
+ * 
+ * Xcode does NOT natively support colors in the Xcode debugging console.
+ * You'll need to install the XcodeColors plugin to see colors in the Xcode console.
+ * https://github.com/robbiehanson/XcodeColors
+ * 
+ * The default value is NO.
+**/
+@property (readwrite, assign) BOOL colorsEnabled;
+
+/**
+ * When using a custom formatter you can set the logMessage method not to append
+ * '\n' character after each output. This allows for some greater flexibility with
+ * custom formatters. Default value is YES.
+ **/
+
+@property (readwrite, assign) BOOL automaticallyAppendNewlineForCustomFormatters;
+
+/**
+ * The default color set (foregroundColor, backgroundColor) is:
+ * 
+ * - LOG_FLAG_ERROR = (red, nil)
+ * - LOG_FLAG_WARN  = (orange, nil)
+ * 
+ * You can customize the colors however you see fit.
+ * Please note that you are passing a flag, NOT a level.
+ * 
+ * GOOD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_FLAG_INFO];  // <- Good :)
+ *  BAD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_LEVEL_INFO]; // <- BAD! :(
+ * 
+ * LOG_FLAG_INFO  = 0...00100
+ * LOG_LEVEL_INFO = 0...00111 <- Would match LOG_FLAG_INFO and LOG_FLAG_WARN and LOG_FLAG_ERROR
+ * 
+ * If you run the application within Xcode, then the XcodeColors plugin is required.
+ * 
+ * If you run the application from a shell, then DDTTYLogger will automatically map the given color to
+ * the closest available color. (xterm-256color or xterm-color which have 256 and 16 supported colors respectively.)
+ * 
+ * This method invokes setForegroundColor:backgroundColor:forFlag:context: and applies it to `LOG_CONTEXT_ALL`.
+**/
+#if TARGET_OS_IPHONE
+- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask;
+#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)
+- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask;
+#else
+- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask;
+#endif
+
+/**
+ * Just like setForegroundColor:backgroundColor:flag, but allows you to specify a particular logging context.
+ * 
+ * A logging context is often used to identify log messages coming from a 3rd party framework,
+ * although logging context's can be used for many different functions.
+ * 
+ * Use LOG_CONTEXT_ALL to set the deafult color for all contexts that have no specific color set defined.
+ * 
+ * Logging context's are explained in further detail here:
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomContext
+**/
+#if TARGET_OS_IPHONE
+- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask context:(int)ctxt;
+#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)
+- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask context:(int)ctxt;
+#else
+- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forFlag:(int)mask context:(int)ctxt;
+#endif
+
+/**
+ * Similar to the methods above, but allows you to map DDLogMessage->tag to a particular color profile.
+ * For example, you could do something like this:
+ * 
+ * static NSString *const PurpleTag = @"PurpleTag";
+ * 
+ * #define DDLogPurple(frmt, ...) LOG_OBJC_TAG_MACRO(NO, 0, 0, 0, PurpleTag, frmt, ##__VA_ARGS__)
+ * 
+ * And then in your applicationDidFinishLaunching, or wherever you configure Lumberjack:
+ * 
+ * #if TARGET_OS_IPHONE
+ *   UIColor *purple = [UIColor colorWithRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];
+ * #else
+ *   NSColor *purple = [NSColor colorWithCalibratedRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0];
+ *
+ * Note: For CLI OS X projects that don't link with AppKit use CLIColor objects instead
+ * 
+ * [[DDTTYLogger sharedInstance] setForegroundColor:purple backgroundColor:nil forTag:PurpleTag];
+ * [DDLog addLogger:[DDTTYLogger sharedInstance]];
+ * 
+ * This would essentially give you a straight NSLog replacement that prints in purple:
+ * 
+ * DDLogPurple(@"I'm a purple log message!");
+**/
+#if TARGET_OS_IPHONE
+- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forTag:(id <NSCopying>)tag;
+#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)
+- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forTag:(id <NSCopying>)tag;
+#else
+- (void)setForegroundColor:(CLIColor *)txtColor backgroundColor:(CLIColor *)bgColor forTag:(id <NSCopying>)tag;
+#endif
+
+/**
+ * Clearing color profiles.
+**/
+- (void)clearColorsForFlag:(int)mask;
+- (void)clearColorsForFlag:(int)mask context:(int)context;
+- (void)clearColorsForTag:(id <NSCopying>)tag;
+- (void)clearColorsForAllFlags;
+- (void)clearColorsForAllTags;
+- (void)clearAllColors;
+
+@end
diff --git a/Lumberjack/DDTTYLogger.m b/Lumberjack/DDTTYLogger.m
new file mode 100755
index 0000000..34a1af9
--- /dev/null
+++ b/Lumberjack/DDTTYLogger.m
@@ -0,0 +1,1510 @@
+#import "DDTTYLogger.h"
+
+#import <unistd.h>
+#import <sys/uio.h>
+
+/**
+ * Welcome to Cocoa Lumberjack!
+ * 
+ * The project page has a wealth of documentation if you have any questions.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack
+ * 
+ * If you're new to the project you may wish to read the "Getting Started" wiki.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted
+**/
+
+#if ! __has_feature(objc_arc)
+#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
+#endif
+
+// We probably shouldn't be using DDLog() statements within the DDLog implementation.
+// But we still want to leave our log statements for any future debugging,
+// and to allow other developers to trace the implementation (which is a great learning tool).
+// 
+// So we use primitive logging macros around NSLog.
+// We maintain the NS prefix on the macros to be explicit about the fact that we're using NSLog.
+
+#define LOG_LEVEL 2
+
+#define NSLogError(frmt, ...)    do{ if(LOG_LEVEL >= 1) NSLog((frmt), ##__VA_ARGS__); } while(0)
+#define NSLogWarn(frmt, ...)     do{ if(LOG_LEVEL >= 2) NSLog((frmt), ##__VA_ARGS__); } while(0)
+#define NSLogInfo(frmt, ...)     do{ if(LOG_LEVEL >= 3) NSLog((frmt), ##__VA_ARGS__); } while(0)
+#define NSLogDebug(frmt, ...)    do{ if(LOG_LEVEL >= 4) NSLog((frmt), ##__VA_ARGS__); } while(0)
+#define NSLogVerbose(frmt, ...)  do{ if(LOG_LEVEL >= 5) NSLog((frmt), ##__VA_ARGS__); } while(0)
+
+// Xcode does NOT natively support colors in the Xcode debugging console.
+// You'll need to install the XcodeColors plugin to see colors in the Xcode console.
+// https://github.com/robbiehanson/XcodeColors
+// 
+// The following is documentation from the XcodeColors project:
+// 
+// 
+// How to apply color formatting to your log statements:
+// 
+// To set the foreground color:
+// Insert the ESCAPE_SEQ into your string, followed by "fg124,12,255;" where r=124, g=12, b=255.
+// 
+// To set the background color:
+// Insert the ESCAPE_SEQ into your string, followed by "bg12,24,36;" where r=12, g=24, b=36.
+// 
+// To reset the foreground color (to default value):
+// Insert the ESCAPE_SEQ into your string, followed by "fg;"
+// 
+// To reset the background color (to default value):
+// Insert the ESCAPE_SEQ into your string, followed by "bg;"
+// 
+// To reset the foreground and background color (to default values) in one operation:
+// Insert the ESCAPE_SEQ into your string, followed by ";"
+
+#define XCODE_COLORS_ESCAPE_SEQ "\033["
+
+#define XCODE_COLORS_RESET_FG  XCODE_COLORS_ESCAPE_SEQ "fg;" // Clear any foreground color
+#define XCODE_COLORS_RESET_BG  XCODE_COLORS_ESCAPE_SEQ "bg;" // Clear any background color
+#define XCODE_COLORS_RESET     XCODE_COLORS_ESCAPE_SEQ ";"   // Clear any foreground or background color
+
+// Some simple defines to make life easier on ourself
+
+#if TARGET_OS_IPHONE
+  #define OSColor UIColor
+  #define MakeColor(r, g, b) [UIColor colorWithRed:(r/255.0f) green:(g/255.0f) blue:(b/255.0f) alpha:1.0f]
+#elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)
+  #define OSColor NSColor
+  #define MakeColor(r, g, b) [NSColor colorWithCalibratedRed:(r/255.0f) green:(g/255.0f) blue:(b/255.0f) alpha:1.0f]
+#else
+  #define OSColor CLIColor
+  #define MakeColor(r, g, b) [CLIColor colorWithCalibratedRed:(r/255.0f) green:(g/255.0f) blue:(b/255.0f) alpha:1.0f]
+#endif
+
+// If running in a shell, not all RGB colors will be supported.
+// In this case we automatically map to the closest available color.
+// In order to provide this mapping, we have a hard-coded set of the standard RGB values available in the shell.
+// However, not every shell is the same, and Apple likes to think different even when it comes to shell colors.
+// 
+// Map to standard Terminal.app colors (1), or
+// map to standard xterm colors (0).
+
+#define MAP_TO_TERMINAL_APP_COLORS 1
+
+
+@interface DDTTYLoggerColorProfile : NSObject {
+@public
+    int mask;
+    int context;
+    
+    uint8_t fg_r;
+    uint8_t fg_g;
+    uint8_t fg_b;
+    
+    uint8_t bg_r;
+    uint8_t bg_g;
+    uint8_t bg_b;
+    
+    NSUInteger fgCodeIndex;
+    NSString *fgCodeRaw;
+    
+    NSUInteger bgCodeIndex;
+    NSString *bgCodeRaw;
+    
+    char fgCode[24];
+    size_t fgCodeLen;
+    
+    char bgCode[24];
+    size_t bgCodeLen;
+    
+    char resetCode[8];
+    size_t resetCodeLen;
+}
+
+- (instancetype)initWithForegroundColor:(OSColor *)fgColor backgroundColor:(OSColor *)bgColor flag:(int)mask context:(int)ctxt;
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation DDTTYLogger
+
+static BOOL isaColorTTY;
+static BOOL isaColor256TTY;
+static BOOL isaXcodeColorTTY;
+
+static NSArray *codes_fg = nil;
+static NSArray *codes_bg = nil;
+static NSArray *colors   = nil;
+
+static DDTTYLogger *sharedInstance;
+
+/**
+ * Initializes the colors array, as well as the codes_fg and codes_bg arrays, for 16 color mode.
+ * 
+ * This method is used when the application is running from within a shell that only supports 16 color mode.
+ * This method is not invoked if the application is running within Xcode, or via normal UI app launch.
+**/
++ (void)initialize_colors_16
+{
+    if (codes_fg || codes_bg || colors) return;
+    
+    NSMutableArray *m_codes_fg = [NSMutableArray arrayWithCapacity:16];
+    NSMutableArray *m_codes_bg = [NSMutableArray arrayWithCapacity:16];
+    NSMutableArray *m_colors   = [NSMutableArray arrayWithCapacity:16];
+    
+    // In a standard shell only 16 colors are supported.
+    // 
+    // More information about ansi escape codes can be found online.
+    // http://en.wikipedia.org/wiki/ANSI_escape_code
+    
+    [m_codes_fg addObject:@"30m"];   // normal - black
+    [m_codes_fg addObject:@"31m"];   // normal - red
+    [m_codes_fg addObject:@"32m"];   // normal - green
+    [m_codes_fg addObject:@"33m"];   // normal - yellow
+    [m_codes_fg addObject:@"34m"];   // normal - blue
+    [m_codes_fg addObject:@"35m"];   // normal - magenta
+    [m_codes_fg addObject:@"36m"];   // normal - cyan
+    [m_codes_fg addObject:@"37m"];   // normal - gray
+    [m_codes_fg addObject:@"1;30m"]; // bright - darkgray
+    [m_codes_fg addObject:@"1;31m"]; // bright - red
+    [m_codes_fg addObject:@"1;32m"]; // bright - green
+    [m_codes_fg addObject:@"1;33m"]; // bright - yellow
+    [m_codes_fg addObject:@"1;34m"]; // bright - blue
+    [m_codes_fg addObject:@"1;35m"]; // bright - magenta
+    [m_codes_fg addObject:@"1;36m"]; // bright - cyan
+    [m_codes_fg addObject:@"1;37m"]; // bright - white
+    
+    [m_codes_bg addObject:@"40m"];   // normal - black
+    [m_codes_bg addObject:@"41m"];   // normal - red
+    [m_codes_bg addObject:@"42m"];   // normal - green
+    [m_codes_bg addObject:@"43m"];   // normal - yellow
+    [m_codes_bg addObject:@"44m"];   // normal - blue
+    [m_codes_bg addObject:@"45m"];   // normal - magenta
+    [m_codes_bg addObject:@"46m"];   // normal - cyan
+    [m_codes_bg addObject:@"47m"];   // normal - gray
+    [m_codes_bg addObject:@"1;40m"]; // bright - darkgray
+    [m_codes_bg addObject:@"1;41m"]; // bright - red
+    [m_codes_bg addObject:@"1;42m"]; // bright - green
+    [m_codes_bg addObject:@"1;43m"]; // bright - yellow
+    [m_codes_bg addObject:@"1;44m"]; // bright - blue
+    [m_codes_bg addObject:@"1;45m"]; // bright - magenta
+    [m_codes_bg addObject:@"1;46m"]; // bright - cyan
+    [m_codes_bg addObject:@"1;47m"]; // bright - white
+    
+#if MAP_TO_TERMINAL_APP_COLORS
+    
+    // Standard Terminal.app colors:
+    // 
+    // These are the default colors used by Apple's Terminal.app.
+    
+    [m_colors addObject:MakeColor(  0,   0,   0)]; // normal - black
+    [m_colors addObject:MakeColor(194,  54,  33)]; // normal - red
+    [m_colors addObject:MakeColor( 37, 188,  36)]; // normal - green
+    [m_colors addObject:MakeColor(173, 173,  39)]; // normal - yellow
+    [m_colors addObject:MakeColor( 73,  46, 225)]; // normal - blue
+    [m_colors addObject:MakeColor(211,  56, 211)]; // normal - magenta
+    [m_colors addObject:MakeColor( 51, 187, 200)]; // normal - cyan
+    [m_colors addObject:MakeColor(203, 204, 205)]; // normal - gray
+    [m_colors addObject:MakeColor(129, 131, 131)]; // bright - darkgray
+    [m_colors addObject:MakeColor(252,  57,  31)]; // bright - red
+    [m_colors addObject:MakeColor( 49, 231,  34)]; // bright - green
+    [m_colors addObject:MakeColor(234, 236,  35)]; // bright - yellow
+    [m_colors addObject:MakeColor( 88,  51, 255)]; // bright - blue
+    [m_colors addObject:MakeColor(249,  53, 248)]; // bright - magenta
+    [m_colors addObject:MakeColor( 20, 240, 240)]; // bright - cyan
+    [m_colors addObject:MakeColor(233, 235, 235)]; // bright - white
+    
+#else
+    
+    // Standard xterm colors:
+    // 
+    // These are the default colors used by most xterm shells.
+    
+    [m_colors addObject:MakeColor(  0,   0,   0)]; // normal - black
+    [m_colors addObject:MakeColor(205,   0,   0)]; // normal - red
+    [m_colors addObject:MakeColor(  0, 205,   0)]; // normal - green
+    [m_colors addObject:MakeColor(205, 205,   0)]; // normal - yellow
+    [m_colors addObject:MakeColor(  0,   0, 238)]; // normal - blue
+    [m_colors addObject:MakeColor(205,   0, 205)]; // normal - magenta
+    [m_colors addObject:MakeColor(  0, 205, 205)]; // normal - cyan
+    [m_colors addObject:MakeColor(229, 229, 229)]; // normal - gray
+    [m_colors addObject:MakeColor(127, 127, 127)]; // bright - darkgray
+    [m_colors addObject:MakeColor(255,   0,   0)]; // bright - red
+    [m_colors addObject:MakeColor(  0, 255,   0)]; // bright - green
+    [m_colors addObject:MakeColor(255, 255,   0)]; // bright - yellow
+    [m_colors addObject:MakeColor( 92,  92, 255)]; // bright - blue
+    [m_colors addObject:MakeColor(255,   0, 255)]; // bright - magenta
+    [m_colors addObject:MakeColor(  0, 255, 255)]; // bright - cyan
+    [m_colors addObject:MakeColor(255, 255, 255)]; // bright - white
+    
+#endif
+    
+    codes_fg = [m_codes_fg copy];
+    codes_bg = [m_codes_bg copy];
+    colors   = [m_colors   copy];
+    
+    NSAssert([codes_fg count] == [codes_bg count], @"Invalid colors/codes array(s)");
+    NSAssert([codes_fg count] == [colors count],   @"Invalid colors/codes array(s)");
+}
+
+/**
+ * Initializes the colors array, as well as the codes_fg and codes_bg arrays, for 256 color mode.
+ * 
+ * This method is used when the application is running from within a shell that supports 256 color mode.
+ * This method is not invoked if the application is running within Xcode, or via normal UI app launch.
+**/
++ (void)initialize_colors_256
+{
+    if (codes_fg || codes_bg || colors) return;
+    
+    NSMutableArray *m_codes_fg = [NSMutableArray arrayWithCapacity:(256-16)];
+    NSMutableArray *m_codes_bg = [NSMutableArray arrayWithCapacity:(256-16)];
+    NSMutableArray *m_colors   = [NSMutableArray arrayWithCapacity:(256-16)];
+    
+    #if MAP_TO_TERMINAL_APP_COLORS
+    
+    // Standard Terminal.app colors:
+    // 
+    // These are the colors the Terminal.app uses in xterm-256color mode.
+    // In this mode, the terminal supports 256 different colors, specified by 256 color codes.
+    // 
+    // The first 16 color codes map to the original 16 color codes supported by the earlier xterm-color mode.
+    // These are actually configurable, and thus we ignore them for the purposes of mapping,
+    // as we can't rely on them being constant. They are largely duplicated anyway.
+    // 
+    // The next 216 color codes are designed to run the spectrum, with several shades of every color.
+    // While the color codes are standardized, the actual RGB values for each color code is not.
+    // Apple's Terminal.app uses different RGB values from that of a standard xterm.
+    // Apple's choices in colors are designed to be a little nicer on the eyes.
+    // 
+    // The last 24 color codes represent a grayscale.
+    // 
+    // Unfortunately, unlike the standard xterm color chart,
+    // Apple's RGB values cannot be calculated using a simple formula (at least not that I know of).
+    // Also, I don't know of any ways to programmatically query the shell for the RGB values.
+    // So this big giant color chart had to be made by hand.
+    // 
+    // More information about ansi escape codes can be found online.
+    // http://en.wikipedia.org/wiki/ANSI_escape_code
+    
+    // Colors
+    
+    [m_colors addObject:MakeColor( 47,  49,  49)];
+    [m_colors addObject:MakeColor( 60,  42, 144)];
+    [m_colors addObject:MakeColor( 66,  44, 183)];
+    [m_colors addObject:MakeColor( 73,  46, 222)];
+    [m_colors addObject:MakeColor( 81,  50, 253)];
+    [m_colors addObject:MakeColor( 88,  51, 255)];
+    
+    [m_colors addObject:MakeColor( 42, 128,  37)];
+    [m_colors addObject:MakeColor( 42, 127, 128)];
+    [m_colors addObject:MakeColor( 44, 126, 169)];
+    [m_colors addObject:MakeColor( 56, 125, 209)];
+    [m_colors addObject:MakeColor( 59, 124, 245)];
+    [m_colors addObject:MakeColor( 66, 123, 255)];
+    
+    [m_colors addObject:MakeColor( 51, 163,  41)];
+    [m_colors addObject:MakeColor( 39, 162, 121)];
+    [m_colors addObject:MakeColor( 42, 161, 162)];
+    [m_colors addObject:MakeColor( 53, 160, 202)];
+    [m_colors addObject:MakeColor( 45, 159, 240)];
+    [m_colors addObject:MakeColor( 58, 158, 255)];
+    
+    [m_colors addObject:MakeColor( 31, 196,  37)];
+    [m_colors addObject:MakeColor( 48, 196, 115)];
+    [m_colors addObject:MakeColor( 39, 195, 155)];
+    [m_colors addObject:MakeColor( 49, 195, 195)];
+    [m_colors addObject:MakeColor( 32, 194, 235)];
+    [m_colors addObject:MakeColor( 53, 193, 255)];
+    
+    [m_colors addObject:MakeColor( 50, 229,  35)];
+    [m_colors addObject:MakeColor( 40, 229, 109)];
+    [m_colors addObject:MakeColor( 27, 229, 149)];
+    [m_colors addObject:MakeColor( 49, 228, 189)];
+    [m_colors addObject:MakeColor( 33, 228, 228)];
+    [m_colors addObject:MakeColor( 53, 227, 255)];
+    
+    [m_colors addObject:MakeColor( 27, 254,  30)];
+    [m_colors addObject:MakeColor( 30, 254, 103)];
+    [m_colors addObject:MakeColor( 45, 254, 143)];
+    [m_colors addObject:MakeColor( 38, 253, 182)];
+    [m_colors addObject:MakeColor( 38, 253, 222)];
+    [m_colors addObject:MakeColor( 42, 253, 252)];
+    
+    [m_colors addObject:MakeColor(140,  48,  40)];
+    [m_colors addObject:MakeColor(136,  51, 136)];
+    [m_colors addObject:MakeColor(135,  52, 177)];
+    [m_colors addObject:MakeColor(134,  52, 217)];
+    [m_colors addObject:MakeColor(135,  56, 248)];
+    [m_colors addObject:MakeColor(134,  53, 255)];
+    
+    [m_colors addObject:MakeColor(125, 125,  38)];
+    [m_colors addObject:MakeColor(124, 125, 125)];
+    [m_colors addObject:MakeColor(122, 124, 166)];
+    [m_colors addObject:MakeColor(123, 124, 207)];
+    [m_colors addObject:MakeColor(123, 122, 247)];
+    [m_colors addObject:MakeColor(124, 121, 255)];
+    
+    [m_colors addObject:MakeColor(119, 160,  35)];
+    [m_colors addObject:MakeColor(117, 160, 120)];
+    [m_colors addObject:MakeColor(117, 160, 160)];
+    [m_colors addObject:MakeColor(115, 159, 201)];
+    [m_colors addObject:MakeColor(116, 158, 240)];
+    [m_colors addObject:MakeColor(117, 157, 255)];
+    
+    [m_colors addObject:MakeColor(113, 195,  39)];
+    [m_colors addObject:MakeColor(110, 194, 114)];
+    [m_colors addObject:MakeColor(111, 194, 154)];
+    [m_colors addObject:MakeColor(108, 194, 194)];
+    [m_colors addObject:MakeColor(109, 193, 234)];
+    [m_colors addObject:MakeColor(108, 192, 255)];
+    
+    [m_colors addObject:MakeColor(105, 228,  30)];
+    [m_colors addObject:MakeColor(103, 228, 109)];
+    [m_colors addObject:MakeColor(105, 228, 148)];
+    [m_colors addObject:MakeColor(100, 227, 188)];
+    [m_colors addObject:MakeColor( 99, 227, 227)];
+    [m_colors addObject:MakeColor( 99, 226, 253)];
+    
+    [m_colors addObject:MakeColor( 92, 253,  34)];
+    [m_colors addObject:MakeColor( 96, 253, 103)];
+    [m_colors addObject:MakeColor( 97, 253, 142)];
+    [m_colors addObject:MakeColor( 88, 253, 182)];
+    [m_colors addObject:MakeColor( 93, 253, 221)];
+    [m_colors addObject:MakeColor( 88, 254, 251)];
+    
+    [m_colors addObject:MakeColor(177,  53,  34)];
+    [m_colors addObject:MakeColor(174,  54, 131)];
+    [m_colors addObject:MakeColor(172,  55, 172)];
+    [m_colors addObject:MakeColor(171,  57, 213)];
+    [m_colors addObject:MakeColor(170,  55, 249)];
+    [m_colors addObject:MakeColor(170,  57, 255)];
+    
+    [m_colors addObject:MakeColor(165, 123,  37)];
+    [m_colors addObject:MakeColor(163, 123, 123)];
+    [m_colors addObject:MakeColor(162, 123, 164)];
+    [m_colors addObject:MakeColor(161, 122, 205)];
+    [m_colors addObject:MakeColor(161, 121, 241)];
+    [m_colors addObject:MakeColor(161, 121, 255)];
+    
+    [m_colors addObject:MakeColor(158, 159,  33)];
+    [m_colors addObject:MakeColor(157, 158, 118)];
+    [m_colors addObject:MakeColor(157, 158, 159)];
+    [m_colors addObject:MakeColor(155, 157, 199)];
+    [m_colors addObject:MakeColor(155, 157, 239)];
+    [m_colors addObject:MakeColor(154, 156, 255)];
+    
+    [m_colors addObject:MakeColor(152, 193,  40)];
+    [m_colors addObject:MakeColor(151, 193, 113)];
+    [m_colors addObject:MakeColor(150, 193, 153)];
+    [m_colors addObject:MakeColor(150, 192, 193)];
+    [m_colors addObject:MakeColor(148, 192, 232)];
+    [m_colors addObject:MakeColor(149, 191, 253)];
+    
+    [m_colors addObject:MakeColor(146, 227,  28)];
+    [m_colors addObject:MakeColor(144, 227, 108)];
+    [m_colors addObject:MakeColor(144, 227, 147)];
+    [m_colors addObject:MakeColor(144, 227, 187)];
+    [m_colors addObject:MakeColor(142, 226, 227)];
+    [m_colors addObject:MakeColor(142, 225, 252)];
+    
+    [m_colors addObject:MakeColor(138, 253,  36)];
+    [m_colors addObject:MakeColor(137, 253, 102)];
+    [m_colors addObject:MakeColor(136, 253, 141)];
+    [m_colors addObject:MakeColor(138, 254, 181)];
+    [m_colors addObject:MakeColor(135, 255, 220)];
+    [m_colors addObject:MakeColor(133, 255, 250)];
+    
+    [m_colors addObject:MakeColor(214,  57,  30)];
+    [m_colors addObject:MakeColor(211,  59, 126)];
+    [m_colors addObject:MakeColor(209,  57, 168)];
+    [m_colors addObject:MakeColor(208,  55, 208)];
+    [m_colors addObject:MakeColor(207,  58, 247)];
+    [m_colors addObject:MakeColor(206,  61, 255)];
+    
+    [m_colors addObject:MakeColor(204, 121,  32)];
+    [m_colors addObject:MakeColor(202, 121, 121)];
+    [m_colors addObject:MakeColor(201, 121, 161)];
+    [m_colors addObject:MakeColor(200, 120, 202)];
+    [m_colors addObject:MakeColor(200, 120, 241)];
+    [m_colors addObject:MakeColor(198, 119, 255)];
+    
+    [m_colors addObject:MakeColor(198, 157,  37)];
+    [m_colors addObject:MakeColor(196, 157, 116)];
+    [m_colors addObject:MakeColor(195, 156, 157)];
+    [m_colors addObject:MakeColor(195, 156, 197)];
+    [m_colors addObject:MakeColor(194, 155, 236)];
+    [m_colors addObject:MakeColor(193, 155, 255)];
+    
+    [m_colors addObject:MakeColor(191, 192,  36)];
+    [m_colors addObject:MakeColor(190, 191, 112)];
+    [m_colors addObject:MakeColor(189, 191, 152)];
+    [m_colors addObject:MakeColor(189, 191, 191)];
+    [m_colors addObject:MakeColor(188, 190, 230)];
+    [m_colors addObject:MakeColor(187, 190, 253)];
+    
+    [m_colors addObject:MakeColor(185, 226,  28)];
+    [m_colors addObject:MakeColor(184, 226, 106)];
+    [m_colors addObject:MakeColor(183, 225, 146)];
+    [m_colors addObject:MakeColor(183, 225, 186)];
+    [m_colors addObject:MakeColor(182, 225, 225)];
+    [m_colors addObject:MakeColor(181, 224, 252)];
+    
+    [m_colors addObject:MakeColor(178, 255,  35)];
+    [m_colors addObject:MakeColor(178, 255, 101)];
+    [m_colors addObject:MakeColor(177, 254, 141)];
+    [m_colors addObject:MakeColor(176, 254, 180)];
+    [m_colors addObject:MakeColor(176, 254, 220)];
+    [m_colors addObject:MakeColor(175, 253, 249)];
+    
+    [m_colors addObject:MakeColor(247,  56,  30)];
+    [m_colors addObject:MakeColor(245,  57, 122)];
+    [m_colors addObject:MakeColor(243,  59, 163)];
+    [m_colors addObject:MakeColor(244,  60, 204)];
+    [m_colors addObject:MakeColor(242,  59, 241)];
+    [m_colors addObject:MakeColor(240,  55, 255)];
+    
+    [m_colors addObject:MakeColor(241, 119,  36)];
+    [m_colors addObject:MakeColor(240, 120, 118)];
+    [m_colors addObject:MakeColor(238, 119, 158)];
+    [m_colors addObject:MakeColor(237, 119, 199)];
+    [m_colors addObject:MakeColor(237, 118, 238)];
+    [m_colors addObject:MakeColor(236, 118, 255)];
+    
+    [m_colors addObject:MakeColor(235, 154,  36)];
+    [m_colors addObject:MakeColor(235, 154, 114)];
+    [m_colors addObject:MakeColor(234, 154, 154)];
+    [m_colors addObject:MakeColor(232, 154, 194)];
+    [m_colors addObject:MakeColor(232, 153, 234)];
+    [m_colors addObject:MakeColor(232, 153, 255)];
+    
+    [m_colors addObject:MakeColor(230, 190,  30)];
+    [m_colors addObject:MakeColor(229, 189, 110)];
+    [m_colors addObject:MakeColor(228, 189, 150)];
+    [m_colors addObject:MakeColor(227, 189, 190)];
+    [m_colors addObject:MakeColor(227, 189, 229)];
+    [m_colors addObject:MakeColor(226, 188, 255)];
+    
+    [m_colors addObject:MakeColor(224, 224,  35)];
+    [m_colors addObject:MakeColor(223, 224, 105)];
+    [m_colors addObject:MakeColor(222, 224, 144)];
+    [m_colors addObject:MakeColor(222, 223, 184)];
+    [m_colors addObject:MakeColor(222, 223, 224)];
+    [m_colors addObject:MakeColor(220, 223, 253)];
+    
+    [m_colors addObject:MakeColor(217, 253,  28)];
+    [m_colors addObject:MakeColor(217, 253,  99)];
+    [m_colors addObject:MakeColor(216, 252, 139)];
+    [m_colors addObject:MakeColor(216, 252, 179)];
+    [m_colors addObject:MakeColor(215, 252, 218)];
+    [m_colors addObject:MakeColor(215, 251, 250)];
+    
+    [m_colors addObject:MakeColor(255,  61,  30)];
+    [m_colors addObject:MakeColor(255,  60, 118)];
+    [m_colors addObject:MakeColor(255,  58, 159)];
+    [m_colors addObject:MakeColor(255,  56, 199)];
+    [m_colors addObject:MakeColor(255,  55, 238)];
+    [m_colors addObject:MakeColor(255,  59, 255)];
+    
+    [m_colors addObject:MakeColor(255, 117,  29)];
+    [m_colors addObject:MakeColor(255, 117, 115)];
+    [m_colors addObject:MakeColor(255, 117, 155)];
+    [m_colors addObject:MakeColor(255, 117, 195)];
+    [m_colors addObject:MakeColor(255, 116, 235)];
+    [m_colors addObject:MakeColor(254, 116, 255)];
+    
+    [m_colors addObject:MakeColor(255, 152,  27)];
+    [m_colors addObject:MakeColor(255, 152, 111)];
+    [m_colors addObject:MakeColor(254, 152, 152)];
+    [m_colors addObject:MakeColor(255, 152, 192)];
+    [m_colors addObject:MakeColor(254, 151, 231)];
+    [m_colors addObject:MakeColor(253, 151, 253)];
+    
+    [m_colors addObject:MakeColor(255, 187,  33)];
+    [m_colors addObject:MakeColor(253, 187, 107)];
+    [m_colors addObject:MakeColor(252, 187, 148)];
+    [m_colors addObject:MakeColor(253, 187, 187)];
+    [m_colors addObject:MakeColor(254, 187, 227)];
+    [m_colors addObject:MakeColor(252, 186, 252)];
+    
+    [m_colors addObject:MakeColor(252, 222,  34)];
+    [m_colors addObject:MakeColor(251, 222, 103)];
+    [m_colors addObject:MakeColor(251, 222, 143)];
+    [m_colors addObject:MakeColor(250, 222, 182)];
+    [m_colors addObject:MakeColor(251, 221, 222)];
+    [m_colors addObject:MakeColor(252, 221, 252)];
+    
+    [m_colors addObject:MakeColor(251, 252,  15)];
+    [m_colors addObject:MakeColor(251, 252,  97)];
+    [m_colors addObject:MakeColor(249, 252, 137)];
+    [m_colors addObject:MakeColor(247, 252, 177)];
+    [m_colors addObject:MakeColor(247, 253, 217)];
+    [m_colors addObject:MakeColor(254, 255, 255)];
+    
+    // Grayscale
+    
+    [m_colors addObject:MakeColor( 52,  53,  53)];
+    [m_colors addObject:MakeColor( 57,  58,  59)];
+    [m_colors addObject:MakeColor( 66,  67,  67)];
+    [m_colors addObject:MakeColor( 75,  76,  76)];
+    [m_colors addObject:MakeColor( 83,  85,  85)];
+    [m_colors addObject:MakeColor( 92,  93,  94)];
+    
+    [m_colors addObject:MakeColor(101, 102, 102)];
+    [m_colors addObject:MakeColor(109, 111, 111)];
+    [m_colors addObject:MakeColor(118, 119, 119)];
+    [m_colors addObject:MakeColor(126, 127, 128)];
+    [m_colors addObject:MakeColor(134, 136, 136)];
+    [m_colors addObject:MakeColor(143, 144, 145)];
+    
+    [m_colors addObject:MakeColor(151, 152, 153)];
+    [m_colors addObject:MakeColor(159, 161, 161)];
+    [m_colors addObject:MakeColor(167, 169, 169)];
+    [m_colors addObject:MakeColor(176, 177, 177)];
+    [m_colors addObject:MakeColor(184, 185, 186)];
+    [m_colors addObject:MakeColor(192, 193, 194)];
+    
+    [m_colors addObject:MakeColor(200, 201, 202)];
+    [m_colors addObject:MakeColor(208, 209, 210)];
+    [m_colors addObject:MakeColor(216, 218, 218)];
+    [m_colors addObject:MakeColor(224, 226, 226)];
+    [m_colors addObject:MakeColor(232, 234, 234)];
+    [m_colors addObject:MakeColor(240, 242, 242)];
+    
+    // Color codes
+    
+    int index = 16;
+    
+    while (index < 256)
+    {
+        [m_codes_fg addObject:[NSString stringWithFormat:@"38;5;%dm", index]];
+        [m_codes_bg addObject:[NSString stringWithFormat:@"48;5;%dm", index]];
+        
+        index++;
+    }
+    
+    #else
+    
+    // Standard xterm colors:
+    // 
+    // These are the colors xterm shells use in xterm-256color mode.
+    // In this mode, the shell supports 256 different colors, specified by 256 color codes.
+    // 
+    // The first 16 color codes map to the original 16 color codes supported by the earlier xterm-color mode.
+    // These are generally configurable, and thus we ignore them for the purposes of mapping,
+    // as we can't rely on them being constant. They are largely duplicated anyway.
+    // 
+    // The next 216 color codes are designed to run the spectrum, with several shades of every color.
+    // The last 24 color codes represent a grayscale.
+    // 
+    // While the color codes are standardized, the actual RGB values for each color code is not.
+    // However most standard xterms follow a well known color chart,
+    // which can easily be calculated using the simple formula below.
+    // 
+    // More information about ansi escape codes can be found online.
+    // http://en.wikipedia.org/wiki/ANSI_escape_code
+    
+    int index = 16;
+    
+    int r; // red
+    int g; // green
+    int b; // blue
+    
+    int ri; // r increment
+    int gi; // g increment
+    int bi; // b increment
+    
+    // Calculate xterm colors (using standard algorithm)
+    
+    int r = 0;
+    int g = 0;
+    int b = 0;
+    
+    for (ri = 0; ri < 6; ri++)
+    {
+        r = (ri == 0) ? 0 : 95 + (40 * (ri - 1));
+        
+        for (gi = 0; gi < 6; gi++)
+        {
+            g = (gi == 0) ? 0 : 95 + (40 * (gi - 1));
+            
+            for (bi = 0; bi < 6; bi++)
+            {
+                b = (bi == 0) ? 0 : 95 + (40 * (bi - 1));
+                
+                [m_codes_fg addObject:[NSString stringWithFormat:@"38;5;%dm", index]];
+                [m_codes_bg addObject:[NSString stringWithFormat:@"48;5;%dm", index]];
+                [m_colors addObject:MakeColor(r, g, b)];
+                
+                index++;
+            }
+        }
+    }
+    
+    // Calculate xterm grayscale (using standard algorithm)
+    
+    r = 8;
+    g = 8;
+    b = 8;
+    
+    while (index < 256)
+    {
+        [m_codes_fg addObject:[NSString stringWithFormat:@"38;5;%dm", index]];
+        [m_codes_bg addObject:[NSString stringWithFormat:@"48;5;%dm", index]];
+        [m_colors addObject:MakeColor(r, g, b)];
+        
+        r += 10;
+        g += 10;
+        b += 10;
+        
+        index++;
+    }
+    
+    #endif
+    
+    codes_fg = [m_codes_fg copy];
+    codes_bg = [m_codes_bg copy];
+    colors   = [m_colors   copy];
+             
+    NSAssert([codes_fg count] == [codes_bg count], @"Invalid colors/codes array(s)");
+    NSAssert([codes_fg count] == [colors count],   @"Invalid colors/codes array(s)");
+}
+
++ (void)getRed:(CGFloat *)rPtr green:(CGFloat *)gPtr blue:(CGFloat *)bPtr fromColor:(OSColor *)color
+{
+    #if TARGET_OS_IPHONE
+    
+    // iOS
+    
+    BOOL done = NO;
+    
+    if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)])
+    {
+        done = [color getRed:rPtr green:gPtr blue:bPtr alpha:NULL];
+    }
+    
+    if (!done)
+    {
+        // The method getRed:green:blue:alpha: was only available starting iOS 5.
+        // So in iOS 4 and earlier, we have to jump through hoops.
+        
+        CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
+        
+        unsigned char pixel[4];
+        CGContextRef context = CGBitmapContextCreate(&pixel, 1, 1, 8, 4, rgbColorSpace, kCGBitmapAlphaInfoMask & kCGImageAlphaNoneSkipLast);
+        
+        CGContextSetFillColorWithColor(context, [color CGColor]);
+        CGContextFillRect(context, CGRectMake(0, 0, 1, 1));
+        
+        if (rPtr) { *rPtr = pixel[0] / 255.0f; }
+        if (gPtr) { *gPtr = pixel[1] / 255.0f; }
+        if (bPtr) { *bPtr = pixel[2] / 255.0f; }
+        
+        CGContextRelease(context);
+        CGColorSpaceRelease(rgbColorSpace);
+    }
+    
+    #elif !defined (COCOAPODS_POD_AVAILABLE_CocoaLumberjack_CLI)
+    
+    // OS X with AppKit
+    
+    NSColor *safeColor = [color colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
+    
+    [safeColor getRed:rPtr green:gPtr blue:bPtr alpha:NULL];
+    
+    #else
+    
+    // OS X without AppKit
+    
+    [color getRed:rPtr green:gPtr blue:bPtr alpha:NULL];
+    
+    #endif
+}
+
+/**
+ * Maps the given color to the closest available color supported by the shell.
+ * The shell may support 256 colors, or only 16.
+ * 
+ * This method loops through the known supported color set, and calculates the closest color.
+ * The array index of that color, within the colors array, is then returned.
+ * This array index may also be used as the index within the codes_fg and codes_bg arrays.
+**/
++ (NSUInteger)codeIndexForColor:(OSColor *)inColor
+{
+    CGFloat inR, inG, inB;
+    [self getRed:&inR green:&inG blue:&inB fromColor:inColor];
+    
+    NSUInteger bestIndex = 0;
+    CGFloat lowestDistance = 100.0f;
+    
+    NSUInteger i = 0;
+    for (OSColor *color in colors)
+    {
+        // Calculate Euclidean distance (lower value means closer to given color)
+        
+        CGFloat r, g, b;
+        [self getRed:&r green:&g blue:&b fromColor:color];
+        
+    #if CGFLOAT_IS_DOUBLE
+        CGFloat distance = sqrt(pow(r-inR, 2.0) + pow(g-inG, 2.0) + pow(b-inB, 2.0));
+    #else
+        CGFloat distance = sqrtf(powf(r-inR, 2.0f) + powf(g-inG, 2.0f) + powf(b-inB, 2.0f));
+    #endif
+        
+        NSLogVerbose(@"DDTTYLogger: %3lu : %.3f,%.3f,%.3f & %.3f,%.3f,%.3f = %.6f",
+                     (unsigned long)i, inR, inG, inB, r, g, b, distance);
+        
+        if (distance < lowestDistance)
+        {
+            bestIndex = i;
+            lowestDistance = distance;
+            
+            NSLogVerbose(@"DDTTYLogger: New best index = %lu", (unsigned long)bestIndex);
+        }
+        
+        i++;
+    }
+    
+    return bestIndex;
+}
+
++ (instancetype)sharedInstance
+{
+    static dispatch_once_t DDTTYLoggerOnceToken;
+    dispatch_once(&DDTTYLoggerOnceToken, ^{
+        
+        
+        // Xcode does NOT natively support colors in the Xcode debugging console.
+        // You'll need to install the XcodeColors plugin to see colors in the Xcode console.
+        //
+        // PS - Please read the header file before diving into the source code.
+        
+        char *xcode_colors = getenv("XcodeColors");
+        char *term = getenv("TERM");
+        
+        if (xcode_colors && (strcmp(xcode_colors, "YES") == 0))
+        {
+            isaXcodeColorTTY = YES;
+        }
+        else if (term)
+        {
+            if (strcasestr(term, "color") != NULL)
+            {
+                isaColorTTY = YES;
+                isaColor256TTY = (strcasestr(term, "256") != NULL);
+                
+                if (isaColor256TTY)
+                    [self initialize_colors_256];
+                else
+                    [self initialize_colors_16];
+            }
+        }
+        
+        NSLogInfo(@"DDTTYLogger: isaColorTTY = %@", (isaColorTTY ? @"YES" : @"NO"));
+        NSLogInfo(@"DDTTYLogger: isaColor256TTY: %@", (isaColor256TTY ? @"YES" : @"NO"));
+        NSLogInfo(@"DDTTYLogger: isaXcodeColorTTY: %@", (isaXcodeColorTTY ? @"YES" : @"NO"));
+        
+        sharedInstance = [[[self class] alloc] init];
+    });
+    
+    return sharedInstance;
+}
+
+- (id)init
+{
+    if (sharedInstance != nil)
+    {
+        return nil;
+    }
+    
+    if ((self = [super init]))
+    {        
+        calendarUnitFlags = (NSCalendarUnitYear     |
+                             NSCalendarUnitMonth    |
+                             NSCalendarUnitDay      |
+                             NSCalendarUnitHour     |
+                             NSCalendarUnitMinute   |
+                             NSCalendarUnitSecond);
+        
+        // Initialze 'app' variable (char *)
+        
+        appName = [[NSProcessInfo processInfo] processName];
+        
+        appLen = [appName lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
+        if (appLen == 0) {
+            appName = @"<UnnamedApp>";
+            appLen = [appName lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
+        }
+        app = (char *)malloc(appLen + 1);
+        if (app == NULL) return nil;
+        
+        BOOL processedAppName = [appName getCString:app maxLength:(appLen+1) encoding:NSUTF8StringEncoding];
+        if (NO == processedAppName) return nil;
+
+        // Initialize 'pid' variable (char *)
+        
+        processID = [NSString stringWithFormat:@"%i", (int)getpid()];
+        
+        pidLen = [processID lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
+        pid = (char *)malloc(pidLen + 1);
+        if (pid == NULL) return nil;
+        
+        BOOL processedID = [processID getCString:pid maxLength:(pidLen+1) encoding:NSUTF8StringEncoding];
+        if (NO == processedID) return nil;
+        
+        // Initialize color stuff
+        
+        colorsEnabled = NO;
+        colorProfilesArray = [[NSMutableArray alloc] initWithCapacity:8];
+        colorProfilesDict = [[NSMutableDictionary alloc] initWithCapacity:8];
+        
+        _automaticallyAppendNewlineForCustomFormatters = YES;
+    }
+    return self;
+}
+
+- (void)loadDefaultColorProfiles
+{
+    [self setForegroundColor:MakeColor(214,  57,  30) backgroundColor:nil forFlag:LOG_FLAG_ERROR];
+    [self setForegroundColor:MakeColor(204, 121,  32) backgroundColor:nil forFlag:LOG_FLAG_WARN];
+}
+
+- (BOOL)colorsEnabled
+{
+    // The design of this method is taken from the DDAbstractLogger implementation.
+    // For extensive documentation please refer to the DDAbstractLogger implementation.
+    
+    // Note: The internal implementation MUST access the colorsEnabled variable directly,
+    // This method is designed explicitly for external access.
+    //
+    // Using "self." syntax to go through this method will cause immediate deadlock.
+    // This is the intended result. Fix it by accessing the ivar directly.
+    // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
+    
+    NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+    NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax.");
+    
+    dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+    
+    __block BOOL result;
+    
+    dispatch_sync(globalLoggingQueue, ^{
+        dispatch_sync(loggerQueue, ^{
+            result = colorsEnabled;
+        });
+    });
+    
+    return result;
+}
+
+- (void)setColorsEnabled:(BOOL)newColorsEnabled
+{
+    dispatch_block_t block = ^{ @autoreleasepool {
+        
+        colorsEnabled = newColorsEnabled;
+        
+        if ([colorProfilesArray count] == 0) {
+            [self loadDefaultColorProfiles];
+        }
+    }};
+    
+    // The design of this method is taken from the DDAbstractLogger implementation.
+    // For extensive documentation please refer to the DDAbstractLogger implementation.
+    
+    // Note: The internal implementation MUST access the colorsEnabled variable directly,
+    // This method is designed explicitly for external access.
+    //
+    // Using "self." syntax to go through this method will cause immediate deadlock.
+    // This is the intended result. Fix it by accessing the ivar directly.
+    // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
+    
+    NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+    NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax.");
+    
+    dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+    
+    dispatch_async(globalLoggingQueue, ^{
+        dispatch_async(loggerQueue, block);
+    });
+}
+
+- (void)setForegroundColor:(OSColor *)txtColor backgroundColor:(OSColor *)bgColor forFlag:(int)mask
+{
+    [self setForegroundColor:txtColor backgroundColor:bgColor forFlag:mask context:LOG_CONTEXT_ALL];
+}
+
+- (void)setForegroundColor:(OSColor *)txtColor backgroundColor:(OSColor *)bgColor forFlag:(int)mask context:(int)ctxt
+{
+    dispatch_block_t block = ^{ @autoreleasepool {
+        
+        DDTTYLoggerColorProfile *newColorProfile =
+            [[DDTTYLoggerColorProfile alloc] initWithForegroundColor:txtColor
+                                                     backgroundColor:bgColor
+                                                                flag:mask
+                                                             context:ctxt];
+        
+        NSLogInfo(@"DDTTYLogger: newColorProfile: %@", newColorProfile);
+        
+        NSUInteger i = 0;
+        for (DDTTYLoggerColorProfile *colorProfile in colorProfilesArray)
+        {
+            if ((colorProfile->mask == mask) && (colorProfile->context == ctxt))
+            {
+                break;
+            }
+            
+            i++;
+        }
+        
+        if (i < [colorProfilesArray count])
+            [colorProfilesArray replaceObjectAtIndex:i withObject:newColorProfile];
+        else
+            [colorProfilesArray addObject:newColorProfile];
+    }};
+    
+    // The design of the setter logic below is taken from the DDAbstractLogger implementation.
+    // For documentation please refer to the DDAbstractLogger implementation.
+    
+    if ([self isOnInternalLoggerQueue])
+    {
+        block();
+    }
+    else
+    {
+        dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+        NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+        
+        dispatch_async(globalLoggingQueue, ^{
+            dispatch_async(loggerQueue, block);
+        });
+    }
+}
+
+- (void)setForegroundColor:(OSColor *)txtColor backgroundColor:(OSColor *)bgColor forTag:(id <NSCopying>)tag
+{
+    NSAssert([(id <NSObject>)tag conformsToProtocol:@protocol(NSCopying)], @"Invalid tag");
+    
+    dispatch_block_t block = ^{ @autoreleasepool {
+        
+        DDTTYLoggerColorProfile *newColorProfile =
+            [[DDTTYLoggerColorProfile alloc] initWithForegroundColor:txtColor
+                                                     backgroundColor:bgColor
+                                                                flag:0
+                                                             context:0];
+        
+        NSLogInfo(@"DDTTYLogger: newColorProfile: %@", newColorProfile);
+        
+        [colorProfilesDict setObject:newColorProfile forKey:tag];
+    }};
+    
+    // The design of the setter logic below is taken from the DDAbstractLogger implementation.
+    // For documentation please refer to the DDAbstractLogger implementation.
+    
+    if ([self isOnInternalLoggerQueue])
+    {
+        block();
+    }
+    else
+    {
+        dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+        NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+        
+        dispatch_async(globalLoggingQueue, ^{
+            dispatch_async(loggerQueue, block);
+        });
+    }
+}
+
+- (void)clearColorsForFlag:(int)mask
+{
+    [self clearColorsForFlag:mask context:0];
+}
+
+- (void)clearColorsForFlag:(int)mask context:(int)context
+{
+    dispatch_block_t block = ^{ @autoreleasepool {
+        
+        NSUInteger i = 0;
+        for (DDTTYLoggerColorProfile *colorProfile in colorProfilesArray)
+        {
+            if ((colorProfile->mask == mask) && (colorProfile->context == context))
+            {
+                break;
+            }
+            
+            i++;
+        }
+        
+        if (i < [colorProfilesArray count])
+        {
+            [colorProfilesArray removeObjectAtIndex:i];
+        }
+    }};
+    
+    // The design of the setter logic below is taken from the DDAbstractLogger implementation.
+    // For documentation please refer to the DDAbstractLogger implementation.
+    
+    if ([self isOnInternalLoggerQueue])
+    {
+        block();
+    }
+    else
+    {
+        dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+        NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+        
+        dispatch_async(globalLoggingQueue, ^{
+            dispatch_async(loggerQueue, block);
+        });
+    }
+}
+
+- (void)clearColorsForTag:(id <NSCopying>)tag
+{
+    NSAssert([(id <NSObject>)tag conformsToProtocol:@protocol(NSCopying)], @"Invalid tag");
+    
+    dispatch_block_t block = ^{ @autoreleasepool {
+        
+        [colorProfilesDict removeObjectForKey:tag];
+    }};
+    
+    // The design of the setter logic below is taken from the DDAbstractLogger implementation.
+    // For documentation please refer to the DDAbstractLogger implementation.
+    
+    if ([self isOnInternalLoggerQueue])
+    {
+        block();
+    }
+    else
+    {
+        dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+        NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+        
+        dispatch_async(globalLoggingQueue, ^{
+            dispatch_async(loggerQueue, block);
+        });
+    }
+}
+
+- (void)clearColorsForAllFlags
+{
+    dispatch_block_t block = ^{ @autoreleasepool {
+        
+        [colorProfilesArray removeAllObjects];
+    }};
+    
+    // The design of the setter logic below is taken from the DDAbstractLogger implementation.
+    // For documentation please refer to the DDAbstractLogger implementation.
+    
+    if ([self isOnInternalLoggerQueue])
+    {
+        block();
+    }
+    else
+    {
+        dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+        NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+        
+        dispatch_async(globalLoggingQueue, ^{
+            dispatch_async(loggerQueue, block);
+        });
+    }
+}
+
+- (void)clearColorsForAllTags
+{
+    dispatch_block_t block = ^{ @autoreleasepool {
+        
+        [colorProfilesDict removeAllObjects];
+    }};
+    
+    // The design of the setter logic below is taken from the DDAbstractLogger implementation.
+    // For documentation please refer to the DDAbstractLogger implementation.
+    
+    if ([self isOnInternalLoggerQueue])
+    {
+        block();
+    }
+    else
+    {
+        dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+        NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+        
+        dispatch_async(globalLoggingQueue, ^{
+            dispatch_async(loggerQueue, block);
+        });
+    }
+}
+
+- (void)clearAllColors
+{
+    dispatch_block_t block = ^{ @autoreleasepool {
+        
+        [colorProfilesArray removeAllObjects];
+        [colorProfilesDict removeAllObjects];
+    }};
+    
+    // The design of the setter logic below is taken from the DDAbstractLogger implementation.
+    // For documentation please refer to the DDAbstractLogger implementation.
+    
+    if ([self isOnInternalLoggerQueue])
+    {
+        block();
+    }
+    else
+    {
+        dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue];
+        NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure");
+        
+        dispatch_async(globalLoggingQueue, ^{
+            dispatch_async(loggerQueue, block);
+        });
+    }
+}
+
+- (void)logMessage:(DDLogMessage *)logMessage
+{
+    NSString *logMsg = logMessage->logMsg;
+    BOOL isFormatted = NO;
+    
+    if (formatter)
+    {
+        logMsg = [formatter formatLogMessage:logMessage];
+        isFormatted = logMsg != logMessage->logMsg;
+    }
+    
+    if (logMsg)
+    {
+        // Search for a color profile associated with the log message
+        
+        DDTTYLoggerColorProfile *colorProfile = nil;
+        
+        if (colorsEnabled)
+        {
+            if (logMessage->tag)
+            {
+                colorProfile = [colorProfilesDict objectForKey:logMessage->tag];
+            }
+            if (colorProfile == nil)
+            {
+                for (DDTTYLoggerColorProfile *cp in colorProfilesArray)
+                {
+                    if (logMessage->logFlag & cp->mask)
+                    {
+                        // Color profile set for this context?
+                        if (logMessage->logContext == cp->context)
+                        {
+                            colorProfile = cp;
+                            
+                            // Stop searching
+                            break;
+                        }
+                        
+                        // Check if LOG_CONTEXT_ALL was specified as a default color for this flag
+                        if (cp->context == LOG_CONTEXT_ALL)
+                        {
+                            colorProfile = cp;
+                            
+                            // We don't break to keep searching for more specific color profiles for the context
+                        }
+                    }
+                }
+            }
+        }
+        
+        // Convert log message to C string.
+        // 
+        // We use the stack instead of the heap for speed if possible.
+        // But we're extra cautious to avoid a stack overflow.
+        
+        NSUInteger msgLen = [logMsg lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
+        const BOOL useStack = msgLen < (1024 * 4);
+        
+        char msgStack[useStack ? (msgLen + 1) : 1]; // Analyzer doesn't like zero-size array, hence the 1
+        char *msg = useStack ? msgStack : (char *)malloc(msgLen + 1);
+        if (msg == NULL) return;
+        
+        BOOL logMsgEnc = [logMsg getCString:msg maxLength:(msgLen + 1) encoding:NSUTF8StringEncoding];
+        if (!logMsgEnc)
+        {
+            if (!useStack && msg != NULL) free(msg);
+            return;
+        }
+        
+        // Write the log message to STDERR
+        
+        if (isFormatted)
+        {
+            // The log message has already been formatted.
+            int iovec_len = (_automaticallyAppendNewlineForCustomFormatters) ? 5 : 4;
+            struct iovec v[iovec_len];
+            
+            if (colorProfile)
+            {
+                v[0].iov_base = colorProfile->fgCode;
+                v[0].iov_len = colorProfile->fgCodeLen;
+
+                v[1].iov_base = colorProfile->bgCode;
+                v[1].iov_len = colorProfile->bgCodeLen;
+
+                v[iovec_len - 1].iov_base = colorProfile->resetCode;
+                v[iovec_len - 1].iov_len = colorProfile->resetCodeLen;
+            }
+            else
+            {
+                v[0].iov_base = "";
+                v[0].iov_len = 0;
+                
+                v[1].iov_base = "";
+                v[1].iov_len = 0;
+                
+                v[iovec_len - 1].iov_base = "";
+                v[iovec_len - 1].iov_len = 0;
+            }
+            
+            v[2].iov_base = (char *)msg;
+            v[2].iov_len = msgLen;
+            
+            if (_automaticallyAppendNewlineForCustomFormatters) {
+                v[3].iov_base = "\n";
+                v[3].iov_len = (msg[msgLen] == '\n') ? 0 : 1;
+            }
+            
+            writev(STDERR_FILENO, v, iovec_len);
+        }
+        else
+        {
+            // The log message is unformatted, so apply standard NSLog style formatting.
+            
+            int len;
+            char ts[24] = "";
+            size_t tsLen = 0;
+            
+            // Calculate timestamp.
+            // The technique below is faster than using NSDateFormatter.
+            if (logMessage->timestamp)
+            {
+                NSDateComponents *components = [[NSCalendar autoupdatingCurrentCalendar] components:calendarUnitFlags fromDate:logMessage->timestamp];
+                
+                NSTimeInterval epoch = [logMessage->timestamp timeIntervalSinceReferenceDate];
+                int milliseconds = (int)((epoch - floor(epoch)) * 1000);
+                
+                len = snprintf(ts, 24, "%04ld-%02ld-%02ld %02ld:%02ld:%02ld:%03d", // yyyy-MM-dd HH:mm:ss:SSS
+                               (long)components.year,
+                               (long)components.month,
+                               (long)components.day,
+                               (long)components.hour,
+                               (long)components.minute,
+                               (long)components.second, milliseconds);
+                
+                tsLen = (NSUInteger)MAX(MIN(24-1, len), 0);
+            }
+            
+            // Calculate thread ID
+            // 
+            // How many characters do we need for the thread id?
+            // logMessage->machThreadID is of type mach_port_t, which is an unsigned int.
+            // 
+            // 1 hex char = 4 bits
+            // 8 hex chars for 32 bit, plus ending '\0' = 9
+            
+            char tid[9];
+            len = snprintf(tid, 9, "%x", logMessage->machThreadID);
+            
+            size_t tidLen = (NSUInteger)MAX(MIN(9-1, len), 0);
+            
+            // Here is our format: "%s %s[%i:%s] %s", timestamp, appName, processID, threadID, logMsg
+            
+            struct iovec v[13];
+            
+            if (colorProfile)
+            {
+                v[0].iov_base = colorProfile->fgCode;
+                v[0].iov_len = colorProfile->fgCodeLen;
+
+                v[1].iov_base = colorProfile->bgCode;
+                v[1].iov_len = colorProfile->bgCodeLen;
+
+                v[12].iov_base = colorProfile->resetCode;
+                v[12].iov_len = colorProfile->resetCodeLen;
+            }
+            else
+            {
+                v[0].iov_base = "";
+                v[0].iov_len = 0;
+
+                v[1].iov_base = "";
+                v[1].iov_len = 0;
+
+                v[12].iov_base = "";
+                v[12].iov_len = 0;
+            }
+            
+            v[2].iov_base = ts;
+            v[2].iov_len = tsLen;
+            
+            v[3].iov_base = " ";
+            v[3].iov_len = 1;
+            
+            v[4].iov_base = app;
+            v[4].iov_len = appLen;
+            
+            v[5].iov_base = "[";
+            v[5].iov_len = 1;
+            
+            v[6].iov_base = pid;
+            v[6].iov_len = pidLen;
+            
+            v[7].iov_base = ":";
+            v[7].iov_len = 1;
+            
+            v[8].iov_base = tid;
+            v[8].iov_len = MIN((size_t)8, tidLen); // snprintf doesn't return what you might think
+            
+            v[9].iov_base = "] ";
+            v[9].iov_len = 2;
+            
+            v[10].iov_base = (char *)msg;
+            v[10].iov_len = msgLen;
+            
+            v[11].iov_base = "\n";
+            v[11].iov_len = (msg[msgLen] == '\n') ? 0 : 1;
+            
+            writev(STDERR_FILENO, v, 13);
+        }
+        
+        if (!useStack) {
+            free(msg);
+        }
+    }
+}
+
+- (NSString *)loggerName
+{
+    return @"cocoa.lumberjack.ttyLogger";
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation DDTTYLoggerColorProfile
+
+- (instancetype)initWithForegroundColor:(OSColor *)fgColor backgroundColor:(OSColor *)bgColor flag:(int)aMask context:(int)ctxt
+{
+    if ((self = [super init]))
+    {
+        mask = aMask;
+        context = ctxt;
+        
+        CGFloat r, g, b;
+        
+        if (fgColor)
+        {
+            [DDTTYLogger getRed:&r green:&g blue:&b fromColor:fgColor];
+            
+            fg_r = (uint8_t)(r * 255.0f);
+            fg_g = (uint8_t)(g * 255.0f);
+            fg_b = (uint8_t)(b * 255.0f);
+        }
+        if (bgColor)
+        {
+            [DDTTYLogger getRed:&r green:&g blue:&b fromColor:bgColor];
+            
+            bg_r = (uint8_t)(r * 255.0f);
+            bg_g = (uint8_t)(g * 255.0f);
+            bg_b = (uint8_t)(b * 255.0f);
+        }
+        
+        if (fgColor && isaColorTTY)
+        {
+            // Map foreground color to closest available shell color
+            
+            fgCodeIndex = [DDTTYLogger codeIndexForColor:fgColor];
+            fgCodeRaw   = [codes_fg objectAtIndex:fgCodeIndex];
+            
+            NSString *escapeSeq = @"\033[";
+            
+            NSUInteger len1 = [escapeSeq lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
+            NSUInteger len2 = [fgCodeRaw lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
+            
+            BOOL escapeSeqEnc = [escapeSeq getCString:(fgCode)      maxLength:(len1+1) encoding:NSUTF8StringEncoding];
+            BOOL fgCodeRawEsc = [fgCodeRaw getCString:(fgCode+len1) maxLength:(len2+1) encoding:NSUTF8StringEncoding];
+            if (!escapeSeqEnc || !fgCodeRawEsc) return nil;
+            
+            fgCodeLen = len1+len2;
+        }
+        else if (fgColor && isaXcodeColorTTY)
+        {
+            // Convert foreground color to color code sequence
+            
+            const char *escapeSeq = XCODE_COLORS_ESCAPE_SEQ;
+            
+            int result = snprintf(fgCode, 24, "%sfg%u,%u,%u;", escapeSeq, fg_r, fg_g, fg_b);
+            fgCodeLen = (NSUInteger)MAX(MIN(result, (24-1)), 0);
+        }
+        else
+        {
+            // No foreground color or no color support
+            
+            fgCode[0] = '\0';
+            fgCodeLen = 0;
+        }
+        
+        if (bgColor && isaColorTTY)
+        {
+            // Map background color to closest available shell color
+            
+            bgCodeIndex = [DDTTYLogger codeIndexForColor:bgColor];
+            bgCodeRaw   = [codes_bg objectAtIndex:bgCodeIndex];
+            
+            NSString *escapeSeq = @"\033[";
+            
+            NSUInteger len1 = [escapeSeq lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
+            NSUInteger len2 = [bgCodeRaw lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
+            
+            BOOL escapeSeqEnc = [escapeSeq getCString:(bgCode)      maxLength:(len1+1) encoding:NSUTF8StringEncoding];
+            BOOL bgCodeRawEsc = [bgCodeRaw getCString:(bgCode+len1) maxLength:(len2+1) encoding:NSUTF8StringEncoding];
+            if (!escapeSeqEnc || !bgCodeRawEsc) return nil;
+            
+            bgCodeLen = len1+len2;
+        }
+        else if (bgColor && isaXcodeColorTTY)
+        {
+            // Convert background color to color code sequence
+            
+            const char *escapeSeq = XCODE_COLORS_ESCAPE_SEQ;
+            
+            int result = snprintf(bgCode, 24, "%sbg%u,%u,%u;", escapeSeq, bg_r, bg_g, bg_b);
+            bgCodeLen = (NSUInteger)MAX(MIN(result, (24-1)), 0);
+        }
+        else
+        {
+            // No background color or no color support
+            
+            bgCode[0] = '\0';
+            bgCodeLen = 0;
+        }
+        
+        if (isaColorTTY)
+        {
+            resetCodeLen = (NSUInteger)MAX(snprintf(resetCode, 8, "\033[0m"), 0);
+        }
+        else if (isaXcodeColorTTY)
+        {
+            resetCodeLen = (NSUInteger)MAX(snprintf(resetCode, 8, XCODE_COLORS_RESET), 0);
+        }
+        else
+        {
+            resetCode[0] = '\0';
+            resetCodeLen = 0;
+        }
+    }
+    return self;
+}
+
+- (NSString *)description
+{
+    return [NSString stringWithFormat:
+            @"<DDTTYLoggerColorProfile: %p mask:%i ctxt:%i fg:%u,%u,%u bg:%u,%u,%u fgCode:%@ bgCode:%@>",
+            self, mask, context, fg_r, fg_g, fg_b, bg_r, bg_g, bg_b, fgCodeRaw, bgCodeRaw];
+}
+
+@end
diff --git a/Lumberjack/Extensions/DDContextFilterLogFormatter.h b/Lumberjack/Extensions/DDContextFilterLogFormatter.h
new file mode 100644
index 0000000..341f827
--- /dev/null
+++ b/Lumberjack/Extensions/DDContextFilterLogFormatter.h
@@ -0,0 +1,63 @@
+#import <Foundation/Foundation.h>
+#import "DDLog.h"
+
+/**
+ * Welcome to Cocoa Lumberjack!
+ * 
+ * The project page has a wealth of documentation if you have any questions.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack
+ * 
+ * If you're new to the project you may wish to read the "Getting Started" page.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted
+ * 
+ * 
+ * This class provides a log formatter that filters log statements from a logging context not on the whitelist.
+ * 
+ * A log formatter can be added to any logger to format and/or filter its output.
+ * You can learn more about log formatters here:
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters
+ * 
+ * You can learn more about logging context's here:
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomContext
+ *
+ * But here's a quick overview / refresher:
+ * 
+ * Every log statement has a logging context.
+ * These come from the underlying logging macros defined in DDLog.h.
+ * The default logging context is zero.
+ * You can define multiple logging context's for use in your application.
+ * For example, logically separate parts of your app each have a different logging context.
+ * Also 3rd party frameworks that make use of Lumberjack generally use their own dedicated logging context.
+**/
+@interface DDContextWhitelistFilterLogFormatter : NSObject <DDLogFormatter>
+
+- (id)init;
+
+- (void)addToWhitelist:(int)loggingContext;
+- (void)removeFromWhitelist:(int)loggingContext;
+
+- (NSArray *)whitelist;
+
+- (BOOL)isOnWhitelist:(int)loggingContext;
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * This class provides a log formatter that filters log statements from a logging context on the blacklist.
+**/
+@interface DDContextBlacklistFilterLogFormatter : NSObject <DDLogFormatter>
+
+- (id)init;
+
+- (void)addToBlacklist:(int)loggingContext;
+- (void)removeFromBlacklist:(int)loggingContext;
+
+- (NSArray *)blacklist;
+
+- (BOOL)isOnBlacklist:(int)loggingContext;
+
+@end
diff --git a/Lumberjack/Extensions/DDContextFilterLogFormatter.m b/Lumberjack/Extensions/DDContextFilterLogFormatter.m
new file mode 100644
index 0000000..dfed59b
--- /dev/null
+++ b/Lumberjack/Extensions/DDContextFilterLogFormatter.m
@@ -0,0 +1,191 @@
+#import "DDContextFilterLogFormatter.h"
+#import <libkern/OSAtomic.h>
+
+/**
+ * Welcome to Cocoa Lumberjack!
+ * 
+ * The project page has a wealth of documentation if you have any questions.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack
+ * 
+ * If you're new to the project you may wish to read the "Getting Started" wiki.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted
+**/
+
+#if ! __has_feature(objc_arc)
+#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
+#endif
+
+@interface DDLoggingContextSet : NSObject
+
+- (void)addToSet:(int)loggingContext;
+- (void)removeFromSet:(int)loggingContext;
+
+- (NSArray *)currentSet;
+
+- (BOOL)isInSet:(int)loggingContext;
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation DDContextWhitelistFilterLogFormatter
+{
+    DDLoggingContextSet *contextSet;
+}
+
+- (id)init
+{
+    if ((self = [super init]))
+    {
+        contextSet = [[DDLoggingContextSet alloc] init];
+    }
+    return self;
+}
+
+
+- (void)addToWhitelist:(int)loggingContext
+{
+    [contextSet addToSet:loggingContext];
+}
+
+- (void)removeFromWhitelist:(int)loggingContext
+{
+    [contextSet removeFromSet:loggingContext];
+}
+
+- (NSArray *)whitelist
+{
+    return [contextSet currentSet];
+}
+
+- (BOOL)isOnWhitelist:(int)loggingContext
+{
+    return [contextSet isInSet:loggingContext];
+}
+
+- (NSString *)formatLogMessage:(DDLogMessage *)logMessage
+{
+    if ([self isOnWhitelist:logMessage->logContext])
+        return logMessage->logMsg;
+    else
+        return nil;
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation DDContextBlacklistFilterLogFormatter
+{
+    DDLoggingContextSet *contextSet;
+}
+
+- (id)init
+{
+    if ((self = [super init]))
+    {
+        contextSet = [[DDLoggingContextSet alloc] init];
+    }
+    return self;
+}
+
+
+- (void)addToBlacklist:(int)loggingContext
+{
+    [contextSet addToSet:loggingContext];
+}
+
+- (void)removeFromBlacklist:(int)loggingContext
+{
+    [contextSet removeFromSet:loggingContext];
+}
+
+- (NSArray *)blacklist
+{
+    return [contextSet currentSet];
+}
+
+- (BOOL)isOnBlacklist:(int)loggingContext
+{
+    return [contextSet isInSet:loggingContext];
+}
+
+- (NSString *)formatLogMessage:(DDLogMessage *)logMessage
+{
+    if ([self isOnBlacklist:logMessage->logContext])
+        return nil;
+    else
+        return logMessage->logMsg;
+}
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation DDLoggingContextSet
+{
+    OSSpinLock lock;
+    NSMutableSet *set;
+}
+
+- (id)init
+{
+    if ((self = [super init]))
+    {
+        set = [[NSMutableSet alloc] init];
+    }
+    return self;
+}
+
+
+- (void)addToSet:(int)loggingContext
+{
+    OSSpinLockLock(&lock);
+    {
+        [set addObject:@(loggingContext)];
+    }
+    OSSpinLockUnlock(&lock);
+}
+
+- (void)removeFromSet:(int)loggingContext
+{
+    OSSpinLockLock(&lock);
+    {
+        [set removeObject:@(loggingContext)];
+    }
+    OSSpinLockUnlock(&lock);
+}
+
+- (NSArray *)currentSet
+{
+    NSArray *result = nil;
+    
+    OSSpinLockLock(&lock);
+    {
+        result = [set allObjects];
+    }
+    OSSpinLockUnlock(&lock);
+    
+    return result;
+}
+
+- (BOOL)isInSet:(int)loggingContext
+{
+    BOOL result = NO;
+    
+    OSSpinLockLock(&lock);
+    {
+        result = [set containsObject:@(loggingContext)];
+    }
+    OSSpinLockUnlock(&lock);
+    
+    return result;
+}
+
+@end
diff --git a/Lumberjack/Extensions/DDDispatchQueueLogFormatter.h b/Lumberjack/Extensions/DDDispatchQueueLogFormatter.h
new file mode 100644
index 0000000..15949d7
--- /dev/null
+++ b/Lumberjack/Extensions/DDDispatchQueueLogFormatter.h
@@ -0,0 +1,128 @@
+#import <Foundation/Foundation.h>
+#import <libkern/OSAtomic.h>
+#import "DDLog.h"
+
+
+/**
+ * Welcome to Cocoa Lumberjack!
+ * 
+ * The project page has a wealth of documentation if you have any questions.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack
+ * 
+ * If you're new to the project you may wish to read the "Getting Started" page.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted
+ * 
+ * 
+ * This class provides a log formatter that prints the dispatch_queue label instead of the mach_thread_id.
+ * 
+ * A log formatter can be added to any logger to format and/or filter its output.
+ * You can learn more about log formatters here:
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters
+ * 
+ * A typical NSLog (or DDTTYLogger) prints detailed info as [<process_id>:<thread_id>].
+ * For example:
+ * 
+ * 2011-10-17 20:21:45.435 AppName[19928:5207] Your log message here
+ * 
+ * Where:
+ * - 19928 = process id
+ * -  5207 = thread id (mach_thread_id printed in hex)
+ * 
+ * When using grand central dispatch (GCD), this information is less useful.
+ * This is because a single serial dispatch queue may be run on any thread from an internally managed thread pool.
+ * For example:
+ * 
+ * 2011-10-17 20:32:31.111 AppName[19954:4d07] Message from my_serial_dispatch_queue
+ * 2011-10-17 20:32:31.112 AppName[19954:5207] Message from my_serial_dispatch_queue
+ * 2011-10-17 20:32:31.113 AppName[19954:2c55] Message from my_serial_dispatch_queue
+ * 
+ * This formatter allows you to replace the standard [box:info] with the dispatch_queue name.
+ * For example:
+ * 
+ * 2011-10-17 20:32:31.111 AppName[img-scaling] Message from my_serial_dispatch_queue
+ * 2011-10-17 20:32:31.112 AppName[img-scaling] Message from my_serial_dispatch_queue
+ * 2011-10-17 20:32:31.113 AppName[img-scaling] Message from my_serial_dispatch_queue
+ * 
+ * If the dispatch_queue doesn't have a set name, then it falls back to the thread name.
+ * If the current thread doesn't have a set name, then it falls back to the mach_thread_id in hex (like normal).
+ * 
+ * Note: If manually creating your own background threads (via NSThread/alloc/init or NSThread/detachNeThread),
+ * you can use [[NSThread currentThread] setName:(NSString *)].
+**/
+@interface DDDispatchQueueLogFormatter : NSObject <DDLogFormatter> {
+@protected
+    
+    NSString *dateFormatString;
+}
+
+/**
+ * Standard init method.
+ * Configure using properties as desired.
+**/
+- (id)init;
+
+/**
+ * The minQueueLength restricts the minimum size of the [detail box].
+ * If the minQueueLength is set to 0, there is no restriction.
+ * 
+ * For example, say a dispatch_queue has a label of "diskIO":
+ * 
+ * If the minQueueLength is 0: [diskIO]
+ * If the minQueueLength is 4: [diskIO]
+ * If the minQueueLength is 5: [diskIO]
+ * If the minQueueLength is 6: [diskIO]
+ * If the minQueueLength is 7: [diskIO ]
+ * If the minQueueLength is 8: [diskIO  ]
+ * 
+ * The default minQueueLength is 0 (no minimum, so [detail box] won't be padded).
+ * 
+ * If you want every [detail box] to have the exact same width,
+ * set both minQueueLength and maxQueueLength to the same value.
+**/
+@property (assign, atomic) NSUInteger minQueueLength;
+
+/**
+ * The maxQueueLength restricts the number of characters that will be inside the [detail box].
+ * If the maxQueueLength is 0, there is no restriction.
+ * 
+ * For example, say a dispatch_queue has a label of "diskIO":
+ *
+ * If the maxQueueLength is 0: [diskIO]
+ * If the maxQueueLength is 4: [disk]
+ * If the maxQueueLength is 5: [diskI]
+ * If the maxQueueLength is 6: [diskIO]
+ * If the maxQueueLength is 7: [diskIO]
+ * If the maxQueueLength is 8: [diskIO]
+ * 
+ * The default maxQueueLength is 0 (no maximum, so [detail box] won't be truncated).
+ * 
+ * If you want every [detail box] to have the exact same width,
+ * set both minQueueLength and maxQueueLength to the same value.
+**/
+@property (assign, atomic) NSUInteger maxQueueLength;
+
+/**
+ * Sometimes queue labels have long names like "com.apple.main-queue",
+ * but you'd prefer something shorter like simply "main".
+ * 
+ * This method allows you to set such preferred replacements.
+ * The above example is set by default.
+ * 
+ * To remove/undo a previous replacement, invoke this method with nil for the 'shortLabel' parameter.
+**/
+- (NSString *)replacementStringForQueueLabel:(NSString *)longLabel;
+- (void)setReplacementString:(NSString *)shortLabel forQueueLabel:(NSString *)longLabel;
+
+@end
+
+/**
+ * Method declarations that make it easier to extend/modify DDDispatchQueueLogFormatter
+**/
+@interface DDDispatchQueueLogFormatter (OverridableMethods)
+
+- (NSString *)stringFromDate:(NSDate *)date;
+- (NSString *)queueThreadLabelForLogMessage:(DDLogMessage *)logMessage;
+- (NSString *)formatLogMessage:(DDLogMessage *)logMessage;
+
+@end
+
diff --git a/Lumberjack/Extensions/DDDispatchQueueLogFormatter.m b/Lumberjack/Extensions/DDDispatchQueueLogFormatter.m
new file mode 100644
index 0000000..9bf0593
--- /dev/null
+++ b/Lumberjack/Extensions/DDDispatchQueueLogFormatter.m
@@ -0,0 +1,260 @@
+#import "DDDispatchQueueLogFormatter.h"
+#import <libkern/OSAtomic.h>
+
+/**
+ * Welcome to Cocoa Lumberjack!
+ * 
+ * The project page has a wealth of documentation if you have any questions.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack
+ * 
+ * If you're new to the project you may wish to read the "Getting Started" wiki.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted
+**/
+
+#if ! __has_feature(objc_arc)
+#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
+#endif
+
+
+@implementation DDDispatchQueueLogFormatter
+{
+    int32_t atomicLoggerCount;
+    NSDateFormatter *threadUnsafeDateFormatter; // Use [self stringFromDate]
+    
+    OSSpinLock lock;
+    
+    NSUInteger _minQueueLength;           // _prefix == Only access via atomic property
+    NSUInteger _maxQueueLength;           // _prefix == Only access via atomic property
+    NSMutableDictionary *_replacements;   // _prefix == Only access from within spinlock
+}
+
+- (id)init
+{
+    if ((self = [super init]))
+    {
+        dateFormatString = @"yyyy-MM-dd HH:mm:ss:SSS";
+        
+        atomicLoggerCount = 0;
+        threadUnsafeDateFormatter = nil;
+        
+        _minQueueLength = 0;
+        _maxQueueLength = 0;
+        _replacements = [[NSMutableDictionary alloc] init];
+        
+        // Set default replacements:
+        
+        _replacements[@"com.apple.main-thread"] = @"main";
+    }
+    return self;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Configuration
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@synthesize minQueueLength = _minQueueLength;
+@synthesize maxQueueLength = _maxQueueLength;
+
+- (NSString *)replacementStringForQueueLabel:(NSString *)longLabel
+{
+    NSString *result = nil;
+    
+    OSSpinLockLock(&lock);
+    {
+        result = _replacements[longLabel];
+    }
+    OSSpinLockUnlock(&lock);
+    
+    return result;
+}
+
+- (void)setReplacementString:(NSString *)shortLabel forQueueLabel:(NSString *)longLabel
+{
+    OSSpinLockLock(&lock);
+    {
+        if (shortLabel)
+            _replacements[longLabel] = shortLabel;
+        else
+            [_replacements removeObjectForKey:longLabel];
+    }
+    OSSpinLockUnlock(&lock);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark DDLogFormatter
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (NSString *)stringFromDate:(NSDate *)date
+{
+    int32_t loggerCount = OSAtomicAdd32(0, &atomicLoggerCount);
+    
+    NSString *calendarIdentifier = nil;
+#if defined(__IPHONE_8_0) || defined(__MAC_10_10)
+    calendarIdentifier = NSCalendarIdentifierGregorian;
+#else
+    calendarIdentifier = NSGregorianCalendar;
+#endif
+    
+    if (loggerCount <= 1)
+    {
+        // Single-threaded mode.
+        
+        if (threadUnsafeDateFormatter == nil)
+        {
+            threadUnsafeDateFormatter = [[NSDateFormatter alloc] init];
+            [threadUnsafeDateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];
+            [threadUnsafeDateFormatter setDateFormat:dateFormatString];
+        }
+        
+        [threadUnsafeDateFormatter setCalendar:[[NSCalendar alloc] initWithCalendarIdentifier:calendarIdentifier]];
+        return [threadUnsafeDateFormatter stringFromDate:date];
+    }
+    else
+    {
+        // Multi-threaded mode.
+        // NSDateFormatter is NOT thread-safe.
+        
+        NSString *key = @"DispatchQueueLogFormatter_NSDateFormatter";
+        
+        NSMutableDictionary *threadDictionary = [[NSThread currentThread] threadDictionary];
+        NSDateFormatter *dateFormatter = threadDictionary[key];
+        
+        if (dateFormatter == nil)
+        {
+            dateFormatter = [[NSDateFormatter alloc] init];
+            [dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];
+            [dateFormatter setDateFormat:dateFormatString];
+            
+            threadDictionary[key] = dateFormatter;
+        }
+        
+        [dateFormatter setCalendar:[[NSCalendar alloc] initWithCalendarIdentifier:calendarIdentifier]];
+        return [dateFormatter stringFromDate:date];
+    }
+}
+
+- (NSString *)queueThreadLabelForLogMessage:(DDLogMessage *)logMessage
+{
+    // As per the DDLogFormatter contract, this method is always invoked on the same thread/dispatch_queue
+    
+    NSUInteger minQueueLength = self.minQueueLength;
+    NSUInteger maxQueueLength = self.maxQueueLength;
+    
+    // Get the name of the queue, thread, or machID (whichever we are to use).
+    
+    NSString *queueThreadLabel = nil;
+    
+    BOOL useQueueLabel = YES;
+    BOOL useThreadName = NO;
+    
+    if (logMessage->queueLabel)
+    {
+        // If you manually create a thread, it's dispatch_queue will have one of the thread names below.
+        // Since all such threads have the same name, we'd prefer to use the threadName or the machThreadID.
+        
+        char *names[] = { "com.apple.root.low-priority",
+                          "com.apple.root.default-priority",
+                          "com.apple.root.high-priority",
+                          "com.apple.root.low-overcommit-priority",
+                          "com.apple.root.default-overcommit-priority",
+                          "com.apple.root.high-overcommit-priority"     };
+        
+        int length = sizeof(names) / sizeof(char *);
+        
+        int i;
+        for (i = 0; i < length; i++)
+        {
+            if (strcmp(logMessage->queueLabel, names[i]) == 0)
+            {
+                useQueueLabel = NO;
+                useThreadName = [logMessage->threadName length] > 0;
+                break;
+            }
+        }
+    }
+    else
+    {
+        useQueueLabel = NO;
+        useThreadName = [logMessage->threadName length] > 0;
+    }
+    
+    if (useQueueLabel || useThreadName)
+    {
+        NSString *fullLabel;
+        NSString *abrvLabel;
+        
+        if (useQueueLabel)
+            fullLabel = @(logMessage->queueLabel);
+        else
+            fullLabel = logMessage->threadName;
+        
+        OSSpinLockLock(&lock);
+        {
+            abrvLabel = _replacements[fullLabel];
+        }
+        OSSpinLockUnlock(&lock);
+        
+        if (abrvLabel)
+            queueThreadLabel = abrvLabel;
+        else
+            queueThreadLabel = fullLabel;
+    }
+    else
+    {
+        queueThreadLabel = [NSString stringWithFormat:@"%x", logMessage->machThreadID];
+    }
+    
+    // Now use the thread label in the output
+    
+    NSUInteger labelLength = [queueThreadLabel length];
+    
+    // labelLength > maxQueueLength : truncate
+    // labelLength < minQueueLength : padding
+    //                              : exact
+    
+    if ((maxQueueLength > 0) && (labelLength > maxQueueLength))
+    {
+        // Truncate
+        
+        return [queueThreadLabel substringToIndex:maxQueueLength];
+    }
+    else if (labelLength < minQueueLength)
+    {
+        // Padding
+        
+        NSUInteger numSpaces = minQueueLength - labelLength;
+        
+        char spaces[numSpaces + 1];
+        memset(spaces, ' ', numSpaces);
+        spaces[numSpaces] = '\0';
+        
+        return [NSString stringWithFormat:@"%@%s", queueThreadLabel, spaces];
+    }
+    else
+    {
+        // Exact
+        
+        return queueThreadLabel;
+    }
+}
+
+- (NSString *)formatLogMessage:(DDLogMessage *)logMessage
+{
+    NSString *timestamp = [self stringFromDate:(logMessage->timestamp)];
+    NSString *queueThreadLabel = [self queueThreadLabelForLogMessage:logMessage];
+    
+    return [NSString stringWithFormat:@"%@ [%@] %@", timestamp, queueThreadLabel, logMessage->logMsg];
+}
+
+- (void)didAddToLogger:(id <DDLogger>)logger
+{
+    OSAtomicIncrement32(&atomicLoggerCount);
+}
+
+- (void)willRemoveFromLogger:(id <DDLogger>)logger
+{
+    OSAtomicDecrement32(&atomicLoggerCount);
+}
+
+@end
diff --git a/Lumberjack/Extensions/DDMultiFormatter.h b/Lumberjack/Extensions/DDMultiFormatter.h
new file mode 100644
index 0000000..c9876aa
--- /dev/null
+++ b/Lumberjack/Extensions/DDMultiFormatter.h
@@ -0,0 +1,30 @@
+#import <Foundation/Foundation.h>
+#import "DDLog.h"
+
+/**
+ * Welcome to Cocoa Lumberjack!
+ *
+ * The project page has a wealth of documentation if you have any questions.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack
+ *
+ * If you're new to the project you may wish to read the "Getting Started" page.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted
+ *
+ *
+ * This formatter can be used to chain different formatters together.
+ * The log message will processed in the order of the formatters added.
+ **/
+
+@interface DDMultiFormatter : NSObject <DDLogFormatter>
+
+/**
+ *  Array of chained formatters
+ */
+@property (readonly) NSArray *formatters;
+
+- (void)addFormatter:(id<DDLogFormatter>)formatter;
+- (void)removeFormatter:(id<DDLogFormatter>)formatter;
+- (void)removeAllFormatters;
+- (BOOL)isFormattingWithFormatter:(id<DDLogFormatter>)formatter;
+
+@end
diff --git a/Lumberjack/Extensions/DDMultiFormatter.m b/Lumberjack/Extensions/DDMultiFormatter.m
new file mode 100644
index 0000000..6e183db
--- /dev/null
+++ b/Lumberjack/Extensions/DDMultiFormatter.m
@@ -0,0 +1,132 @@
+#import "DDMultiFormatter.h"
+
+/**
+ * Welcome to Cocoa Lumberjack!
+ *
+ * The project page has a wealth of documentation if you have any questions.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack
+ *
+ * If you're new to the project you may wish to read the "Getting Started" page.
+ * https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted
+ **/
+
+#if TARGET_OS_IPHONE
+// Compiling for iOS
+#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 60000 // iOS 6.0 or later
+#define NEEDS_DISPATCH_RETAIN_RELEASE 0
+#else                                         // iOS 5.X or earlier
+#define NEEDS_DISPATCH_RETAIN_RELEASE 1
+#endif
+#else
+// Compiling for Mac OS X
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1080     // Mac OS X 10.8 or later
+#define NEEDS_DISPATCH_RETAIN_RELEASE 0
+#else                                         // Mac OS X 10.7 or earlier
+#define NEEDS_DISPATCH_RETAIN_RELEASE 1
+#endif
+#endif
+
+
+#if ! __has_feature(objc_arc)
+#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
+#endif
+
+
+@interface DDMultiFormatter ()
+
+- (DDLogMessage *)logMessageForLine:(NSString *)line originalMessage:(DDLogMessage *)message;
+
+@end
+
+
+@implementation DDMultiFormatter {
+    dispatch_queue_t _queue;
+    NSMutableArray *_formatters;
+}
+
+- (id)init {
+    self = [super init];
+    if (self) {
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
+        _queue = dispatch_queue_create("cocoa.lumberjack.multiformatter", DISPATCH_QUEUE_CONCURRENT);
+#else
+        _queue = dispatch_queue_create("cocoa.lumberjack.multiformatter", NULL);
+#endif
+        _formatters = [NSMutableArray new];
+    }
+    
+    return self;
+}
+
+#if NEEDS_DISPATCH_RETAIN_RELEASE
+- (void)dealloc {
+    dispatch_release(_queue);
+}
+#endif
+
+#pragma mark Processing
+
+- (NSString *)formatLogMessage:(DDLogMessage *)logMessage {
+    __block NSString *line = logMessage->logMsg;
+    
+    dispatch_sync(_queue, ^{
+        for (id<DDLogFormatter> formatter in _formatters) {
+            DDLogMessage *message = [self logMessageForLine:line originalMessage:logMessage];
+            line = [formatter formatLogMessage:message];
+            
+            if (!line) {
+                break;
+            }
+        }
+    });
+    
+    return line;
+}
+
+- (DDLogMessage *)logMessageForLine:(NSString *)line originalMessage:(DDLogMessage *)message {
+    DDLogMessage *newMessage = [message copy];
+    newMessage->logMsg = line;
+    return newMessage;
+}
+
+#pragma mark Formatters
+
+- (NSArray *)formatters {
+    __block NSArray *formatters;
+    
+    dispatch_sync(_queue, ^{
+        formatters = [_formatters copy];
+    });
+    
+    return formatters;
+}
+
+- (void)addFormatter:(id<DDLogFormatter>)formatter {
+    dispatch_barrier_async(_queue, ^{
+        [_formatters addObject:formatter];
+    });
+}
+
+- (void)removeFormatter:(id<DDLogFormatter>)formatter {
+    dispatch_barrier_async(_queue, ^{
+        [_formatters removeObject:formatter];
+    });
+}
+
+- (void)removeAllFormatters {
+    dispatch_barrier_async(_queue, ^{
+        [_formatters removeAllObjects];
+    });
+}
+
+- (BOOL)isFormattingWithFormatter:(id<DDLogFormatter>)formatter {
+    __block BOOL hasFormatter;
+    
+    dispatch_sync(_queue, ^{
+        hasFormatter = [_formatters containsObject:formatter];
+    });
+    
+    return hasFormatter;
+}
+
+@end
diff --git a/Lumberjack/Extensions/README.txt b/Lumberjack/Extensions/README.txt
new file mode 100644
index 0000000..0ff3d93
--- /dev/null
+++ b/Lumberjack/Extensions/README.txt
@@ -0,0 +1,7 @@
+This folder contains some sample formatters that may be helpful.
+
+Feel free to change them, extend them, or use them as the basis for your own custom formatter(s).
+
+More information about creating your own custom formatters can be found on the wiki:
+https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters
+
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..da60504
--- /dev/null
+++ b/README.md
@@ -0,0 +1,81 @@
+<p align="center" >
+  <img src="LumberjackLogo.png" title="Lumberjack logo" float=left>
+</p>
+
+CocoaLumberjack
+===============
+[![Build Status](http://img.shields.io/travis/CocoaLumberjack/CocoaLumberjack/master.svg?style=flat)](https://travis-ci.org/CocoaLumberjack/CocoaLumberjack)
+[![Pod Version](http://img.shields.io/cocoapods/v/CocoaLumberjack.svg?style=flat)](http://cocoadocs.org/docsets/CocoaLumberjack/)
+[![Pod Platform](http://img.shields.io/cocoapods/p/CocoaLumberjack.svg?style=flat)](http://cocoadocs.org/docsets/CocoaLumberjack/)
+[![Pod License](http://img.shields.io/cocoapods/l/CocoaLumberjack.svg?style=flat)](http://opensource.org/licenses/BSD-3-Clause)
+[![Reference Status](https://www.versioneye.com/objective-c/cocoalumberjack/reference_badge.svg?style=flat)](https://www.versioneye.com/objective-c/cocoalumberjack/references)
+
+**CocoaLumberjack** is a fast & simple, yet powerful & flexible logging framework for Mac and iOS.
+
+#### Lumberjack is Fast & Simple, yet Powerful & Flexible.
+
+It is similar in concept to other popular logging frameworks such as log4j, yet is designed specifically for Objective-C, and takes advantage of features such as multi-threading, grand central dispatch (if available), lockless atomic operations, and the dynamic nature of the Objective-C runtime.
+
+#### Lumberjack is Fast
+
+In most cases it is an order of magnitude faster than NSLog.
+
+#### Lumberjack is Simple
+
+It takes as little as a single line of code to configure lumberjack when your application launches. Then simply replace your NSLog statements with DDLog statements and that's about it. (And the DDLog macros have the exact same format and syntax as NSLog, so it's super easy.)
+
+#### Lumberjack is Powerful:
+
+One log statement can be sent to multiple loggers, meaning you can log to a file and the console simultaneously. Want more? Create your own loggers (it's easy) and send your log statements over the network. Or to a database or distributed file system. The sky is the limit.
+
+#### Lumberjack is Flexible:
+
+Configure your logging however you want. Change log levels per file (perfect for debugging). Change log levels per logger (verbose console, but concise log file). Change log levels per xcode configuration (verbose debug, but concise release). Have your log statements compiled out of the release build. Customize the number of log levels for your application. Add your own fine-grained logging. Dynamically change log levels during runtime. Choose how & when you want your log files to be rolled. Upload your log files to a central server. Compress archived log files to save disk space...
+
+### This framework is for you if:
+
+-   You're looking for a way to track down that impossible-to-reproduce bug that keeps popping up in the field.
+-   You're frustrated with the super short console log on the iPhone.
+-   You're looking to take your application to the next level in terms of support and stability.
+-   You're looking for an enterprise level logging solution for your application (Mac or iPhone).
+
+### How to get started
+- install via [CocoaPods](http://cocoapods.org)
+
+```ruby
+platform :ios, '6.1'
+pod 'CocoaLumberjack'
+```
+- read the [Getting started](https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted) guide, check out the [FAQ](https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/FAQ) section or the other [docs](https://github.com/CocoaLumberjack/CocoaLumberjack/wiki)
+- if you find issues or want to suggest improvements, create an issue or a pull request
+- for all kinds of questions involving CocoaLumberjack, use the [Google group](http://groups.google.com/group/cocoalumberjack) or StackOverflow (use [#lumberjack](http://stackoverflow.com/questions/tagged/lumberjack)).
+
+### Documentation
+- **[Get started using Lumberjack](https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/GettingStarted)**<br/>
+- [Different log levels for Debug and Release builds](https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/XcodeTricks)<br/>
+- [Different log levels for each logger](https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/PerLoggerLogLevels)<br/>
+- [Use colors in the Xcode debugging console](https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/XcodeColors)<br/>
+- [Write your own custom formatters](https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomFormatters)<br/>
+- [FAQ](https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/FAQ)<br/>
+- [Analysis of performance with benchmarks](https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/Performance)<br/>
+- [Common issues you may encounter and their solutions](https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/ProblemSolution)<br/>
+- [AppCode support](https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/AppCode-support)
+- **[full Lumberjack wiki](https://github.com/CocoaLumberjack/CocoaLumberjack/wiki)**<br/>
+
+### Requirements 
+- Xcode 4.4 or later is required
+- iOS 5 or later
+- OS X 10.7 or later
+- for OS X < 10.7 support, use the 1.6.0 version
+
+### Author
+- [Robbie Hanson](https://github.com/robbiehanson)
+- Love the project? Wanna buy me a coffee? (or a beer :D) [![donation](http://www.paypal.com/en_US/i/btn/btn_donate_SM.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=UZRA26JPJB3DA)
+
+### Collaborators
+- [Ernesto Rivera](https://github.com/rivera-ernesto)
+- [Dmitry Vorobyov](https://github.com/dvor)
+- [Bogdan Poplauschi](https://github.com/bpoplauschi)
+
+### License
+- CocoaLumberjack is available under the BSD license. See the [LICENSE file](https://github.com/CocoaLumberjack/CocoaLumberjack/blob/master/LICENSE.txt).
