Comment désactiver NSLog?

GreensourceGreensource Membre
09:15 modifié dans API AppKit #1
C'est tout simple je voudrais qu'un programme de type Command Line Utility puisse recevoir un argument de type:
./monBeauProg -silent
Auquel cas comme vous vous en douter les NSLog ne ferait plus un bruit, shuuuut...

Un mec sur le net propose de bidouiller un peu il fait:
#ifndef DEBUG<br />#define NSLog //<br />#endif

Ce qui remplace les NSLog par des commentaires
Mais bon c'est quand même pas top...

Je cherche plutôt une option sur NSLog directement.

Réponses

  • AliGatorAliGator Membre, Modérateur
    09:15 modifié #2
    Comme tu veux pouvoir désactiver ces NSLogs à  l'exécution (et non à  la compilation), la solution du #define ne va de toute façon pas te convenir.

    Il faut remplacer tous tes appels à  NSLog par des appels à  MyLog, qui sera une fonction C perso en charge de tester si tu es en mode "silencieux" (et si oui ne rien faire) ou non (et dans ce cas faire le NSLog).


    Bon un truc bâtard en C donnerait qqch comme ça. A traduire en Objective-C/Cocoa (ou pas... tiens je sais pas comment on a accès aux arguments en ligne de commande en Cocoa, autrement qu'en mettant notre code dans le main.m ?)
    A toi ensuite de voir où tu mets la variable booléenne qui va contenir l'état de ton mode silencieux, là  c'est une variable locale donc c'est pas top mais bon...
    #define MyLog(format, ...) if(!silent) NSLog(format, ##__VA_ARGS__)<br /><br />int main(int argc, char* argv&#91;])<br />{<br />  // déterminer si on est en mode silence en regardant si le premier argument vaut &quot;-silent&quot;<br />  int silent = ((argc&gt;0) &amp;&amp; (strcmp(argv[1],&quot;-silent&quot;)==0));<br /><br />  MyLog(@&quot;Coucou ce test n&#39;est affiché que si -silent n&#39;est pas présent.&quot;);<br />  MyLog(@&quot;En effet, silent vaut %d&quot;,silent); // ça ne s&#39;affichera que si silent==0...<br /><br />  return 0;<br />}<br />
    
  • AliGatorAliGator Membre, Modérateur
    09:15 modifié #3
    Bon j'ai ma réponse, c'est NSProcessInfo qui donne les infos des arguments passés en ligne de commande... Donc :
    #define MyLog(format, ...) if (![[[NSProcessInfo processInfo] arguments] containsObject:@&quot;-silent&quot;]) NSLog(format, ## __VA_ARGS__)
    
    Et du coup là  pas de pb de scope de la variable qui teste si tu es en mode silence ou pas, pas de parsing de ligne de commande à  effectuer ("-silent" peut être à  n'importe quel endroit dans ta ligne de commande, ça marchera), ça marchera partout.
  • laudemalaudema Membre
    09:15 modifié #4
    dans 1244816322:

    Je cherche plutôt une option sur NSLog directement.

    Bonjour,

        Dans la doc de NSLog il n'y a pas d'option disponible ! Juste que ça renvoie à  NSLogv et la doc de NSLogv dit que si tu change la destination de STDERR_FILENO alors ça écrira là  aussi (en plus de Apple System Log qu'on peut voir avec l'appli Console).
    Tu pourrais essayer de changer ce STDERR_FILENO en fonction de ton argument -silent dans main mais ça ne sera pas beaucoup plus propre ?
    Et ça ne fonctionnera que pour tes NSLog à  toi: j'ai essayé de faire ça pour des messages envoyés par Cocoa (un bug de ICAApplication dans la fonction importImage) et ça redirigeait bien mes messages mais eux seuls, pas ceux envoyés par Cocoa pour un TextField soit-disant disparu ..
    <br />	//Dirigeons ailleurs la journalisation des erreurs <br />	int old_stderr = dup(STDERR_FILENO);<br />&nbsp;  	close(STDERR_FILENO);<br />&nbsp;  	int fd = open(&quot;/dev/null&quot;, O_WRONLY);<br />&nbsp;  	dup2(fd, STDERR_FILENO);<br />&nbsp;  	close(fd);<br />	<br />	//Ouvrons ensuite le scanner<br />		//Et restaurons la journalisation des erreurs<br />	NSString *imagePath = [self scanNow];<br />	close(STDERR_FILENO);<br />	dup2(old_stderr, STDERR_FILENO);<br />	close(old_stderr);	<br />	// This NSLog will go to the console.<br />&nbsp; &nbsp; &nbsp; &nbsp; NSLog (@&quot;%@&quot;, imagePath);<br />
    

    PS: le code n'est pas de moi http://www.dribin.org/dave/blog/archives/2008/05/27/sb_warnings/
  • GreensourceGreensource Membre
    09:15 modifié #5
    Ok très bien, ça m'ira comme ça je penses. Ta méthode Ali me conviens bien. Merci
Connectez-vous ou Inscrivez-vous pour répondre.