1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
| // Software License Agreement (BSD License)
| //
| // Copyright (c) 2010-2016, 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 OBSDD_LEGACY_MACROS
| #define OBSDD_LEGACY_MACROS 0
| #endif
|
| #import "OBSDDLog.h"
|
| /**
| *The constant/variable/method responsible for controlling the current log level.
| **/
| #ifndef OBSLOG_LEVEL_DEF
| #define OBSLOG_LEVEL_DEF obsddLogLevel
| #endif
|
| /**
| *Whether async should be used by log messages, excluding error messages that are always sent sync.
| **/
| #ifndef OBSLOG_ASYNC_ENABLED
| #define OBSLOG_ASYNC_ENABLED YES
| #endif
|
| /**
| *These are the two macros that all other macros below compile into.
| *These big multiline macros makes all the other macros easier to read.
| **/
| #define OBSLOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \
| [OBSDDLog log : isAsynchronous \
| level : lvl \
| flag : flg \
| context : ctx \
| file : __FILE__ \
| function : fnct \
| line : __LINE__ \
| tag : atag \
| format : (frmt), ## __VA_ARGS__]
|
| #define OBSLOG_MACRO_TO_OBSDDLOG(obsddlog, isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \
| [obsddlog log : isAsynchronous \
| level : lvl \
| flag : flg \
| context : ctx \
| file : __FILE__ \
| function : fnct \
| line : __LINE__ \
| tag : atag \
| format : (frmt), ## __VA_ARGS__]
|
| /**
| *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 & obsddLogLevel) { execute log message }
| *
| *When LOG_LEVEL_DEF is defined as obsddLogLevel.
| *
| *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/obsddLogLevel 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 OBSLOG_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, ...) \
| do { if(lvl & flg) OBSLOG_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0)
|
| #define OBSLOG_MAYBE_TO_OBSDDLOG(obsddlog, async, lvl, flg, ctx, tag, fnct, frmt, ...) \
| do { if(lvl & flg) OBSLOG_MACRO_TO_OBSDDLOG(obsddlog, async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0)
|
| /**
| *Ready to use log macros with no context or tag.
| **/
| #define OBSDDLogError(frmt, ...) OBSLOG_MAYBE(NO, OBSDDLogLevelError, OBSDDLogFlagError, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
| #define OBSDDLogWarn(frmt, ...) OBSLOG_MAYBE(OBSLOG_ASYNC_ENABLED, OBSDDLogLevelWarn, OBSDDLogFlagWarning, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
| #define OBSDDLogInfo(frmt, ...) OBSLOG_MAYBE(OBSLOG_ASYNC_ENABLED, OBSDDLogLevelInfo, OBSDDLogFlagInfo, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
| #define OBSDDLogDebug(frmt, ...) OBSLOG_MAYBE(OBSLOG_ASYNC_ENABLED, OBSDDLogLevelDebug, OBSDDLogFlagDebug, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
| #define OBSDDLogVerbose(frmt, ...) OBSLOG_MAYBE(OBSLOG_ASYNC_ENABLED, OBSDDLogLevelVerbose, OBSDDLogFlagVerbose, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
|
| // default macro
| /*
| #define DDLogError(frmt, ...) LOG_MAYBE(NO, LOG_LEVEL_DEF, DDLogFlagError, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
| #define DDLogWarn(frmt, ...) LOG_MAYBE(LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagWarning, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
| #define DDLogInfo(frmt, ...) LOG_MAYBE(LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagInfo, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
| #define DDLogDebug(frmt, ...) LOG_MAYBE(LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagDebug, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
| #define DDLogVerbose(frmt, ...) LOG_MAYBE(LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagVerbose, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
| */
|
| #define OBSDDLogErrorToOBSDDLog(obsddlog, frmt, ...) OBSLOG_MAYBE_TO_OBSDDOBSLOG(obsddlog, NO, OBSLOG_LEVEL_DEF, OBSDDLogFlagError, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
| #define OBSDDLogWarnToOBSDDLog(obsddlog, frmt, ...) OBSLOG_MAYBE_TO_OBSDDOBSLOG(obsddlog, OBSLOG_ASYNC_ENABLED, OBSLOG_LEVEL_DEF, OBSDDLogFlagWarning, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
| #define OBSDDLogInfoToOBSDDLog(obsddlog, frmt, ...) OBSLOG_MAYBE_TO_OBSDDOBSLOG(obsddlog, OBSLOG_ASYNC_ENABLED, OBSLOG_LEVEL_DEF, OBSDDLogFlagInfo, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
| #define OBSDDLogDebugToOBSDDLog(obsddlog, frmt, ...) OBSLOG_MAYBE_TO_OBSDDOBSLOG(obsddlog, OBSLOG_ASYNC_ENABLED, OBSLOG_LEVEL_DEF, OBSDDLogFlagDebug, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
| #define OBSDDLogVerboseToOBSDDLog(obsddlog, frmt, ...) OBSLOG_MAYBE_TO_OBSDDOBSLOG(obsddlog, OBSLOG_ASYNC_ENABLED, OBSLOG_LEVEL_DEF, OBSDDLogFlagVerbose, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
|
|