| // Software License Agreement (BSD License) |
| // |
| // Copyright (c) 2010-2015, 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. |
| |
| // Disable legacy macros |
| #ifndef DD_LEGACY_MACROS |
| #define DD_LEGACY_MACROS 0 |
| #endif |
| |
| #import "DDLog.h" |
| |
| /** |
| * The constant/variable/method responsible for controlling the current log level. |
| **/ |
| #ifndef LOG_LEVEL_DEF |
| #define LOG_LEVEL_DEF ddLogLevel |
| #endif |
| |
| /** |
| * Whether async should be used by log messages, excluding error messages that are always sent sync. |
| **/ |
| #ifndef LOG_ASYNC_ENABLED |
| #define LOG_ASYNC_ENABLED YES |
| #endif |
| |
| /** |
| * 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 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 version of the macro that only execute if the log level 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 LOGV_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) |
| |
| /** |
| * Ready to use log macros with no context or tag. |
| **/ |
| #define DDLogVError(frmt, avalist) LOGV_MAYBE(NO, LOG_LEVEL_DEF, DDLogFlagError, 0, nil, __PRETTY_FUNCTION__, frmt, avalist) |
| #define DDLogVWarn(frmt, avalist) LOGV_MAYBE(LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagWarning, 0, nil, __PRETTY_FUNCTION__, frmt, avalist) |
| #define DDLogVInfo(frmt, avalist) LOGV_MAYBE(LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagInfo, 0, nil, __PRETTY_FUNCTION__, frmt, avalist) |
| #define DDLogVDebug(frmt, avalist) LOGV_MAYBE(LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagDebug, 0, nil, __PRETTY_FUNCTION__, frmt, avalist) |
| #define DDLogVVerbose(frmt, avalist) LOGV_MAYBE(LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagVerbose, 0, nil, __PRETTY_FUNCTION__, frmt, avalist) |
| |