]> err.no Git - sope/commitdiff
fixed bugs in logger, improved performance
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Fri, 19 Nov 2004 02:59:04 +0000 (02:59 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Fri, 19 Nov 2004 02:59:04 +0000 (02:59 +0000)
git-svn-id: http://svn.opengroupware.org/SOPE/trunk@400 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-core/NGExtensions/ChangeLog
sope-core/NGExtensions/FdExt.subproj/NSObject+Logs.m
sope-core/NGExtensions/NGExtensions/NGLogger.h
sope-core/NGExtensions/NGLogging.subproj/ChangeLog
sope-core/NGExtensions/NGLogging.subproj/NGLogAppender.m
sope-core/NGExtensions/NGLogging.subproj/NGLogConsoleAppender.m
sope-core/NGExtensions/NGLogging.subproj/NGLogger.m
sope-core/NGExtensions/NGLogging.subproj/NGLoggerManager.m
sope-core/NGExtensions/Version

index 5ebd4eccc0554ec1ecc3b4b2ff4fb679ea589a61..79692e2a874a3749b04d71f1820c9194b7721368 100644 (file)
@@ -1,3 +1,13 @@
+2004-11-19  Helge Hess  <helge.hess@opengroupware.org>
+
+       * v4.5.135
+       
+       * FdExt.subproj/NSObject+Logs.m: fixed a bug in default logger creation
+         (incorrect static variable)
+       
+       * NGLogging: fixed bug in console appender, increased speed, avoid
+         different logger objects for each class
+
 2004-11-18  Marcus Mueller  <znek@mulle-kybernetik.com>
 
        * v4.5.134
index f1091470e426d54252f04e7abd861b226a38432e..a64f4eeca432e3fe7f543b0c932fe519538ad1e2 100644 (file)
@@ -47,9 +47,13 @@ static inline Class NSStringClass(void) {
   if (logger == nil) {
     NGLoggerManager *lm;
     
-    // TODO: broken. If [self class] is passed in, 'logger' can't be a static
-    lm     = [NGLoggerManager defaultLoggerManager];
+    lm = [NGLoggerManager defaultLoggerManager];
+
+#if 0 // broken: if [self class] is passed in, 'logger' can't be a static
     logger = [lm loggerForClass:[self class]];
+#else
+    logger = [lm loggerForClass:[NSObject class]];
+#endif
   }
   return logger;
 }
index da894ebb3c6295fc921c27af57d1ea2ec142441f..9ddb2de6acbf3cfb55076ee1b849905dfad5498e 100644 (file)
@@ -48,6 +48,7 @@
   id         _appender; // going away as soon as we have a config
 }
 
++ (id)defaultLogger;
 - (id)initWithLogLevel:(NGLogLevel)_level;
 
 /* accessors */
index 469c509b6299dd127b0e4446b01711041e1b2d0a..5a13bd6552466b3d25d488c2401a86159993a042 100644 (file)
@@ -1,3 +1,12 @@
+2004-11-19  Helge Hess  <helge.hess@opengroupware.org>
+
+       * NGLoggerManager.m: use default logger if none is registered
+
+       * NGLogger.m: cleaned up -init, added default logger
+
+       * NGLogConsoleAppender.m: removed the bug with using a message in
+         place of a format, rewrote logger to be sufficiently fast
+
 2004-11-18  Marcus Mueller  <znek@mulle-kybernetik.com>
 
        * NGLogLevel.h: new header bearing the log levels
