我正在寻找一个高效且简单的C日志记录库,它可以将日志输出到文件中。在我想要的日志中显示消息:
date-time tag message
控制消息的详细程度并控制文件的大小会很好。
log4c似乎太大了。 nglogc非常合适,但也具有冗余功能。也许你告诉我更多变种?答案 0 :(得分:13)
您可以使用此
文件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);
}
它可能并不完美,但它确实满足了你提出的需求。
答案 1 :(得分:10)
我建议我自己编写的日志库--- 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
答案 2 :(得分: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); }
玩得开心!
答案 3 :(得分:4)
您可以使用这个简单的日志记录库: https://github.com/kala13x/slog
以下是如何使用的示例:
首先,您必须初始化日志。使用init_log()函数。第一个参数是log filename,第二个参数是log to file(启用1,禁用0),第三个参数是max log level
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);
Outout就是这样的:
2015:04:02:56 - 测试级别为0的消息
2015:04:02:56 - 测试2级的消息
2015:04:02:56 - 使用int参数测试消息:69
答案 4 :(得分:2)
查看zf_log日志记录库。它小巧,简单,仅提供必需品。来自README.md:
这只是sprintf()函数的一个薄包装器。它在不太复杂的库中提供的功能不到20%,但覆盖了80%以上的常见用例。重点在于简单性,易用性和性能(更精确 - 低开销)。
特点:
答案 5 :(得分:0)
我也在寻找解决这个问题的方法。 @ edwin-buck的答案很简单,可以满足我的需求。
我对多线程和线程安全一无所知,但在Visual Studio编译器编译后(它可以提供一些警告和提示),并通过谷歌搜索,我认为一些修改可能会使代码在线程上面 - 安全而且更好。
// 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);
}
如果错误,请随意纠正我。