Библиотека журналов для 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);
}

Не стесняйтесь исправить меня, если ошибаетесь.