История изменений
Исправление 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);