本文向大家介绍一个名为Melon的开源 C 语言库的日志模块。
Melon 是一个包含了开发中常用的各类组件的开源 C 语言库,支持 Linux 、MacOS 、Windows 系统,可用于服务器开发亦可用于嵌入式开发,无第三方软件依赖,安装简单,开箱即用,中英文文档配套齐全。
日志是 Melon 库提供的通用组建之一,在介绍其特性前,我们先来看一下它的简单使用示例。
#include "mln_log.h"
int main(int argc, char *argv[])
{
mln_log(debug, "This will be outputted to stderr\n");
mln_log_init(NULL);
mln_log(debug, "This will be outputted to stderr and log file\n");
return 0;
}
可以看到,使用与我们常用的printf
或fprintf
很相似。
同时,从这个例子中也可以看到这个日志模块允许在未初始化情况下使用。在未初始化时,这些日志都将被输出至stderr
中。
当然,我们也可以使用mln_log_init
对日志模块进行初始化。初始化后将获得两种能力:
显然,我们的日志不仅仅可以做这些事情。
下一步我们将讨论如何将日志内容做自定义处理,我们将介绍日志回调函数。
这里涉及到两个日志模块的函数:
mln_log_logger_get
获取当前日志处理函数mln_log_logger_set
设置日志处理函数为某个指定的函数我们看一下简单的例子,我们对上面的例子进行一顿改造:
#include <stdio.h>
#include "mln_log.h"
mln_logger_t old = NULL;
static void mylogger(mln_log_t *log, mln_log_level_t level, const char *file,
const char *func, int line, char *fmt, va_list args)
{
printf("%s:%s:%d: %s\n", file, func, line, fmt);
if (old != NULL)
old(log, level, file, func, line, fmt, args);
}
int main(int argc, char *argv[])
{
mln_log(debug, "This will be outputted to stderr\n");
mln_log_init(NULL);
old = mln_log_logger_get();
mln_log_logger_set(mylogger);
mln_log(debug, "This will be outputted to stderr and log file\n");
return 0;
}
我们增加了一个自己的日志处理函数名为mylogger
,它将截获日志的内容及其关联信息,使用printf
将这些信息输出到标准输出(stdout
)中。然后再使用原有的日志处理函数将日志输出到终端的stderr
和日志文件中。
这样,我们就可以随意地对日志内容进行处理了。
Melon 的日志模块允许开发者对其进行任意扩展来满足自己的需求。
另外,要补充一点,这个mln_log
是允许多线程使用的。并且对于x86 架构,在不调用mln_log_init
对日志进行初始化的情况下,这个函数就是多线程可用的。
感谢阅读!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.