index 4ae5e3a78229018066f8a6cbb48a3f4955781084..324315ea1d44c36ec517a9b74a84a1b1e06776d8 100644 (file)
@@ -38,7 +38,7 @@
 - (NSString *)formattedEvent:(NGLogEvent *)_event {
   NSMutableString *fe;
   NSString        *lvl;
-
+  
   lvl = [self localizedNameOfLogLevel:[_event level]];
   fe = [NSMutableString stringWithCapacity:128];
   if (lvl != nil) {
index ad624a255f88ca540e54e2d2232ebe4e18d81435..645dea4c114218d463da3b9edc4f4fc6d9834897 100644 (file)
 
 #include "NGLogConsoleAppender.h"
 #include "NGLogEvent.h"
+#include "common.h"
+#include <sys/types.h>
+#include <unistd.h>
 
 @implementation NGLogConsoleAppender
 
+static Class NSCalendarDateClass = Nil;
+static Class NSProcessInfoClass  = Nil;
+static unsigned char *processName = NULL;
+
+static char *monthNames[14] = {
+  "Dec", 
+  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
+  "Jan"
+};
+
++ (void)initialize {
+  if (NSCalendarDateClass == Nil)
+    NSCalendarDateClass = [NSCalendarDate class];
+  if (NSProcessInfoClass == Nil)
+    NSProcessInfoClass = [NSProcessInfo class];
+
+  if (processName == NULL) {
+    /* process name can't change, right? */
+    unsigned len;
+    NSString *pn;
+    
+    pn  = [[NSProcessInfoClass processInfo] processName];
+    len = [pn cStringLength];
+    
+    processName = malloc(len + 4);
+    [pn getCString:processName];
+  }
+}
+
+static __inline__ unsigned char * levelPrefixForEvent(NGLogEvent *_event) {
+  switch ([_event level]) {
+  case NGLogLevelWarn:  return "[WARN]";
+  case NGLogLevelError: return "[ERROR]";
+  case NGLogLevelFatal: return "[FATAL]";
+  default:              return "";
+  }
+}
+
 - (void)appendLogEvent:(NGLogEvent *)_event {
-  // TODO: broken, NSLog takes a format string
-  NSLog([self formattedEvent:_event]);
+  /* Note: pid can change after a fork() */
+  NSCalendarDate *date;
+  
+  // TODO: get time using libc function, cheaper
+  // TODO: set to GMT?
+  date = [[NSCalendarDateClass alloc] init];
+  
+  // TODO: cString for message is expensive
+  fprintf(stderr,
+         "%s %02i %02i:%02i:%02i %s [%d]: %s\n",
+         monthNames[[date monthOfYear]],
+         [date dayOfMonth],
+         [date hourOfDay], [date minuteOfHour], [date secondOfMinute],
+         processName,
+         getpid(),
+         [[_event message] cString]);
+  
+  [date release];
 }
 
 @end /* NGLogConsoleAppender */
index 23105a943fe585e58c512a4e5da14f397f51a243..fd74640682f2e4d8b08988a9e0204ad8bc972ef9 100644 (file)
@@ -41,28 +41,44 @@ static Class NSStringClass = Nil;
   NSStringClass = [NSString class];
 }
 
++ (id)defaultLogger {
+  static NGLogger *logger = nil; // THREAD
+  
+  if (logger == nil)
+    logger = [[self alloc] init];
+  return logger;
+}
+
 - (id)init {
   return [self initWithLogLevel:NGLogLevelAll];
 }
 
-- (id)initWithLogLevel:(NGLogLevel)_level {
-  self = [super init];
-  if (self) {
-    NSUserDefaults *ud;
-    NSString       *appenderClassName;
-
+- (id)initWithLogLevel:(NGLogLevel)_level appender:(id)_appenderParam {
+  if ((self = [super init]) != nil) {
     [self setLogLevel:_level];
-    
-    // TODO: remove this as soon as we have a config
-    ud                = [NSUserDefaults standardUserDefaults];
-    appenderClassName = [ud stringForKey:@"NGLogDefaultAppenderClass"];
-    if (appenderClassName == nil)
-      appenderClassName = @"NGLogConsoleAppender";
-    self->_appender   = [[NSClassFromString(appenderClassName) alloc] init];
+    self->_appender = [_appenderParam retain]; // TODO: fix ivar name
   }
   return self;
 }
 
+- (id)initWithLogLevel:(NGLogLevel)_level {
+  NSUserDefaults *ud;
+  NSString       *appenderClassName;
+  id appender;
+  
+  // TODO: remove this as soon as we have a config
+  ud                = [NSUserDefaults standardUserDefaults];
+  appenderClassName = [ud stringForKey:@"NGLogDefaultAppenderClass"];
+  if (appenderClassName == nil)
+    appenderClassName = @"NGLogConsoleAppender";
+  
+  appender = [[NSClassFromString(appenderClassName) alloc] init];
+  
+  self = [self initWithLogLevel:_level appender:appender];
+  [appender release];
+  return self;
+}
+
 - (void)dealloc {
   [self->_appender release];
   [super dealloc];
index e05f97c7dddf464edac115353c289c553cb1ac4e..550ed3dfa4d38b5f1033d0b75be342d925b1cbb1 100644 (file)
@@ -87,19 +87,20 @@ static NSNull          *sharedNull;
 - (NGLogger *)loggerForFacilityNamed:(NSString *)_name {
   id logger;
   
-  logger = [self->loggerMap objectForKey:_name];
-  if (!logger) {
-    logger = [[NGLogger alloc] init];
-    [self->loggerMap setObject:logger forKey:_name];
-    [logger release];
-  }
+  // TODO: expensive, use a faster map (at least NSMapTable)
+  if ((logger = [self->loggerMap objectForKey:_name]) != nil)
+    return logger;
+  
+  // TODO: is a registration really faster? I guess not?
+  logger = [NGLogger defaultLogger]; /* fallback to shared logger */
+  [self->loggerMap setObject:logger forKey:_name];
   return logger;
 }
 
 - (NGLogger *)loggerForClass:(Class)_clazz {
   NSString *name;
   
-  name = NSStringFromClass(_clazz);
+  name = _clazz != Nil ? NSStringFromClass(_clazz) : nil;
   return [self loggerForFacilityNamed:name];
 }
 
index 93b5fd838ea84b3bd762aa5fff911062b6206b6e..38af7b35d1295a2459434198c5bc0c9f797ef834 100644 (file)
@@ -1,6 +1,6 @@
 # version
 
-SUBMINOR_VERSION:=134
+SUBMINOR_VERSION:=135
 
 # v4.3.115 requires libFoundation v1.0.59
 # v4.2.72  requires libEOControl  v4.2.39