LINUX.ORG.RU

История изменений

Исправление Gyros, (текущая версия) :

Все время меня тянет использовать strftime.

Вот ф-ция вывода сообщения (с миллисекундами) в лог-файл без strftime:

void log_print_ms(LOG *log, enum msg_type type, const char* msg)
{
    if (log->f)
    {
       	struct timespec ts;
        clock_gettime(CLOCK_REALTIME, &ts);
	struct tm *lt = localtime(&ts.tv_sec);
        const char fmt[]="[%s]: [%02d/%02d/%4d  %02d:%02d:%02d:%03d] %s\n";       
        fprintf(log->f, fmt, get_type_msg(type), lt->tm_mday, lt->tm_mon+1, lt->tm_year+1900, lt->tm_hour, lt->tm_min, lt->tm_sec, (int)(1e-6*ts.tv_nsec), msg); 
    }
}

Макрос для вывода сразу и на экран, и в лог-файл:

#define PRINT_MSG(type_msg, log, msg) { const char fmt[]="%s";                         \
                                     int sz = snprintf(NULL, 0, fmt, msg);             \
				     char message[sz];                                 \
				     snprintf(message, sz, msg);                       \
				     if (ERROR_MSG==type_msg || FATAL_MSG==type_msg)   \
					fprintf(stderr, "%s\n", message);              \
				     else                                              \
                                        printf("%s\n", message);                       \
                                     if (log !=NULL) if (log.f) log_print_ms(log, type_msg, message); }

Или лучше не макрос, а функцию сделать?

Самв структура лог-файла:

enum msg_type
     {
       DEBUG_MSG,    // debug message
       INFO_MSG,     // info message
       WARNING_MSG,  // warning message
       ERROR_MSG,    // error message
       FATAL_MSG     // critical message
     };

typedef struct LOG
{
    FILE  *f;
    char file_name[TINY_SIZE];
} LOG;

void log_print   (LOG *log, enum msg_type type, const char* msg);
void log_print_ms(LOG *log, enum msg_type type, const char* msg);
void log_init(LOG *log, const char* fileName);
void log_close(LOG *log);

Исправление Gyros, :

Все время меня тянет использовать strftime.

Вот ф-ция вывода сообщения (с миллисекундами) в лог-файл без strftime:

void log_print_ms(LOG *log, enum msg_type type, const char* msg)
{
    if (log->f)
    {
       	struct timespec ts;
        clock_gettime(CLOCK_REALTIME, &ts);
	struct tm *lt = localtime(&ts.tv_sec);
        const char fmt[]="[%s]: [%02d/%02d/%4d  %02d:%02d:%02d:%03d] %s\n";       
        fprintf(log->f, fmt, get_type_msg(type), lt->tm_mday, lt->tm_mon+1, lt->tm_year+1900, lt->tm_hour, lt->tm_min, lt->tm_sec, (int)(1e-6*ts.tv_nsec), msg); 
    }
}

Макрос для вывода сразу и на экран, и в лог-файл:

#define PRINT_MSG(type_msg, log, msg) { const char fmt[]="%s";                        \
                                     int sz = snprintf(NULL, 0, fmt, msg);             \
				     char message[sz];                                 \
				     snprintf(message, sz, msg);                       \
				     if (ERROR_MSG==type_msg || FATAL_MSG==type_msg)   \
					fprintf(stderr, "%s\n", message);              \
				     else                                              \
                                        printf("%s\n", message);                       \
                                     if (log !=NULL) if (log.f) log_print_ms(log, type_msg, message); }

Или лучше не макрос, а функцию сделать?

Самв структура лог-файла:

enum msg_type
     {
       DEBUG_MSG,    // debug message
       INFO_MSG,     // info message
       WARNING_MSG,  // warning message
       ERROR_MSG,    // error message
       FATAL_MSG     // critical message
     };

typedef struct LOG
{
    FILE  *f;
    char file_name[TINY_SIZE];
} LOG;

void log_print   (LOG *log, enum msg_type type, const char* msg);
void log_print_ms(LOG *log, enum msg_type type, const char* msg);
void log_init(LOG *log, const char* fileName);
void log_close(LOG *log);

Исходная версия Gyros, :

Все время меня тянет использовать strftime.

Вот ф-ция вывода сообщения (с миллисекундами) в лог-файл без strftime:

void log_print_ms(LOG *log, enum msg_type type, const char* msg)
{
    if (log->f)
    {
       	struct timespec ts;
        clock_gettime(CLOCK_REALTIME, &ts);
	struct tm *lt = localtime(&ts.tv_sec);
        const char fmt[]="[%s]: [%02d/%02d/%4d  %02d:%02d:%02d:%03d] %s\n";       
        fprintf(log->f, fmt, get_type_msg(type), lt->tm_mday, lt->tm_mon+1, lt->tm_year+1900, lt->tm_hour, lt->tm_min, lt->tm_sec, (int)(1e-6*ts.tv_nsec), msg); 
    }
}

Макрос для вывода сразу и на экран, и в лог-файл:

#define PRINT_MSG1(type_msg, log, msg) { const char fmt[]="%s";                        \
                                     int sz = snprintf(NULL, 0, fmt, msg);             \
				     char message[sz];                                 \
				     snprintf(message, sz, msg);                       \
				     if (ERROR_MSG==type_msg || FATAL_MSG==type_msg)   \
					fprintf(stderr, "%s\n", message);              \
				     else                                              \
                                        printf("%s\n", message);                       \
                                     if (log !=NULL) if (log.f) log_print_ms(log, type_msg, message); }

Или лучше не макрос, а функцию сделать?

Самв структура лог-файла:

enum msg_type
     {
       DEBUG_MSG,    // debug message
       INFO_MSG,     // info message
       WARNING_MSG,  // warning message
       ERROR_MSG,    // error message
       FATAL_MSG     // critical message
     };

typedef struct LOG
{
    FILE  *f;
    char file_name[TINY_SIZE];
} LOG;

void log_print   (LOG *log, enum msg_type type, const char* msg);
void log_print_ms(LOG *log, enum msg_type type, const char* msg);
void log_init(LOG *log, const char* fileName);
void log_close(LOG *log);