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:
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.