日志 | 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日志并进行多维度分析。
目录
相关文章
|
18天前
|
人工智能 并行计算 安全
从零到一,打造专属AI王国!大模型私有化部署全攻略,手把手教你搭建、优化与安全设置
【10月更文挑战第24天】本文详细介绍从零开始的大模型私有化部署流程,涵盖需求分析、环境搭建、模型准备、模型部署、性能优化和安全设置六个关键步骤,并提供相应的示例代码,确保企业能够高效、安全地将大型AI模型部署在本地或私有云上。
166 7
|
6天前
|
存储 人工智能 关系型数据库
拥抱Data+AI|玩家去哪儿了?解码Data+AI如何助力游戏日志智能分析
本文为阿里云瑶池数据库「拥抱Data+AI」系列连载第2篇,基于真实客户案例和最佳实践,探讨如何利用阿里云Data+AI解决方案应对游戏行业挑战,通过AI为游戏行业注入新的活力。文章详细介绍了日志数据的实时接入、高效查询、开源开放及AI场景落地,展示了完整的Data+AI解决方案及其实际应用效果。
|
7天前
|
存储 人工智能 关系型数据库
拥抱Data+AI|玩家去哪儿了?解码Data+AI如何助力游戏日志智能分析
「拥抱Data+AI」系列第2篇:阿里云DMS+AnalyticDB助力游戏日志数据分析与预测
拥抱Data+AI|玩家去哪儿了?解码Data+AI如何助力游戏日志智能分析
|
18天前
|
人工智能 安全 网络安全
揭秘!大模型私有化部署的全方位安全攻略与优化秘籍,让你的AI项目稳如磐石,数据安全无忧!
【10月更文挑战第24天】本文探讨了大模型私有化部署的安全性考量与优化策略,涵盖数据安全、防火墙配置、性能优化、容器化部署、模型更新和数据备份等方面,提供了实用的示例代码,旨在为企业提供全面的技术参考。
53 6
|
22天前
|
人工智能 数据安全/隐私保护 UED
RAG让AI大模型更懂业务解决方案部署使用体验
根据指导文档,部署过程得到了详细步骤说明的支持,包括环境配置、依赖安装及代码示例,确保了部署顺利进行。建议优化知识库问题汇总,增加部署失败案例参考,以提升用户体验。整体解决方案阅读与部署体验良好,有助于大型语言模型在特定业务场景的应用,未来可加强行业适应性和用户隐私保护。
60 5
|
19天前
|
人工智能 分布式计算 数据可视化
大模型私有化部署全攻略:硬件需求、数据隐私、可解释性与维护成本挑战及解决方案详解,附示例代码助你轻松实现企业内部AI应用
【10月更文挑战第23天】随着人工智能技术的发展,企业越来越关注大模型的私有化部署。本文详细探讨了硬件资源需求、数据隐私保护、模型可解释性、模型更新和维护等方面的挑战及解决方案,并提供了示例代码,帮助企业高效、安全地实现大模型的内部部署。
43 1
|
19天前
|
人工智能 分布式计算 数据可视化
大模型私有化部署全攻略:硬件需求、数据隐私、可解释性与维护成本挑战及解决方案详解,附示例代码助你轻松实现企业内部AI应用
【10月更文挑战第23天】随着人工智能技术的发展,大模型在各领域的应用日益广泛。然而,将其私有化部署到企业内部面临诸多挑战,如硬件资源需求高、数据隐私保护、模型可解释性差、更新维护成本高等。本文探讨了这些挑战,并提出了优化硬件配置、数据加密、可视化工具、自动化更新机制等解决方案,帮助企业顺利实现大模型的私有化部署。
51 1
|
21天前
|
人工智能 IDE 测试技术
AI 自动补全的这句日志能正常打印吗?
最近用上了 GitHub Copilot,它的能力不时让我惊叹。
13 2
|
24天前
|
Serverless 数据安全/隐私保护 前端开发
大模型代码能力体验报告之贪吃蛇小游戏《一》:Claude.ai篇 - 生成、预览和快速部署的serverless一条龙
本文介绍了通过Claude.ai生成并优化Web版贪吃蛇游戏的过程,展示了其强大的代码生成功能及用户友好的界面设计。从初始版本的快速生成到根据用户反馈调整游戏速度,再到提供多种实用工具如文件管理、版本控制和一键部署,Claude.ai不仅是一个代码助手,更像是一个全面的serverless开发平台。文中还呼吁国内厂商关注此类技术的发展。
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
当前AI大模型在软件开发中的创新应用与挑战
2024年,AI大模型在软件开发领域的应用正重塑传统流程,从自动化编码、智能协作到代码审查和测试,显著提升了开发效率和代码质量。然而,技术挑战、伦理安全及模型可解释性等问题仍需解决。未来,AI将继续推动软件开发向更高效、智能化方向发展。