@@ -394,10 +394,38 @@ @implementation DDLog (AllowQueueFreeze)
394
394
395
395
-(void ) swizzled_queueLogMessage : (DDLogMessage*) logMessage asynchronously : (BOOL ) asyncFlag
396
396
{
397
+ // make sure this method remains performant even when checking for udp logging presence
398
+ static BOOL udpLoggerEnabled = NO ;
399
+ static dispatch_once_t onceToken;
400
+ dispatch_once (&onceToken, ^{
401
+ udpLoggerEnabled = [[HelperTools defaultsDB ] boolForKey: @" udpLoggerEnabled" ];
402
+ });
403
+
397
404
// don't do sync logging for any message (usually ERROR), while the global logging queue is suspended
398
- @synchronized (_suspensionHandling_lock) {
399
- return [self swizzled_queueLogMessage: logMessage asynchronously: _suspensionHandling_isSuspended ? YES : asyncFlag];
405
+ // don't use _suspensionHandling_lock here because that can introduce deadlocks
406
+ // (for example if we have log statements in our MLLogFileManager code rotating the logfile and creating a new one)
407
+ BOOL isSuspended = _suspensionHandling_isSuspended;
408
+ if (isSuspended && udpLoggerEnabled)
409
+ {
410
+ // use udp logger to log all messages, even if the loggging queue is in suspended state
411
+ // this hopefully enables us to catch strange bugs sometimes hanging and then watchdog-killing the app when resuming from resumption
412
+ #pragma clang diagnostic push
413
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
414
+ [MLUDPLogger directlyWriteLogMessage: [[DDLogMessage alloc ]
415
+ initWithFormat: [NSString stringWithFormat: @" +++ LOG_QUEUE_DISABLED+++ %@ " , logMessage.messageFormat]
416
+ formatted: [NSString stringWithFormat: @" +++ LOG_QUEUE_DISABLED+++ %@ " , logMessage.message]
417
+ level: logMessage.level
418
+ flag: logMessage.flag
419
+ context: logMessage.context
420
+ file: logMessage.file
421
+ function: logMessage.function
422
+ line: logMessage.line
423
+ tag: logMessage.tag
424
+ options: logMessage.options
425
+ timestamp: logMessage.timestamp]];
426
+ #pragma clang diagnostic pop
400
427
}
428
+ return [self swizzled_queueLogMessage: logMessage asynchronously: isSuspended ? YES : asyncFlag];
401
429
}
402
430
403
431
// see https://stackoverflow.com/a/13326633 and https://fek.io/blog/method-swizzling-in-obj-c-and-swift/
@@ -2090,30 +2118,35 @@ +(NSData* _Nullable) convertLogmessageToJsonData:(DDLogMessage*) logMessage coun
2090
2118
// construct json dictionary
2091
2119
(*counter)++;
2092
2120
NSDictionary * representedObject = @{
2093
- @" queueThreadLabel" : [self getQueueThreadLabelFor: logMessage],
2121
+ @" queueThreadLabel" : nilWrapper ( [self getQueueThreadLabelFor: logMessage]) ,
2094
2122
@" processType" : [self isAppExtension ] ? @" appex" : @" mainapp" ,
2095
- @" processName" : [[[NSBundle mainBundle ] executablePath ] lastPathComponent ],
2123
+ @" processName" : nilWrapper ( [[[NSBundle mainBundle ] executablePath ] lastPathComponent ]) ,
2096
2124
@" counter" : [NSNumber numberWithUnsignedLongLong: *counter],
2097
- @" processID" : _processID,
2098
- @" qosName" : qos2name (logMessage.qos ),
2099
- @" representedObject" : logMessage.representedObject ? logMessage.representedObject : [NSNull null ],
2125
+ @" processID" : nilWrapper (_processID),
2126
+ @" qosName" : nilWrapper (qos2name (logMessage.qos )),
2127
+ @" loggingQueueSuspended" : bool2str (_suspensionHandling_isSuspended),
2128
+ @" representedObject" : nilWrapper (logMessage.representedObject ),
2100
2129
};
2101
2130
NSDictionary * msgDict = @{
2102
- @" messageFormat" : logMessage.messageFormat ,
2103
- @" message" : logMessage.message ,
2131
+ @" messageFormat" : nilWrapper ( logMessage.messageFormat ) ,
2132
+ @" message" : nilWrapper ( logMessage.message ) ,
2104
2133
@" level" : [NSNumber numberWithInteger: logMessage.level],
2105
2134
@" flag" : [NSNumber numberWithInteger: logMessage.flag],
2106
2135
@" context" : [NSNumber numberWithInteger: logMessage.context],
2107
- @" file" : logMessage.file ,
2108
- @" fileName" : logMessage.fileName ,
2109
- @" function" : logMessage.function ,
2136
+ @" file" : nilWrapper ( logMessage.file ) ,
2137
+ @" fileName" : nilWrapper ( logMessage.fileName ) ,
2138
+ @" function" : nilWrapper ( logMessage.function ) ,
2110
2139
@" line" : [NSNumber numberWithInteger: logMessage.line],
2111
- @" tag" : representedObject,
2140
+ @" representedObject" : nilWrapper (representedObject),
2141
+ #pragma clang diagnostic push
2142
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
2143
+ @" tag" : nilWrapper (logMessage.tag ),
2144
+ #pragma clang diagnostic pop
2112
2145
@" options" : [NSNumber numberWithInteger: logMessage.options],
2113
2146
@" timestamp" : [dateFormatter stringFromDate: logMessage.timestamp],
2114
- @" threadID" : logMessage.threadID ,
2115
- @" threadName" : logMessage.threadName ,
2116
- @" queueLabel" : logMessage.queueLabel ,
2147
+ @" threadID" : nilWrapper ( logMessage.threadID ) ,
2148
+ @" threadName" : nilWrapper ( logMessage.threadName ) ,
2149
+ @" queueLabel" : nilWrapper ( logMessage.queueLabel ) ,
2117
2150
@" qos" : [NSNumber numberWithInteger: logMessage.qos],
2118
2151
};
2119
2152
0 commit comments