日志 | AI工程化部署

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 日志在任何一种语言编程中都会涉及到,python中有logging库,java中有log4j。当然C也有日志功能,一般可以用宏和函数来实现。需要明确下日志的功能,一般会设置一个日志等级,比如trace < debug < info < warn < error < fatal 等,根据设置的等级高低来判断是否显示日志。【1月更文挑战第1天】

日志在任何一种语言编程中都会涉及到,python中有logging库,java中有log4j。当然C也有日志功能,一般可以用宏和函数来实现。

需要明确下日志的功能,一般会设置一个日志等级,比如trace < debug < info < warn < error < fatal 等,根据设置的等级高低来判断是否显示日志。

1.宏实现

可以使用宏定义和条件编译来实现一个简单的日志函数,如下所示:

#include <stdio.h>

// 定义日志等级
#define LOG_LEVEL_DEBUG 0
#define LOG_LEVEL_INFO  1
#define LOG_LEVEL_WARN  2
#define LOG_LEVEL_ERROR 3

// 定义日志级别
#ifndef LOG_LEVEL
#define LOG_LEVEL LOG_LEVEL_INFO
#endif

// 定义日志函数
#define LOG(level, format, ...) \
    do { \
        if (level >= LOG_LEVEL) { \
            printf("[%s] " format "\n", #level, ##__VA_ARGS__); \
        } \
    } while(0)

int main() {
   
    int value = 42;

    LOG(LOG_LEVEL_DEBUG, "Debug message, value = %d", value);
    LOG(LOG_LEVEL_INFO, "Info message, value = %d", value);
    LOG(LOG_LEVEL_WARN, "Warning message, value = %d", value);
    LOG(LOG_LEVEL_ERROR, "Error message, value = %d", value);

    return 0;
}

在这个例子中,我们定义了四个日志级别,并使用宏定义和条件编译来控制日志输出的级别。在main函数中,我们使用LOG宏输出不同级别的日志信息。

您可以根据您的需要修改LOG_LEVEL的值来控制输出的日志级别。

这里##__VA_ARGS__是一个预处理器的特殊标记,用于处理可变参数列表。这个标记的作用是将可变参数列表展开并与它前面的文本连接起来。通常,##VA_ARGS用于定义带有可变参数的宏。当宏被调用时,##VA_ARGS会将可变参数列表展开,并将展开后的参数直接与宏定义中的文本相连接。

2. 函数实现

我们创建一个名为log的函数,函数接受日志级别和消息作为参数,并在函数内部根据日志级别输出相应的日志信息。以下是一个使用函数来实现日志功能的示例代码:

#include <stdio.h>

// 定义日志等级
typedef enum {
   
    LOG_LEVEL_DEBUG,
    LOG_LEVEL_INFO,
    LOG_LEVEL_WARN,
    LOG_LEVEL_ERROR
} LogLevel;

// 定义日志函数
void log(LogLevel level, const char *format, ...) {
   
    va_list args;
    va_start(args, format);

    if (level == LOG_LEVEL_DEBUG) {
   
        printf("[DEBUG] ");
    } else if (level == LOG_LEVEL_INFO) {
   
        printf("[INFO] ");
    } else if (level == LOG_LEVEL_WARN) {
   
        printf("[WARN] ");
    } else if (level == LOG_LEVEL_ERROR) {
   
        printf("[ERROR] ");
    }

    vprintf(format, args);
    printf("\n");

    va_end(args);
}

int main() {
   
    int value = 42;

    log(LOG_LEVEL_DEBUG, "Debug message, value = %d", value);
    log(LOG_LEVEL_INFO, "Info message, value = %d", value);
    log(LOG_LEVEL_WARN, "Warning message, value = %d", value);
    log(LOG_LEVEL_ERROR, "Error message, value = %d", value);

    return 0;
}

在这个例子中,我们定义了一个枚举类型LogLevel来表示不同的日志级别,然后创建了一个log函数来处理日志输出。在main函数中,我们使用log函数输出不同级别的日志信息。

这种方法不使用宏,而是使用了函数来实现日志功能,使得日志功能更加灵活和易于维护。

值得注意的是:在这个函数声明中,"..."表示可变参数列表。这意味着函数可以接受任意数量的参数。在C语言中,可变参数列表通常使用stdarg.h中的宏来处理。在函数内部,可以使用这些宏来访问传递的可变参数。

另外,在C语言中,va_list、va_start和va_end是用于处理可变参数列表的宏和函数。

  1. va_list: va_list是一个类型,用于声明一个指向参数列表的指针。它是一个指向参数列表的指针,可以用于遍历参数列表中的每个参数。

  2. va_start: va_start宏用于初始化可变参数列表的遍历。它接受两个参数,第一个是一个va_list类型的变量,第二个是可变参数列表中的最后一个固定参数。va_start会将指向参数列表的指针指向第一个可变参数。

  3. va_end: va_end宏用于结束可变参数列表的遍历。它接受一个参数,即va_list类型的变量。va_end会清理可变参数列表的状态,确保不会出现内存泄露。

使用这些宏和函数,可以在函数内部遍历可变参数列表,获取每个参数的值,并进行相应的处理。这在需要处理不定数量参数的函数中非常有用,比如printf函数就是一个典型的例子。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
4天前
|
人工智能 Kubernetes jenkins
容器化AI模型的持续集成与持续交付(CI/CD):自动化模型更新与部署
在前几篇文章中,我们探讨了容器化AI模型的部署、监控、弹性伸缩及安全防护。为加速模型迭代以适应新数据和业务需求,需实现容器化AI模型的持续集成与持续交付(CI/CD)。CI/CD通过自动化构建、测试和部署流程,提高模型更新速度和质量,降低部署风险,增强团队协作。使用Jenkins和Kubernetes可构建高效CI/CD流水线,自动化模型开发和部署,确保环境一致性并提升整体效率。
|
4天前
|
机器学习/深度学习 人工智能 Kubernetes
容器化AI模型部署实战:从训练到推理
在上一篇中,我们探讨了AI技术如何赋能容器化生态。本篇聚焦于AI模型的容器化部署,通过图像分类任务实例,详细介绍了从模型训练到推理服务的完整流程。使用PyTorch训练CNN模型,Docker打包镜像,并借助Kubernetes进行编排和部署,最终通过FastAPI提供推理服务。容器化技术极大提升了AI模型部署的便利性和管理效率,未来将成为主流趋势。
|
4天前
|
弹性计算 人工智能 API
基于ECS部署DeepSeek个人专属AI网站
本方案介绍了如何基于云服务器ECS集成百炼API和Open WebUI服务,一键部署体验DeepSeek个人专属AI网站。用户不仅可以以极低的成本,拥有个人专属的AI网站,进行稳定的AI对话,还能够切换DeepSeek-V3、DeepSeek-R1、Qwen-max等模型进行体验。同时Open WebUI还具备开源能力,支持定制工具的开发。您还可以创建其他子账号,将您的专属AI网站分享给他人使用。
|
24天前
|
存储 人工智能 弹性计算
NVIDIA NIM on ACK:优化生成式AI模型的部署与管理
本文结合NVIDIA NIM和阿里云容器服务,提出了基于ACK的完整服务化管理方案,用于优化生成式AI模型的部署和管理。
|
22天前
|
人工智能 资源调度 API
AnythingLLM:34K Star!一键上传文件轻松打造个人知识库,构建只属于你的AI助手,附详细部署教程
AnythingLLM 是一个全栈应用程序,能够将文档、资源转换为上下文,支持多种大语言模型和向量数据库,提供智能聊天功能。
2897 14
|
3天前
|
存储 人工智能 弹性计算
NVIDIA NIM on ACK:优化生成式AI模型的部署与管理
NVIDIA NIM on ACK:优化生成式AI模型的部署与管理
|
3天前
|
人工智能
情人节一定要有“AI”! ! 快到阿里云来部署DeepSeek吧!
情人节一定要有“AI”! ! 快到阿里云来部署DeepSeek吧!
|
3天前
|
人工智能 安全 搜索推荐
基于函数计算一键部署 AI 陪练,快速打造你的专属口语对练伙伴
基于函数计算一键部署 AI 陪练,快速打造你的专属口语对练伙伴
|
4天前
|
人工智能 自动驾驶 机器人
D1net阅闻|国务院国资委部署深化中央企业“AI+”专项行动
D1net阅闻|国务院国资委部署深化中央企业“AI+”专项行动
|
6天前
|
人工智能 自然语言处理 监控
AI尚处于早期阶段:仅有25%的企业部署了该技术,很少有企业获得回报
AI尚处于早期阶段:仅有25%的企业部署了该技术,很少有企业获得回报

热门文章

最新文章