Программирование PC Linux: цветовой вывод текста в консоль с помощью стандартных библиотек Sat, April 27 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Linux: цветовой вывод текста в консоль с помощью стандартных библиотек Печать
Добавил(а) microsin   

В следующем простом примере реализована функция вывода в лог желтым цветом. Вывод производится с помощью макроса clog, который принимает параметры в таком же виде, как и стандартная функция printf. В начале строки лога выводится метка времени в часах, минутах, секундах и миллисекундах.

Заголовочный файл colored_log.h:

#include < stdint.h>
 
#define ANSI_COLOR_RED "\x1b[31m"
#define ANSI_COLOR_GREEN "\x1b[32m"
#define ANSI_COLOR_DARK_YELLOW "\x1b[33m"
#define ANSI_COLOR_YELLOW "\x1b[93m"
#define ANSI_COLOR_BLUE "\x1b[34m"
#define ANSI_COLOR_MAGENTA "\x1b[35m"
#define ANSI_COLOR_CYAN "\x1b[36m"
#define ANSI_COLOR_RESET "\x1b[0m"  
#define CPRINTF_BUF_SIZE 512  
#define clog(...) \ { \ cprintf(__VA_ARGS__); \ }  
void reset_log_milliseconds (void);
int16_t cprintf (const char *fmt, ...);

Модуль colored_log.c:

#include < stdio.h>
#include < string.h>
#include < stdlib.h>
#include < stdarg.h>
#include < time.h>
#include "colored_log.h"  
static long long lltimestamp;  
long long current_timestamp()
{ struct timeval te; // Получение текущего времени: gettimeofday(&te, NULL); // Вычисление абсолютного количества миллисекунд: long long milliseconds = te.tv_sec*1000LL + te.tv_usec/1000; return milliseconds;
}  
void reset_log_milliseconds (void)
{ lltimestamp = current_timestamp();
}  
// Функция для формирования строки лога в формате:
// "HH:MM:SS(мс) текст"
// Строка лога будет выведена желтым цветом ANSI_COLOR_YELLOW.
// В скобках выводится абсолютное значение в миллисекундах.
// Его можно сделать относительным последнего вызова функции
// reset_log_milliseconds().
int16_t cprintf (const char *fmt, ...)
{ int16_t outsize; va_list ap; static char strbuf[CPRINTF_BUF_SIZE];   // Вернет ошибку, если формат является указателем NULL: if (!fmt) { return -1; } // Вернет ошибку, если строка превышает размер буфера CPRINTF_BUF_SIZE, с учетом // необходимых дополнительных 2 символов: CR и нулевой терминатор ASCIIZ: if (CPRINTF_BUF_SIZE-2 < strlen(fmt)) { return -1; }   // Получение строки времени в формате HH:MM:SS: time_t ltime; struct tm *time_info; char timeString[9]; // буфер для "HH:MM:SS\0" time(&ltime); time_info = localtime(&ltime); strftime(timeString, sizeof(timeString), "%H:%M:%S", time_info);   va_start (ap,fmt); outsize = vsprintf(strbuf,fmt,ap); strbuf[outsize] = 0; va_end (ap);   // Формирование строки лога в формате: // "HH:MM:SS(мс) текст" printf("%s%s(%lld): %s%s", ANSI_COLOR_YELLOW, timeString, current_timestamp() - lltimestamp, strbuf, ANSI_COLOR_RESET); return outsize;
}

[Ссылки]

1. stdlib and colored output in C site:stackoverflow.com.
2. How to Print Colored Text to the Terminal site:saturncloud.io.
3. How to Change Text Color in a Linux Terminal site:codeproject.com.
4. How to get appropriate timestamp in c for logs? site:stackoverflow.com.
5. time.h time types site:pubs.opengroup.org.

 

Добавить комментарий


Защитный код
Обновить

Top of Page