|
// |
|
// MBDDFormatter.m |
|
// |
|
// Created by Pay on 13/2/1. |
|
// Copyright (c) 2013年 Octalord. The MIT License. |
|
// |
|
|
|
#import "OLDDFormatter.h" |
|
#import "OLCustomDDLog.h" |
|
#import <unistd.h> |
|
#import <libkern/OSAtomic.h> |
|
|
|
@implementation OLDDFormatter |
|
|
|
#pragma mark - class lifecycle |
|
|
|
- (id) init |
|
{ |
|
self = [super init]; |
|
|
|
if (self) { |
|
_appName = [[NSProcessInfo processInfo] processName]; |
|
} |
|
|
|
return self; |
|
} |
|
|
|
- (void) dealloc |
|
{ |
|
[_threadUnsafeDateFormatter release]; |
|
[_appName release]; |
|
[super dealloc]; |
|
} |
|
|
|
- (NSString *) stringFromDate:(NSDate *)date |
|
{ |
|
int32_t loggerCount = OSAtomicAdd32(0, &_atomicLoggerCount); |
|
|
|
static NSString *dateFormatString = @"yyyy-MM-dd HH:mm:ss.SSS"; |
|
|
|
if (loggerCount <= 1) { |
|
// Single-threaded mode. |
|
|
|
if (_threadUnsafeDateFormatter == nil) { |
|
_threadUnsafeDateFormatter = [[NSDateFormatter alloc] init]; |
|
[_threadUnsafeDateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4]; |
|
[_threadUnsafeDateFormatter setDateFormat:dateFormatString]; |
|
} |
|
|
|
return [_threadUnsafeDateFormatter stringFromDate:date]; |
|
} else { |
|
// Multi-threaded mode. |
|
// NSDateFormatter is NOT thread-safe. |
|
|
|
NSString *key = @"MyCustomFormatter_NSDateFormatter"; |
|
|
|
NSMutableDictionary *threadDictionary = [[NSThread currentThread] threadDictionary]; |
|
NSDateFormatter *dateFormatter = [threadDictionary objectForKey:key]; |
|
|
|
if (dateFormatter == nil) { |
|
dateFormatter = [[NSDateFormatter alloc] init]; |
|
[dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4]; |
|
[dateFormatter setDateFormat:dateFormatString]; |
|
|
|
[threadDictionary setObject:dateFormatter forKey:key]; |
|
|
|
[dateFormatter release]; |
|
|
|
dateFormatter = [threadDictionary objectForKey:key]; |
|
} |
|
|
|
return [dateFormatter stringFromDate:date]; |
|
} |
|
} |
|
|
|
#pragma mark - protocol DDLogFormatter |
|
|
|
- (NSString *) formatLogMessage:(DDLogMessage *)logMessage |
|
{ |
|
NSString *logLevel = nil; |
|
|
|
switch (logMessage->_flag) { |
|
case DDLogFlagError: |
|
logLevel = @"[ERROR]"; |
|
break; |
|
|
|
case DDLogFlagWarning: |
|
logLevel = @"[WARN ]"; |
|
break; |
|
|
|
case DDLogFlagInfo: |
|
logLevel = @"[INFO ]"; |
|
break; |
|
|
|
case DDLogFlagDebug: |
|
logLevel = @"[DEBUG]"; |
|
break; |
|
|
|
default: |
|
logLevel = @"[VERBO]"; |
|
break; |
|
} |
|
|
|
NSString *dateAndTime = [self stringFromDate:(logMessage->_timestamp)]; |
|
NSString *logMsg = logMessage->_message; |
|
|
|
return [NSString stringWithFormat:@"%@ %@[%d:%@] %@ [Line %d] %5@ %@", |
|
dateAndTime, |
|
_appName, |
|
(int)getpid(), |
|
[logMessage threadID], |
|
logMessage.function, // __PRETTY_FUNCTION__, @see OLCustomDDLog.h |
|
logMessage->_line, |
|
logLevel, |
|
logMsg]; |
|
} |
|
|
|
@end |