扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

c语言实例|实现log子模块

2025/08/11
1601
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

一、log.c 介绍

log.c 是一个极为简约的 C 语言日志库,由 akstuki 开发维护。该项目旨在提供一个轻量级、易于集成的解决方案,让开发者能够迅速地在他们的 C 应用程序中添加日志记录功能。

尽管其体积小巧,仅由一个 .c 文件和一个 .h 文件组成,总计不超过 200 行代码,但 log.c 依然具备足够的灵活性来满足基础的日志需求,包括不同的日志级别、输出到文件的能力,以及线程安全性。

应用场景

log.c 作为一个独立组件,适用于众多 C 语言项目,特别是在嵌入式系统和小型服务应用中。虽然没有直接的“生态项目”列表,但由于其通用性,它可与任何需要日志记录功能的 C 项目结合使用。

例如,它可以被集成到物联网设备固件服务器后台管理工具或是任何形式的客户端-服务器架构的应用中。

用户可以根据自己的具体应用场景定制化扩展,比如通过简单的修改或增加适配器(Appenders)实现日志远程发送至日志收集服务。

通过以上介绍和指导,你应该已经掌握了如何快速地将 log.c 引入到你的 C 项目中,并有效地利用它来进行日志管理。记得在实际应用中根据具体需求进行适当的配置和优化。

源码下载

由于 log.c 是纯 C 代码构成,集成到项目中通常不需要复杂的步骤。直接下载或通过 Git 克隆仓库即可开始使用:

git clone https://github.com/akstuki/log.c.git

二、功能介绍

结构体

static struct {
  void *udata;
  log_LockFn lock;
  FILE *fp;
  int level;
  int quiet;
} L;
成员 功能
void *udata 自定义锁回调函数的私有信息
log_LockFn lock 自定义的锁回调函数,用于互斥访问文件,不同平台锁机制不同
FILE *fp 存储log信息的文件句柄
int level 显示和保存的log信息等级,低于level的不显示也不保存
在生产环境中设置较高级别的日志(如 ERROR 或WARNING),而在开发和测试期间则开启更详细的日志(DEBUG 或 TRACE)。
int quiet log信息是否打印到屏幕

打印信息是否显示颜色

库函数说明

函数名 功能说明
log_set_fp() 设置存储log信息的文件句柄
log_set_lock() 设置自定义的锁回调函数
函数原型**typedef void (log_LockFn)(void udata, int lock);
log_set_udata() 设置自定义的锁回调函数私有信息
log_set_quiet() 设置log信息是否打印到屏幕,1:不打印  0:打印
log_set_level() 设置显示和保存的log信息等级

三、实例讲解

在你的 C 项目中包含 log.h 头文件,并链接 log.c 到你的构建过程中。

本例创建一个主程序文件main.c

peng@ubuntu:~/work/log/src$ ls
clog.cpp  clog.h  log.c  log.h  main.c

 

如果是c++环境,用clog.cpp文件

1、示例代码

/*
 * main.c
 * Copyright 2024 -yikoupeng <21689991@qq.com>
 * This program is under a GPLv3+ license.
 * log demo 
 *          关注公众号:一口Linux
 */

#include <stdio.h>
#include <pthread.h>
#include "log.h"

#define LOG_FILE_NAME "peng.log"

pthread_mutex_t log_mutex;

void log_mutex_fn(void *udata, int lock)
{
 if(lock==1)
 {
  //lock
  pthread_mutex_lock(&log_mutex);
 }else if(lock==0){
  //unlock
  pthread_mutex_unlock(&log_mutex);
 }
 return;
}

void my_log_lock_init(char *info)
{
 pthread_mutex_init(&log_mutex,NULL);
 log_set_lock(&log_mutex_fn);
    log_set_udata(info);

}
void my_fp_init(char *filename)
{
 FILE * fp = fopen(filename,"w+");
 if(fp == NULL)
 {
  printf("%s open failn",filename);
 }
 log_set_fp(fp);

}
int main(int argc, char **argv)
{
 //设置锁回调函数
 my_log_lock_init("peng");
 
 //设置log文件句柄
 my_fp_init(LOG_FILE_NAME);
 
 //log信息打印到屏幕
 log_set_quiet(0);
 
 //设置日志级别为LOG_TRACE
    printf("设置日志级别为LOG_TRACE.n");
    log_set_level(LOG_TRACE); 
 
    // 进行一些操作...
 log_trace("一口Linux.");
 log_debug("一口Linux."); 
 log_info("一口Linux."); 
 log_warn("一口Linux."); 
 log_error("一口Linux."); 
 log_fatal("一口Linux."); 
 
 //设置日志级别为LOG_ERROR
    printf("设置日志级别为LOG_ERROR.n");
    log_set_level(LOG_ERROR); 
 
    // 进行一些操作...
 log_trace("一口Linux.");
 log_debug("一口Linux."); 
 log_info("一口Linux."); 
 log_warn("一口Linux."); 
 log_error("一口Linux."); 
 log_fatal("一口Linux."); 
    
 return 0;
}

2、编译

确保在编译时一起编译 log.c 文件,或者如果是在 Makefile 中,则确保它被正确链接。

peng@ubuntu:~/work/log/src$ gcc main.c log.c -o run

3、运行

4、查看log文件信息

四、源码获取

完整代码,公众号【一口Linux】转发回复:log

一口君原创得所有c语言基础知识、c语言实例代码,均整理成pdf文档【定期更新

 

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

公众号『一口Linux』号主彭老师,拥有15年嵌入式开发经验和培训经验。曾任职ZTE,某研究所,华清远见教学总监。拥有多篇网络协议相关专利和软件著作。精通计算机网络、Linux系统编程、ARM、Linux驱动、龙芯、物联网。原创内容基本从实际项目出发,保持原理+实践风格,适合Linux驱动新手入门和技术进阶。