aboutsummaryrefslogtreecommitdiffstats
path: root/Source/SPLogger.m
diff options
context:
space:
mode:
Diffstat (limited to 'Source/SPLogger.m')
-rw-r--r--Source/SPLogger.m183
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]];
}