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;
} |
Partager