1
1
#import " DispatchQueueLogFormatter.h"
2
+ #import < libkern/OSAtomic.h>
2
3
3
4
/* *
4
5
* Welcome to Cocoa Lumberjack!
@@ -21,9 +22,10 @@ - (id)init
21
22
{
22
23
if ((self = [super init ]))
23
24
{
24
- dateFormatter = [[NSDateFormatter alloc ] init ];
25
- [dateFormatter setFormatterBehavior: NSDateFormatterBehavior10_4];
26
- [dateFormatter setDateFormat: @" yyyy-MM-dd HH:mm:ss:SSS" ];
25
+ dateFormatString = @" yyyy-MM-dd HH:mm:ss:SSS" ;
26
+
27
+ atomicLoggerCount = 0 ;
28
+ threadUnsafeDateFormatter = nil ;
27
29
28
30
_minQueueLength = 0 ;
29
31
_maxQueueLength = 0 ;
@@ -73,6 +75,46 @@ - (void)setReplacementString:(NSString *)shortLabel forQueueLabel:(NSString *)lo
73
75
#pragma mark DDLogFormatter
74
76
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
75
77
78
+ - (NSString *)stringFromDate : (NSDate *)date
79
+ {
80
+ int32_t loggerCount = OSAtomicAdd32 (0 , &atomicLoggerCount);
81
+
82
+ if (loggerCount <= 1 )
83
+ {
84
+ // Single-threaded mode.
85
+
86
+ if (threadUnsafeDateFormatter == nil )
87
+ {
88
+ threadUnsafeDateFormatter = [[NSDateFormatter alloc ] init ];
89
+ [threadUnsafeDateFormatter setFormatterBehavior: NSDateFormatterBehavior10_4];
90
+ [threadUnsafeDateFormatter setDateFormat: dateFormatString];
91
+ }
92
+
93
+ return [threadUnsafeDateFormatter stringFromDate: date];
94
+ }
95
+ else
96
+ {
97
+ // Multi-threaded mode.
98
+ // NSDateFormatter is NOT thread-safe.
99
+
100
+ NSString *key = @" DispatchQueueLogFormatter_NSDateFormatter" ;
101
+
102
+ NSMutableDictionary *threadDictionary = [[NSThread currentThread ] threadDictionary ];
103
+ NSDateFormatter *dateFormatter = [threadDictionary objectForKey: key];
104
+
105
+ if (dateFormatter == nil )
106
+ {
107
+ dateFormatter = [[NSDateFormatter alloc ] init ];
108
+ [dateFormatter setFormatterBehavior: NSDateFormatterBehavior10_4];
109
+ [dateFormatter setDateFormat: dateFormatString];
110
+
111
+ [threadDictionary setObject: dateFormatter forKey: key];
112
+ }
113
+
114
+ return [dateFormatter stringFromDate: date];
115
+ }
116
+ }
117
+
76
118
- (NSString *)queueThreadLabelForLogMessage : (DDLogMessage *)logMessage
77
119
{
78
120
// As per the DDLogFormatter contract, this method is always invoked on the same thread/dispatch_queue
@@ -180,10 +222,20 @@ - (NSString *)queueThreadLabelForLogMessage:(DDLogMessage *)logMessage
180
222
181
223
- (NSString *)formatLogMessage : (DDLogMessage *)logMessage
182
224
{
183
- NSString *timestamp = [dateFormatter stringFromDate: (logMessage->timestamp)];
225
+ NSString *timestamp = [self stringFromDate: (logMessage->timestamp)];
184
226
NSString *queueThreadLabel = [self queueThreadLabelForLogMessage: logMessage];
185
227
186
228
return [NSString stringWithFormat: @" %@ [%@ ] %@ " , timestamp, queueThreadLabel, logMessage->logMsg];
187
229
}
188
230
231
+ - (void )didAddToLogger : (id <DDLogger>)logger
232
+ {
233
+ OSAtomicIncrement32 (&atomicLoggerCount);
234
+ }
235
+
236
+ - (void )willRemoveFromLogger : (id <DDLogger>)logger
237
+ {
238
+ OSAtomicDecrement32 (&atomicLoggerCount);
239
+ }
240
+
189
241
@end
0 commit comments