IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Fonction de journalisation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 21
    Par défaut Fonction de journalisation
    Bonjour,
    j'ai écrit une fonction de journalisation pour mon logiciel pour conserver une trace de l'éxécution de mon programme qui est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
     
    char *log_file_name = "trace.log";
    int
    sipchord_trace(char* file, int line, char* log_level, char* fmt, ...)
    {
    	va_list args;
    	char message[LOG_MESSAGE_LENGTH];
    	int message_pos = 0;
    	char log_date[] = "YYYY/MM/DD HH:MM:SS" ;
    	char* p;
    	char* bufstr;
    	int bufint;
    	long buflong;
    	time_t t;
    	struct tm *tm;
    	FILE* fd = NULL;
     
    	va_start (args, fmt);
    	for (p = fmt; (p[0] != '\0') && (message_pos < LOG_MESSAGE_LENGTH); p++)
    	{
    		switch(p[0])
    		{
    			case '%': /* % literal character*/
    				switch (p[1])
    				{
    					case '%' : /*%ld or %li long interger */
    						message[message_pos++] = '%' ;
    					case 'l' :
    						switch (p[2])
    						{
    							case 'd' :
    							case 'i' :
    								buflong = va_arg (args, long);
    								message_pos += snprintf(message + message_pos, LOG_MESSAGE_LENGTH - message_pos, "%ld", buflong);
    								break;
     
    							default   :
    								message[message_pos++] = '?';
    						}
    						p++;
    						break;
    					case 'd' : /* %d or %i long integer */
    					case 'i' :
    						bufint = va_arg (args, int);
    						message_pos += snprintf(message + message_pos, LOG_MESSAGE_LENGTH - message_pos, "%d", bufint);
    						break;
    					case 's' : /* string %s */
    						bufstr = va_arg(args, char*);
    						while((message_pos < LOG_MESSAGE_LENGTH) && (bufstr[0]))
    						{
    							message[message_pos++] = bufstr[0];
    							bufstr++;
    						}
    						break;
    					default :
    						message[message_pos++] = '?';	
     				}
    				p++;
    				break;
    				default :
    					message[message_pos++] = p[0];		
    		}
    	}
    	va_end(args);
    	message[message_pos] = '\0' ;
     
    	t = time(NULL);
    	tm = localtime(&t);
    	strftime(log_date, sizeof(log_date), "%Y/%m/%d %H:%M:%S", tm);
     
    	if (log_file_name) fd = fopen (log_file_name, "a");
    	if (!fd) fd = stderr;
    	fprintf(fd, "%s %s [%12s:%-5d] \n%s\n", log_date, log_level, file, line, message);
    	if ((fd = stderr)) fflush(fd);
    	else fclose(fd);
     
    	return 0;
    }
    Lors de mes tests, cette fonction écrit sur le flux d'erreur stderr si la variable log_file_name est nulle ou dans le flux ouvert par l'appel de fopen(). J'ai inséré cette fonction dans mon programme en créant un fichier log.c et déclaré son prototype dans log.h et ensuite en incluant l'en-tête log.h dans tous mes fichiers *.c, si je n'initialise pas log_file_name, j'obtiens une trace de l'éxecution sur stderr mais lorsque j'initialise log_file_name, comme résultat un flux est ouvert mais je n'obtiens aucune trace dans ce fichier. Pourtant, ce fichier existe. Si quelqu'un aurait une réponse?

    Johnny.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    D'abord je mettrais a+ dans l'ouverture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	if (log_file_name) fd = fopen (log_file_name, "a+");
    Ensuite (sans doute une faute de frappe) tu fais une assignation au lieu d'un test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	if ((fd == stderr)) fflush(fd);
    et enfin je testerais correctement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	if (fd == NULL) fd = stderr;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Fonction API
    Par margilb dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/07/2002, 11h11
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo