36 votes

Niveau de journal global pour CocoaLumberjack

J'utilise CocoaLumberjack dans un projet iPhone, pour enregistrer certaines informations.

J'ai suivi le guide de démarrage Tout fonctionne bien, mais il y a une chose qui me dérange : il ne semble pas y avoir de moyen élégant de définir un niveau de log pour l'ensemble de l'application. Pour que cela fonctionne, je dois définir une constante dans chaque fichier source, comme ceci :

static const int ddLogLevel = LOG_LEVEL_VERBOSE;

Existe-t-il un moyen de définir un niveau de journal global pour l'application ?

J'ai trouvé cet article sur le sujet, mais je dois toujours ajouter un #import dans chaque fichier...

21voto

FreeAsInBeer Points 9791

Vous pourriez utiliser un #include dans votre fichier *.pch afin qu'il soit automatiquement inclus dans tous les fichiers de votre projet.

0 votes

Aussi - Pour personnaliser sur une base par fichier, changez ddLogLevel en non-const, et la définir dans la méthode +initialize de la classe du fichier spécifique (Cela fonctionne parce que chaque fichier .m obtient sa propre variable statique ddLogLevel). Note : Les classes peuvent appeler la méthode +initialize de leur superclasse, donc pour éviter les bogues potentiels, utilisez la méthode +initialize. if (self == [ClassName self]) dans la méthode.

4 votes

Le problème est que les fichiers .pch ne sont plus fournis par défaut dans les projets Xcode. Vous devriez probablement les considérer comme obsolètes.

18voto

Marcos Crispino Points 1402

Je n'ai pas trouvé de meilleur moyen de le faire que celui expliqué dans l'article Je l'ai mentionné dans la question.

Constant.h

extern int const ddLogLevel;

Constant.m

#import "Constants.h"
#import "DDLog.h"

int const ddLogLevel = LOG_LEVEL_VERBOSE;

Configuration de l'enregistreur

#import "DDLog.h"
#import "DDASLLogger.h"
#import "DDTTYLogger.h"
#import "DDFileLogger.h"

...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

 [DDLog addLogger:[DDASLLogger sharedInstance]];
 [DDLog addLogger:[DDTTYLogger sharedInstance]];

 DDFileLogger *fileLogger = [[DDFileLogger alloc] init]; 
 [DDLog addLogger:fileLogger];
 [fileLogger release];

...

Importez votre classe

#import "DDLog.h"
#import "Constants.h"

...

- (void)someMethod {
 DDLogVerbose(@"Log this message");
}

0 votes

Y a-t-il un moyen de faire de la journalisation dynamique avec cela ?

7 votes

Veuillez éviter les réponses où la seule source d'information est un lien externe. Citez au moins les points essentiels de la ressource, afin d'éviter le pourrissement du lien.

0 votes

Je vois ce que vous faites @Marcos Crispino mais je suppose que cela ne fonctionnera que si la seule constante qui est définie dans Constants.h est la constante d'enregistrement (par opposition à la présence de toutes vos constantes globales dans ce fichier). dans ce cas, le nom Constants.h est trompeuse, car elle est spécifique au niveau du journal. Je l'appellerais plutôt GlobalLogLevel.h ou quelque chose qui décrit plus précisément et limite la portée de ce dossier

5voto

DareDevil Points 313

Vous pouvez utiliser ceci dans votre fichier *.pch pour obtenir automatiquement différents niveaux de logs globaux selon la configuration actuelle de votre build. [pour xcode 4+]

#ifdef DEBUG
  static const int ddLogLevel = LOG_LEVEL_VERBOSE;
#else
  static const int ddLogLevel = LOG_LEVEL_WARN;
#endif

ou Si vous avez besoin d'un niveau de journalisation différent pour chaque enregistreur, vous pouvez facilement y parvenir en utilisant la méthode DDLog +addLogger:withLogLevel :.

[DDLog addLogger:[DDASLLogger sharedInstance] withLogLevel:LOG_LEVEL_INFO];
[DDLog addLogger:[DDTTYLogger sharedInstance] withLogLevel:LOG_LEVEL_DEBUG];

Définir un niveau de journal dans chaque fichier source que vous avez mentionné a un avantage. Vous pouvez utiliser le niveau de journalisation verbose uniquement pour la partie sur laquelle vous travaillez actuellement. Pour les autres parties, vous pouvez utiliser d'autres niveaux comme info, warn, error.

0 votes

.pch ne doivent pas être utilisés, ils sont obsolètes.

5voto

Ido Tene Points 69

Afin d'injecter dynamiquement le niveau du journal (par exemple, à partir du fichier de configuration) :

1) Créez une nouvelle classe nommée DDLogLevel avec le code suivant :

#import "DDLogLevel.h"
#import "DDLog.h"

@implementation DDLogLevel

static int _ddLogLevel = LOG_LEVEL_VERBOSE;

+ (int)ddLogLevel
{
    return _ddLogLevel;
}

+ (void)ddSetLogLevel:(int)logLevel
{
    _ddLogLevel = logLevel;
}

@end

2) Dans DDLogLevel.h, trouvez la ligne qui contient l'instruction suivante :

#ifndef LOG_LEVEL_DEF
    #define LOG_LEVEL_DEF ddLogLevel
#endif

Et le remplacer par :

#ifndef LOG_LEVEL_DEF
    #define LOG_LEVEL_DEF [DDLogLevel ddLogLevel]
#endif

3) Enfin, appelez depuis votre processus d'initialisation (peut-être depuis appDelegate) à ddSetLogLevel avec le niveau souhaité.

1voto

jonahb Points 1578

Dans votre fichier pch :

#include "DDLog.h"
#undef LOG_LEVEL_DEF
#define LOG_LEVEL_DEF LOG_LEVEL_VERBOSE

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X