Skip to content

Commit ddd1108

Browse files
Send out log messages via UDP even if global logging queue is suspended
1 parent 94fa5bf commit ddd1108

File tree

3 files changed

+71
-17
lines changed

3 files changed

+71
-17
lines changed

Monal/Classes/HelperTools.m

+49-16
Original file line numberDiff line numberDiff line change
@@ -394,10 +394,38 @@ @implementation DDLog (AllowQueueFreeze)
394394

395395
-(void) swizzled_queueLogMessage:(DDLogMessage*) logMessage asynchronously:(BOOL) asyncFlag
396396
{
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+
397404
//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
400427
}
428+
return [self swizzled_queueLogMessage:logMessage asynchronously:isSuspended ? YES : asyncFlag];
401429
}
402430

403431
//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
20902118
//construct json dictionary
20912119
(*counter)++;
20922120
NSDictionary* representedObject = @{
2093-
@"queueThreadLabel": [self getQueueThreadLabelFor:logMessage],
2121+
@"queueThreadLabel": nilWrapper([self getQueueThreadLabelFor:logMessage]),
20942122
@"processType": [self isAppExtension] ? @"appex" : @"mainapp",
2095-
@"processName": [[[NSBundle mainBundle] executablePath] lastPathComponent],
2123+
@"processName": nilWrapper([[[NSBundle mainBundle] executablePath] lastPathComponent]),
20962124
@"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),
21002129
};
21012130
NSDictionary* msgDict = @{
2102-
@"messageFormat": logMessage.messageFormat,
2103-
@"message": logMessage.message,
2131+
@"messageFormat": nilWrapper(logMessage.messageFormat),
2132+
@"message": nilWrapper(logMessage.message),
21042133
@"level": [NSNumber numberWithInteger:logMessage.level],
21052134
@"flag": [NSNumber numberWithInteger:logMessage.flag],
21062135
@"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),
21102139
@"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
21122145
@"options": [NSNumber numberWithInteger:logMessage.options],
21132146
@"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),
21172150
@"qos": [NSNumber numberWithInteger:logMessage.qos],
21182151
};
21192152

Monal/Classes/MLUDPLogger.h

+3
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@
1111

1212
NS_ASSUME_NONNULL_BEGIN
1313

14+
FOUNDATION_EXPORT DDLoggerName const DDLoggerNameUDP NS_SWIFT_NAME(DDLoggerName.udp); // MLUDPLogger
15+
1416
@interface MLUDPLogger : DDAbstractLogger <DDLogger>
1517

1618
+(void) flushWithTimeout:(double) timeout;
19+
+(void) directlyWriteLogMessage:(DDLogMessage*) logMessage;
1720

1821
@end
1922

Monal/Classes/MLUDPLogger.m

+19-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#import "MLContact.h"
2020
#import "xmpp.h"
2121

22+
DDLoggerName const DDLoggerNameUDP = @"monal.loggger.udp.mainQueue";
23+
2224
static NSData* _key;
2325
static volatile MLUDPLogger* _self;
2426

@@ -78,6 +80,16 @@ +(void) flushWithTimeout:(double) timeout
7880
}
7981
}
8082

83+
+(void) directlyWriteLogMessage:(DDLogMessage*) logMessage
84+
{
85+
if(_self == nil)
86+
{
87+
[[self class] logError:@"Ignoring call to directlySyncWriteLogMessage: _self still nil!"];
88+
return;
89+
}
90+
return [_self logMessage:logMessage];
91+
}
92+
8193
-(void) dealloc
8294
{
8395
_self = nil;
@@ -87,14 +99,20 @@ -(void) didAddLogger
8799
{
88100
_self = self;
89101
_send_condition = [NSCondition new];
90-
_send_queue = dispatch_queue_create("MLUDPLoggerSendQueue", dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INTERACTIVE, 0));
102+
_send_queue = dispatch_queue_create("MLUDPLoggerInternalSendQueue", dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INTERACTIVE, 0));
91103
}
92104

93105
-(void) willRemoveLogger
94106
{
95107
_self = nil;
96108
}
97109

110+
111+
-(DDLoggerName) loggerName
112+
{
113+
return DDLoggerNameUDP;
114+
}
115+
98116
+(void) logError:(NSString*) format, ... NS_FORMAT_FUNCTION(1, 2)
99117
{
100118
#ifdef IS_ALPHA

0 commit comments

Comments
 (0)