NSLog : les faire disparaà®tre/apparaà®tre classe par classe

Bonsoir !


 


Je vais essayer d'être clair.


Je travaille avec plusieurs classes.


Je voudrais pouvoir empêcher tous les NSLog d'une classe donnée de s'imprimer.


Et réciproquement, d'activer tous les logs d'une classe facilement.


 


Cela me permettrait de garder des NSlog bien détaillés pour débugguer mais de ne pas vite me retrouver avec un fichier de log immense.


 


Quelque chose est-il dispo sur cocoa pour faire ça ?


 


Merci !


Réponses

  • AliGatorAliGator Membre, Modérateur

    Moi j'utilise CocoaLumberJack -- CLJ pour les intimes -- en corrélation avec le plugin XcodeColors du même auteur (pour avoir des logs en couleurs) plutôt que directement NSLog. Avec des petites macros et configurations de CLJ personnalisées, genre des couleurs selon le niveau de log demandé, des logs organisés par "modules" (dont je peux indiquer pour chacun le niveau de log voulu pour désactiver par exemple tous les logs que j'ai catégorisés dans le module "réseau" d'un coup, etc)


     


    J'en ai déjà  parlé dans le forum, tu devrais retomber dessus en faisant une recherche.


     


    Ca nécessite de se plonger un peu dans CLJ pour comprendre au début le framework (il est très complet donc y'a bcp de possibilités mais du coup peut-être un peu impressionnant au début), mais après c'est assez flexible et si tu te fais ta petite config ça peut être très pratique voire très puissant.


     


     


    Bon après c'est pas la seule astuce possible, tu peux imaginer plein d'autres choses, comme un truc aussi simple que faire toi-même de simples macros qui vont être #define en NSLog ou en rien du tout selon si tu veux les activer (tu peux faire par exemple "#define LogNetwork(args...) NSLog(args)" et #define LogUI(args...) NSLog(args) et quand tu veux désactiver les logs faits avec LogUI, il suffit de remplacer le #define LogUI par un #define vide, tout en gardant le #define LogNetwork actif...


     


    Bref, tu as l'embarras du choix dans les solutions


  • laudemalaudema Membre
    avril 2013 modifié #3

    La plus simple, pas dans Cocoa per se mais dans le pur C, au début du fichier .m de la classe pour laquelle tu veux les supprimer, définir un NSLog() qui reprend tes arguments mais n'en fait rien.


     


     



    #define NSLog(s, ...)
     
    ...
     
        NSLog(@x = %d, y = %d, z = %d, x, y, z);
        printf("x : %d y : %d z : %d\n",x,y,z);
     
    /* x : 4 y : 3 z : 7 */ 

     


    hth


  • Merci pour vos réponses !


     


    @AliGator :


    J'ai mis en place ce superbe outil qu'est CocoaLumberJack.


    J'ai un petit problème qui devrait être très simple pour toi (je suis encore en train d'apprendre xcode, cocoa, etc.)


    J'ai copié dans le fichier Prefix.pch les lignes suivantes : 




    //


    // Prefix header for all source files of the 'dictionnaire' target in the 'dictionnaire' project


    //


     


    #ifdef __OBJC__


        #import <Cocoa/Cocoa.h>


        #import "DDLog.h"


    #endif


     


    #ifdef DEBUG


        static const int ddLogLevel = LOG_LEVEL_VERBOSE;


    #else


        static const int ddLogLevel = LOG_LEVEL_ERROR;


    #endif


     


     


    Mais maintenant, je souhaiterais, en plus, pouvoir désactiver les logs dans une classe.


     


    J'ai donc ajouté dans une de mes classes :


     



    #import "MyClass.h"
    #import "DDLog.h"

    static const int ddLogLevel = LOG_LEVEL_ERROR;

    @implementation MyClass

    - (void)someMethod
    {
    DDLogVerbose(@Meet George Jetson);
    }

    @end

     


     


     


    à‰videmment, ça ne marche pas, il me dit :



    Redefinition of 'ddLogLevel'

     


    Comment puis-je m'en sortir ?


    Enlever la déclaration de ddLogLevel dans le Prefix.pch et changer l'entête automatique de mes classes ?




    Je précise que (pour l'instant en tout cas) je ne suis pas intéressé par la distinction Debug/Release.


     


    Merci !

  • AliGatorAliGator Membre, Modérateur
    avril 2013 modifié #5
    Si tu veux pouvoir redéfinir ddLogLevel, il ne vaut pas le déclarer en static car en effet tu vas le définir 2 fois, une fois dans le pch l'autre dans ton fichier.


    J'aurai plutôt fait pour le coup un "extern int ddLogLevel" dans ton pch, pour pouvoir le redéfinir.


    Mais il y a mieux, apparemment, si tu lis bien la doc de CLJ et ses pages de son Wiki (en particulier le paragraphe "But what if we wanted to take it to the next level after that?")


    J'ai pas testé mais d'après ce qui est dit, tu peux rajouter une méthode +(int)ddLogLevel à  ta classe pour donner à  cette classe spécifique un niveau de log dédié différent du reste, et CLJ saura la détecter et tout faire tout seul...
Connectez-vous ou Inscrivez-vous pour répondre.