Arcane fournit une classe utilitaire (Arcane::TraceAccessor) pour afficher des traces dans les modules. Cette classe permet de gérer plusieurs types de traces : informations, erreurs, ...
Si dans le descripteur de module, l'attribut parent-name
de l'élément module
vaut Arcane::BasicModule
(le défaut), les traces sont automatiquement disponibles.
Les traces s'utilisent comme des flots classiques en C++, grâce à l'operateur <<.
Par exemple, pour afficher une trace d'information :
Tous les types C++ qui disposent de l'opérateur operator<<()
peuvent être tracés. Par exemple :
A noter qu'un retour chariot est effectué automatiquement entre chaque message. Par conséquent l'ajout d'un retour chariot en fin de trace provoque un saut de ligne.
Les méthodes de trace sont :
Les traces d'avertissement ou d'erreur (Arcane::TraceAccessor::warning(), Arcane::TraceAccessor::error() et Arcane::TraceAccessor::fatal()) sont toujours affichées. Pour les traces d'informations (Arcane::TraceAccessor::info()) et de débug (Arcane::TraceAccessor::debug()), le comportement dépend de l'exécution séquentielle ou parallèle et si ARCANE est compilée en mode débug ou optimisé:
debug()
est remplacée par une méthode vide ce qui fait qu'elle ne prend aucune ressource CPU.Les traces de log sont écrites dans un fichier dans le répertoire 'listing', sous le nom 'log.n', avec 'n' le numéro du sous-domaine.
Il existe 4 méthodes pour la gestion parallèle des traces :
Pour pinfo(), chaque sous-domaine affiche le message. Pour les autres (Arcane::TraceAccessor::pwarning(), Arcane::TraceAccessor::perror() et Arcane::TraceAccessor::pfatal()), cela signifie que chaque sous-domaine appelle cette méthode (opération collective), et donc une seule trace sera affichée. Ces traces parallèles peuvent par exemple être utiles lorsqu'on est certain que l'erreur produite le sera par tous les processeurs, par exemple, une erreur dans le jeu de données. Il faut prendre soin que tous les sous-domaines appellent les méthodes collectives, car cela peut conduire à un blocage du code dans le cas contraire.
Il faut noter qu'en cas d'appel à la méthode Arcane::TraceAccessor::fatal() en parallèle, les processus sont en général tués sans ménagement. Avec Arcane::TraceAccessor::pfatal(), il est possible d'arrêter le code proprement puisque chaque sous-domaine génère l'erreur.
Il existe trois niveaux de traces pour la catégorie debug
: Arccore::Trace::Low, Arccore::Trace::Medium et Arccore::Trace::High. Le niveau par défaut est Arccore::Trace::Medium.
Il est possible de configurer le niveau de debug souhaité et l'utilisation des traces d'informations pour chaque module dans le fichier de configuration de ARCANE. Ce fichier de configuration utilisateur permet de modifier le comportement par défaut de certains éléments de l'architecture tels que l'affichage des traces. Il est nommé config.xml et se trouve dans le répertoire .arcane
du compte de l'utilisateur qui lance l'exécution.
La configuration se fait avec les attributs name
, info
et debug
de l'élément trace-module
. Cet élément doit être fils de l'élément traces
.
Voici un exemple de fichier :
Dans l'exemple, l'utilisateur demande à ce que les traces d'informations pour tous les modules soient par défaut activés et pas les traces de debug. Pour le module Hydro, sont affichées les traces d'informations et les traces de debug jusqu'au niveau medium. Pour la classe de message ParallelMng, on affiche les infos et le temps écoulé mais pas le nom de la classe du message (c'est-à-dire le début de la ligne '*I-ParallelMng'.
Il est possible de changer dynamiquement les informations d'une classe de message. Par exemple le code suivant permet depuis un module ou service de changer le niveau de verbosité et d'afficher le temps écoulé mais pas le nom de la classe de message :