diff options
Diffstat (limited to 'Source/SPLogger.m')
-rw-r--r-- | Source/SPLogger.m | 183 |
1 files changed, 37 insertions, 146 deletions
diff --git a/Source/SPLogger.m b/Source/SPLogger.m index 83c5b49c..d492fe32 100644 --- a/Source/SPLogger.m +++ b/Source/SPLogger.m @@ -25,21 +25,8 @@ #import "SPLogger.h" -#include <pwd.h> -#include <stdio.h> -#include <dirent.h> -#include <sys/dir.h> -#include <sys/types.h> - static SPLogger *logger = nil; -@interface SPLogger (PrivateAPI) - -- (void)_initLogFile; -- (void)_outputTimeString; - -@end - /** * This is a small class intended to aid in user issue debugging; by including * the header file, and using [[SPLogger logger] log:@"String with format", ...] @@ -53,9 +40,6 @@ static SPLogger *logger = nil; @implementation SPLogger -@synthesize dumpLeaksOnTermination; -@synthesize removeOldLeakDumpsOnTermination; - /* * Returns the shared logger object. */ @@ -93,10 +77,41 @@ static SPLogger *logger = nil; - (id)init { if ((self = [super init])) { + NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDesktopDirectory, NSUserDomainMask, YES); + NSString *logFilePath = [NSString stringWithFormat:@"%@/Sequel Pro Debug Log.txt", [paths objectAtIndex:0]]; + initializedSuccessfully = YES; - [self setDumpLeaksOnTermination:NO]; - [self setRemoveOldLeakDumpsOnTermination:YES]; + // Check if the debug file exists, and is writable + if ( [[NSFileManager defaultManager] fileExistsAtPath:logFilePath] ) { + if ( ![[NSFileManager defaultManager] isWritableFileAtPath:logFilePath] ) { + initializedSuccessfully = NO; + NSRunAlertPanel(@"Logging error", @"Log file exists but is not writeable; no debug log will be generated!", @"OK", nil, nil); + } + + // Otherwise try creating one + } else { + if ( ![[NSFileManager defaultManager] createFileAtPath:logFilePath contents:[NSData data] attributes:nil] ) { + initializedSuccessfully = NO; + NSRunAlertPanel(@"Logging error", @"Could not create log file for writing; no debug log will be generated!", @"OK", nil, nil); + } + } + + // Get a file handle to the file if possible + if (initializedSuccessfully) { + logFileHandle = [NSFileHandle fileHandleForWritingAtPath:logFilePath]; + if (!logFileHandle) { + initializedSuccessfully = NO; + NSRunAlertPanel(@"Logging error", @"Could not open log file for writing; no debug log will be generated!", @"OK", nil, nil); + } else { + [logFileHandle retain]; + [logFileHandle seekToEndOfFile]; + NSString *bundleName = [[NSFileManager defaultManager] displayNameAtPath:[[NSBundle mainBundle] bundlePath]]; + NSMutableString *logStart = [NSMutableString stringWithString:@"\n\n\n==========================================================================\n\n"]; + [logStart appendString:[NSString stringWithFormat:@"%@ (r%ld)\n", bundleName, (long)[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"] integerValue]]]; + [logFileHandle writeData:[logStart dataUsingEncoding:NSUTF8StringEncoding]]; + } + } } return self; @@ -105,11 +120,9 @@ static SPLogger *logger = nil; #pragma mark - #pragma mark Logging functions -- (void)log:(NSString *)theString, ... +- (void) log:(NSString *)theString, ... { if (!initializedSuccessfully) return; - - if (!logFileHandle) [self _initLogFile]; // Extract any supplied arguments and build the formatted log string va_list arguments; @@ -118,138 +131,16 @@ static SPLogger *logger = nil; va_end(arguments); // Write the log line, forcing an immediate write to disk to ensure logging - [logFileHandle writeData:[[NSString stringWithFormat:@"%@ %@\n", [[NSDate date] descriptionWithCalendarFormat:@"%H:%M:%S" timeZone:nil locale:[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]], logString] dataUsingEncoding:NSUTF8StringEncoding]]; + [logFileHandle writeData:[[NSString stringWithFormat:@"%@ %@\n", [[NSDate date] descriptionWithCalendarFormat:@"%H:%M:%S" timeZone:nil locale:[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]], logString] dataUsingEncoding:NSUTF8StringEncoding]]; [logFileHandle synchronizeFile]; [logString release]; } -- (void)dumpLeaks -{ - if ([self dumpLeaksOnTermination]) { - - char *lgn; - struct passwd *pw; - boolean_t hdir = FALSE; - - // Determine where to write the log to - if ((lgn = getlogin()) == NULL || (pw = getpwnam(lgn)) == NULL) { - fprintf(stderr, "Unable to get user info, falling back to /tmp\n"); - } - else { - hdir = TRUE; - } - - // If required remove old logs - if ([self removeOldLeakDumpsOnTermination]) { - - int cnt, cnt2, i; - int isSPLeaksLog(); - struct direct **files; - - cnt = scandir("/tmp", &files, isSPLeaksLog, NULL); - - char fpath[32], fpath2[32], fpath3[64]; - - for (i = 0; i < cnt; i++) - { - snprintf(fpath, sizeof(fpath), "/tmp/%s", files[i]->d_name); - - if (remove(fpath) != 0) { - printf("Unable to remove Sequel Pro leaks log '%s'\n", files[i]->d_name); - } - } - - free(&files); - - if (hdir) { - snprintf(fpath2, sizeof(fpath2), "%s/Desktop", pw->pw_dir); - - cnt2 = scandir(fpath2, &files, isSPLeaksLog, NULL); - - for (i = 0; i < cnt2; i++) - { - snprintf(fpath3, sizeof(fpath3), "%s/%s", fpath2, files[i]->d_name); - - if (remove(fpath3) != 0) { - printf("Unable to remove Sequel Pro leaks log '%s'\n", files[i]->d_name); - } - } - } - } - - size_t len; - FILE *fp, *fp2; - char cmd[32], file[64], buf[512]; - - snprintf(cmd, sizeof(cmd), "/usr/bin/leaks %d", getpid()); - snprintf(file, sizeof(file), (hdir) ? "%s/Desktop/sp.leaks.%d.log" : "%s/sp.leaks.%d.log", (hdir) ? pw->pw_dir : "/tmp", getpid()); - - // Write new leaks log - if ((fp = popen(cmd, "r")) && (fp2 = fopen(file, "w"))) { - - while (len = fread(buf, 1, sizeof(buf), fp)) - { - fwrite(buf, 1, len, fp2); - } - - pclose(fp); - } - } -} - -int isSPLeaksLog(struct direct *entry) -{ - return (strstr(entry->d_name, "sp.leaks") != NULL); -} - -- (void)_initLogFile -{ - NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDesktopDirectory, NSUserDomainMask, YES); - NSString *logFilePath = [NSString stringWithFormat:@"%@/Sequel Pro Debug Log.log", [paths objectAtIndex:0]]; - - NSFileManager *fileManager = [NSFileManager defaultManager]; - - // Check if the debug file exists, and is writable - if ([fileManager fileExistsAtPath:logFilePath]) { - if (![fileManager isWritableFileAtPath:logFilePath]) { - initializedSuccessfully = NO; - NSRunAlertPanel(@"Logging error", @"Log file exists but is not writeable; no debug log will be generated!", @"OK", nil, nil); - } - // Otherwise try creating one - } - else { - if (![fileManager createFileAtPath:logFilePath contents:[NSData data] attributes:nil]) { - initializedSuccessfully = NO; - NSRunAlertPanel(@"Logging error", @"Could not create log file for writing; no debug log will be generated!", @"OK", nil, nil); - } - } - - // Get a file handle to the file if possible - if (initializedSuccessfully) { - logFileHandle = [NSFileHandle fileHandleForWritingAtPath:logFilePath]; - - if (!logFileHandle) { - initializedSuccessfully = NO; - NSRunAlertPanel(@"Logging error", @"Could not open log file for writing; no debug log will be generated!", @"OK", nil, nil); - } - else { - [logFileHandle retain]; - [logFileHandle seekToEndOfFile]; - - NSString *bundleName = [fileManager displayNameAtPath:[[NSBundle mainBundle] bundlePath]]; - NSMutableString *logStart = [NSMutableString stringWithString:@"\n\n\n==========================================================================\n\n"]; - - [logStart appendString:[NSString stringWithFormat:@"%@ (r%ld)\n", bundleName, (long)[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"] integerValue]]]; - [logFileHandle writeData:[logStart dataUsingEncoding:NSUTF8StringEncoding]]; - } - } -} - -- (void)_outputTimeString +- (void) outputTimeString { if (!initializedSuccessfully) return; - + [logFileHandle writeData:[[NSString stringWithFormat:@"Launched at %@\n\n", [[NSDate date] description]] dataUsingEncoding:NSUTF8StringEncoding]]; } |