日志 | 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日志并进行多维度分析。
目录
相关文章
|
1月前
|
人工智能 Java Serverless
阿里云函数计算助力AI大模型快速部署
随着人工智能技术的快速发展,AI大模型已经成为企业数字化转型的重要工具。然而,对于许多业务人员、开发者以及企业来说,探索和利用AI大模型仍然面临诸多挑战。业务人员可能缺乏编程技能,难以快速上手AI模型;开发者可能受限于GPU资源,无法高效构建和部署AI应用;企业则希望简化技术门槛,以更低的成本和更高的效率利用AI大模型。
138 12
|
7天前
|
人工智能 物联网
如何将Together AI上基于Qwen2-7B训练的模型部署到ModelScope平台
如何将Together AI上基于Qwen2-7B训练的模型部署到ModelScope平台
44 10
|
7天前
|
存储 人工智能 Serverless
7分钟玩转 AI 应用,函数计算一键部署 AI 生图大模型
人工智能生成图像(AI 生图)的领域中,Stable Diffusion WebUI 以其强大的算法和稳定的输出质量而闻名。它能够快速地从文本描述中生成高质量的图像,为用户提供了一个直观且高效的创作平台。而 ComfyUI 则以其用户友好的界面和高度定制化的选项所受到欢迎。ComfyUI 的灵活性和直观性使得即使是没有技术背景的用户也能轻松上手。本次技术解决方案通过函数计算一键部署热门 AI 生图大模型,凭借其按量付费、卓越弹性、快速交付能力的特点,完美实现低成本,免运维。
|
21天前
|
人工智能 数据库连接 API
在部署《主动式智能导购 AI 助手构建》解决方案的过程中,整体体验还是相对顺畅的,但确实遇到了一些问题,文档提供的引导也有所不足,以下是详细的体验评估
在部署《主动式智能导购 AI 助手构建》解决方案的过程中,整体体验还是相对顺畅的,但确实遇到了一些问题,文档提供的引导也有所不足,以下是详细的体验评估
|
1月前
|
人工智能 缓存 异构计算
云原生AI加速生成式人工智能应用的部署构建
本文探讨了云原生技术背景下,尤其是Kubernetes和容器技术的发展,对模型推理服务带来的挑战与优化策略。文中详细介绍了Knative的弹性扩展机制,包括HPA和CronHPA,以及针对传统弹性扩展“滞后”问题提出的AHPA(高级弹性预测)。此外,文章重点介绍了Fluid项目,它通过分布式缓存优化了模型加载的I/O操作,显著缩短了推理服务的冷启动时间,特别是在处理大规模并发请求时表现出色。通过实际案例,展示了Fluid在vLLM和Qwen模型推理中的应用效果,证明了其在提高模型推理效率和响应速度方面的优势。
云原生AI加速生成式人工智能应用的部署构建
|
1月前
|
机器学习/深度学习 存储 人工智能
【AI系统】训练后量化与部署
本文详细介绍了训练后量化技术,涵盖动态和静态量化方法,旨在将模型权重和激活从浮点数转换为整数,以优化模型大小和推理速度。通过KL散度等校准方法和量化粒度控制,文章探讨了如何平衡模型精度与性能,同时提供了端侧量化推理部署的具体实现步骤和技术技巧。
50 1
【AI系统】训练后量化与部署
|
1月前
|
人工智能 监控 Serverless
《主动式智能导购AI助手构建》解决方案部署测评
在数字化时代,智能导购AI助手已成为提升客户体验和销售效率的重要工具。本文将基于个人体验,对《主动式智能导购AI助手构建》解决方案的部署过程进行详细评测。
44 3
|
27天前
|
人工智能 API Windows
免费部署本地AI大语言模型聊天系统:Chatbox AI + 马斯克grok2.0大模型(简单5步实现,免费且比GPT4.0更好用)
本文介绍了如何部署本地AI大语言模型聊天系统,使用Chatbox AI客户端应用和Grok-beta大模型。通过获取API密钥、下载并安装Chatbox AI、配置模型,最终实现高效、智能的聊天体验。Grok 2大模型由马斯克X-AI发布,支持超长文本上下文理解,免费且易于使用。
108 0
|
2月前
|
存储 人工智能 关系型数据库
拥抱Data+AI|玩家去哪儿了?解码Data+AI如何助力游戏日志智能分析
本文为阿里云瑶池数据库「拥抱Data+AI」系列连载第2篇,基于真实客户案例和最佳实践,探讨如何利用阿里云Data+AI解决方案应对游戏行业挑战,通过AI为游戏行业注入新的活力。文章详细介绍了日志数据的实时接入、高效查询、开源开放及AI场景落地,展示了完整的Data+AI解决方案及其实际应用效果。