Библиотека журналов для C
Я ищу эффективную и простую библиотеку протоколирования для C, которая может выводить журнал в файл. Отображение сообщений в журнале я хочу сделать так:
date-time tag message
Было бы неплохо контролировать уровень детализации сообщений и контролировать размер файла.
Я нашел два подходящих для меня проекта. Это log4c и nglogc.
log4c казался слишком большим. nglogc вполне подходит, но также имеет избыточный функционал. может быть, вы скажете мне больше вариантов?
Ответы
Ответ 1
Вы можете использовать этот
Файл logger.h
#ifndef LOGGER_H
#define LOGGER_H
void logger(const char* tag, const char* message);
#endif /* LOG_H */
Файл logger.c
#include "logger.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void logger(const char* tag, const char* message) {
time_t now;
time(&now);
printf("%s [%s]: %s\n", ctime(&now), tag, message);
}
Это, вероятно, не идеально, но оно удовлетворяет потребностям, как вы их представили.
Ответ 2
Я предлагаю библиотеку журналов, которая написана мною --- zlog!
В соответствии с вашими потребностями в zlog:
$ vi /etc/zlog.conf
[formats]
simple = "%D %c %m%n"
# don't know what the tag mean in your question, so put category of zlog instead
# log level is also available here, add %V means level
[rules]
my_cat.* "xxx.log"; simple
$ vi hello.c
#include <stdio.h>
#include "zlog.h"
int main(int argc, char** argv)
{
int rc;
zlog_category_t *c;
rc = dzlog_init("/etc/zlog.conf", "my_cat");
if (rc) {
printf("init failed\n");
return -1;
}
zlog_info(c, "hello, zlog");
zlog_fini();
return 0;
}
Он будет генерировать xxx.log в текущем каталоге как
2012-09-30 07:22:50 my_cat hello, zlog
Ссылки:
Загрузить: https://github.com/HardySimpson/zlog/archive/latest-stable.tar.gz
UsersGuide: http://hardysimpson.github.com/zlog/UsersGuide-EN.html
Hompage: http://hardysimpson.github.com/zlog/
Ответ 3
Вы можете использовать эту простую библиотеку ведения журнала:
https://github.com/kala13x/slog
Вот пример использования:
Сначала вы должны запустить журнал. с функцией init_log(). Первый аргумент - имя файла журнала, второй аргумент - log to file (1 включен, 0 отключен), а третий аргумент - максимальный уровень журнала
init_slog("example", 1, 3);
распечатать и записать что-нибудь
slog(0, "Test message with level 0");
slog(2, "Test message with level 2");
slog(0, "Test message with int argument: %d", int_arg);
Вывод будет примерно таким:
2015: 04: 02: 56 - тестовое сообщение с уровнем 0
2015: 04: 02: 56 - тестовое сообщение с уровнем 2
2015: 04: 02: 56 - тестовое сообщение с аргументом int: 69
Ответ 4
Here is mine:
log.h
------
#ifndef LOG_H
#define LOG_H
void log_error(const char* message, ...); void log_info(const char* message, ...); void log_debug(const char* message, ...);
#endif
log.c
------
#include "log.h"
void log_format(const char* tag, const char* message, va_list args) { time_t now; time(&now); char * date =ctime(&now); date[strlen(date) - 1] = '\0'; printf("%s [%s] ", date, tag); vprintf(message, args); printf("\n"); }
void log_error(const char* message, ...) { va_list args; va_start(args, message); log_format("error", message, args); va_end(args); }
void log_info(const char* message, ...) { va_list args; va_start(args, message); log_format("info", message, args); va_end(args); }
void log_debug(const char* message, ...) { va_list args; va_start(args, message); log_format("debug", message, args); va_end(args); }
Удачи!
Ответ 5
Посмотрите на библиотеку журналов zf_log. Он маленький, простой и обеспечивает только необходимые предметы. С README.md:
Это всего лишь тонкая оболочка вокруг функции sprintf(). Он обеспечивает менее 20% функциональности, найденной в более сложных библиотеках, но охватывает более 80% случаев общего использования. Фокус делается на простоте, простоте использования и производительности (точнее, на низком уровне обслуживания).
Особенности:
- Ведение журнала отладки сводится к no-op в версиях сборки
- Аргументы не оцениваются, когда сообщение не регистрируется
- Нет предупреждений "неиспользуемые" для переменных, используемых только в операторах журнала
- Регистрировать область памяти как HEX и ASCII
- Пользовательские функции вывода
Ответ 6
Я также нахожу решения этой проблемы. Ответ от @edwin-buck просто прост и подходит для моей потребности.
Я действительно ничего не знаю о многопоточности и потокобезопасности, но после компиляции в компиляторе Visual Studio (он может дать некоторые предупреждения и советы) и поиска через google, я думаю, что несколько модификаций могут сделать код выше потока, безопаснее и лучше.
// file log.c
void log(const char* tag, const char* message) {
time_t now;
struct tm _calendar_time;
char _buf[MAX_COUNT];
time(&now);
localtime_s(&_calendar_time, &now);
strftime(_buf, MAX_COUNT, "%c", &_calendar_time);
printf("%s [%s]: %s\n", _buf, tag, message);
}
Не стесняйтесь исправить меня, если ошибаетесь.