V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
monkeyNik
V2EX  ›  C

百变开源 C 语言库日志模块

  •  
  •   monkeyNik · 2023-09-12 22:46:21 +08:00 · 644 次点击
    这是一个创建于 438 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本文向大家介绍一个名为Melon的开源 C 语言库的日志模块。

    简述 Melon

    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;
    }
    

    可以看到,使用与我们常用的printffprintf很相似。

    同时,从这个例子中也可以看到这个日志模块允许在未初始化情况下使用。在未初始化时,这些日志都将被输出至stderr中。

    当然,我们也可以使用mln_log_init对日志模块进行初始化。初始化后将获得两种能力:

    1. 日志会跟据不同等级显示不同的颜色
    2. 日志内容既会被输出到 stderr ,也会被输出到 Melon 配置中指定的日志文件中(关于配置,请参见官方手册)。

    进阶

    显然,我们的日志不仅仅可以做这些事情。

    下一步我们将讨论如何将日志内容做自定义处理,我们将介绍日志回调函数。

    这里涉及到两个日志模块的函数:

    • 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对日志进行初始化的情况下,这个函数就是多线程可用的。

    感谢阅读!

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2649 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 03:24 · PVG 11:24 · LAX 19:24 · JFK 22:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.