Cette réponse date de 2013 mais est toujours largement pertinente.
Avant Mountain Lion, tous les processus gérés par launchd, y compris les applications classiques, redirigeaient leurs descripteurs de fichiers stdout et stderr vers le journal système. À partir de Mountain Lion, stdout et stderr ne vont nulle part pour les applications gérées par launchd. Seuls les messages explicitement envoyés au journal système finiront là-bas.
Si vous écrivez une application et souhaitez que certaines sorties apparaissent dans la console, adoptez une API basée sur syslog(3) ou asl(3) à la place. NSLog est l'une de ces API, et elle a l'avantage de journaliser également vers stderr afin que vous puissiez facilement voir votre sortie peu importe comment vous avez lancé votre application. Si vous souhaitez cette fonctionnalité mais que vous voulez utiliser asl ou syslog directement, alors vous devrez vous intéresser à l'option ASL_OPT_STDERR pour asl_open, et à l'option LOG_PERROR pour openlog respectivement.
En gros, lorsque vous double-cliquez sur une appli (similaire à /usr/bin/open /Applications/SomeApp.app
), il n'y a pas de stdout/stderr. Le développeur est censé envoyer toute sortie/erreurs pertinente aux API de journalisation disponibles telles que NSLog.