一、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_USE_COLOR
打印信息是否显示颜色
库函数说明
| 函数名 | 功能说明 |
|---|---|
| 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文档【定期更新】
887