0%

DDLog使用注意事项

DDOSLogger控制台打印,没有使用logMessage的时间戳而是os_log_xxx执行时的时间戳,因此会和logMessage的创建时间有个时间差。如果打印时选择的是DDLogFlagError,打印将是同步执行,这个时间差会非常小。而如果是DDLogFlagError以下级别,那么这条打印将是异步执行的,这时的时间差会更大,和NSLog混用时可能会误导你。因此和NSLog混用或者场景同步打印要求比较高,建议使用DDLogFlagError同步打印日志。

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
- (DDLoggerName)loggerName {
return DDLoggerNameOS;
}

- (void)logMessage:(DDLogMessage *)logMessage {
// Skip captured log messages
if ([logMessage->_fileName isEqualToString:@"DDASLLogCapture"]) {
return;
}

if (@available(iOS 10.0, macOS 10.12, tvOS 10.0, watchOS 3.0, *)) {
NSString * message = _logFormatter ? [_logFormatter formatLogMessage:logMessage] : logMessage->_message;
if (message != nil) {
const char *msg = [message UTF8String];
__auto_type logger = [self logger];
switch (logMessage->_flag) {
case DDLogFlagError :
os_log_error(logger, "%{public}s", msg);
break;
case DDLogFlagWarning:
case DDLogFlagInfo :
os_log_info(logger, "%{public}s", msg);
break;
case DDLogFlagDebug :
case DDLogFlagVerbose:
default :
os_log_debug(logger, "%{public}s", msg);
break;
}
}
}
}

例子:打印时选择的是DDLogFlagDebug。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
{
NSLog(@"接收到响应1:%@, 线程:%@", response.URL.lastPathComponent, [NSThread currentThread]);
MATLogDebug(@"MAT,接收到响应:%@, 线程:%@", response, [NSThread currentThread]);
NSLog(@"接收到响应2:%@, 线程:%@", response.URL.lastPathComponent, [NSThread currentThread]);

completionHandler(NSURLSessionResponseAllow);
}

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
NSURL *url = dataTask.originalRequest.URL;
NSMutableData *dataContainer = [self dataWithURL:url];
[dataContainer appendData:data];

NSLog(@"本次接收1:%ld,线程:%@, url:%@", data.length, [NSThread currentThread], url.lastPathComponent);

if (url.absoluteString == landscapeUrl) {
sleep(10);
}
NSLog(@"本次接收2:%ld,总共接收:%ld,线程:%@, url:%@", data.length, dataContainer.length, [NSThread currentThread], url.lastPathComponent);
}

日志:

1
2
3
4
5
6
7
8
9
2023-04-04 11:05:59.463803+0800 AFNetworking_fx[3039:152895] <__NSURLSessionLocal: 0x103b48e60>
2023-04-04 11:06:00.468738+0800 AFNetworking_fx[3039:152895] 开始请求:https://tinypng.com/images/example-orig.png
2023-04-04 11:06:00.598328+0800 AFNetworking_fx[3039:154867] 接收到响应1:example-orig.png, 线程:<NSThread: 0x2824d0f40>{number = 16, name = (null)}
2023-04-04 11:06:00.599692+0800 AFNetworking_fx[3039:154867] -----1:2023-04-04 11:06:00:600---------
2023-04-04 11:06:00.600230+0800 AFNetworking_fx[3039:154867] -----2:2023-04-04 11:06:00:600---2023-04-04 11:06:00:600------
2023-04-04 11:06:00.600749+0800 AFNetworking_fx[3039:154867] 接收到响应2:example-orig.png, 线程:<NSThread: 0x2824d0f40>{number = 16, name = (null)}
2023-04-04 11:06:00.601729+0800 AFNetworking_fx[3039:154867] 本次接收1:5455,线程:<NSThread: 0x2824d0f40>{number = 16, name = (null)}, url:example-orig.png
2023-04-04 11:06:00.601922+0800 AFNetworking_fx[3039:154874] 2023-04-04 11:06:00:600 -[SystemSessionViewController URLSession:dataTask:didReceiveResponse:completionHandler:] +171 [level:Debug,module:0]
MAT,接收到响应:<NSHTTPURLResponse: 0x2831fa500> { URL: https://tinypng.com/images/example-orig.png } { Status Code: 200, Headers {

logMessage的创建时间是2023-04-04 11:06:00:600,但控制台显示的时间戳是2023-04-04 11:06:00.601922+0800。相差2ms。还以为是didReceiveData的调用跑到didReceiveResponse前面去了,原来是打印的问题。

觉得文章有帮助可以打赏一下哦!