轻量级 C Logger

news2024/11/18 23:27:15

目录

一、描述

二、实现效果

三、使用案例

四、内存检测


一、描述

        最近实现一个 WS 服务器,内部需要一个日志打印记录服务器程序的运行过程,故自己实现了一个轻量级的 logger,主要包含如下特征:

  1. 可输出 debug、info、warn、error、fatal 级别日志

  2. 每行日志包含时间戳、进程号、线程号、文件名、函数、行数、日志级别等重要信息

  3. 可按日志文件大小自动拆分日志文件(以 MB 为单位)

  4. 可限制日志文件数量(自动覆盖旧的日志文件)

  5. 日志文件命名可设置固定开头,以时间戳进行区分

  6. 线程安全,可多线程读写

  7. 通过宏参数控制日志行为

    具体的代码已上传至 gitcode和github,链接如下:

项目首页 - GitCode

​​​​​​AtaoistPriest/c_logger: A Lightweight Logger Implemented with C (github.com)

二、实现效果

        主要打印时间戳、进程号、线程号、文件名、函数、行数、日志级别和错误描述等重要信息。

May 21 2024 23:45:01 [1661][1663] [./test.c print_log:19] [ERROR] this an error thread 2 54246
May 21 2024 23:45:01 [1661][1663] [./test.c print_log:20] [ERROR] this an error thread 2 54246
May 21 2024 23:45:01 [1661][1663] [./test.c print_log:13] [INFO] this an info thread 2 54247
May 21 2024 23:45:01 [1661][1663] [./test.c print_log:14] [INFO] this an info thread 2 54247
May 21 2024 23:45:01 [1661][1663] [./test.c print_log:16] [WARN] this an warn thread 2 54247
May 21 2024 23:45:01 [1661][1662] [./test.c print_log:13] [INFO] this an info thread 1 59045
May 21 2024 23:45:01 [1661][1662] [./test.c print_log:14] [INFO] this an info thread 1 59045
May 21 2024 23:45:01 [1661][1662] [./test.c print_log:16] [WARN] this an warn thread 1 59045
May 21 2024 23:45:01 [1661][1662] [./test.c print_log:17] [WARN] this an warn thread 1 59045
May 21 2024 23:45:01 [1661][1662] [./test.c print_log:19] [ERROR] this an error thread 1 59045
May 21 2024 23:45:01 [1661][1662] [./test.c print_log:20] [ERROR] this an error thread 1 59045

三、使用案例

#include <unistd.h>
#include <pthread.h>
#include "./logger.h"

void *print_log(void *arg)
{
    char *str = (char *)arg;
    for ( int i = 0; i < 100000; i++ )
    {
        logger_level_printf(LOGGER_DEBUG_LEVEL, "this an debug %s %d", str, 525 + i);
        logger_level_printf(LOGGER_INFO_LEVEL, "this an info %s %d", str, 525 + i);
        logger_level_printf(LOGGER_WARN_LEVEL, "this an warn %s %d", str, 525 + i);
        logger_level_printf(LOGGER_ERROR_LEVEL, "this an error %s %d", str, 525 + i);
        if ( i % 10000 == 0 )
        {
            sleep(1);
        }
    }
    return NULL;
}

int main(void)
{
    logger_init("./log");

    pthread_t tid1, tid2;
    pthread_create(&tid1, NULL, print_log, "thread 1");
    pthread_create(&tid2, NULL, print_log, "thread 2");

    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);

    logger_destroy();
    return 0;
}

四、内存检测

        使用 valgrind 对该日志器进行了内存泄漏检测,检测结果如下,没有任何问题。

==14863== Memcheck, a memory error detector
==14863== Copyright (C) 2002-2024, and GNU GPL'd, by Julian Seward et al.
==14863== Using Valgrind-3.23.0 and LibVEX; rerun with -h for copyright info
==14863== Command: ./test
==14863== Parent PID: 10266
==14863==
==14863==
==14863== HEAP SUMMARY:
==14863==     in use at exit: 0 bytes in 0 blocks
==14863==   total heap usage: 27 allocs, 27 frees, 368,920 bytes allocated
==14863==
==14863== All heap blocks were freed -- no leaks are possible
==14863==
==14863== For lists of detected and suppressed errors, rerun with: -s
==14863== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

        valgrind是一个开源的,检测内存泄漏的工具,通常在linux下使用,除此之外,他还能检测内存管理错误,线程bug等错误。valgrind相当于一个沙盒,指定的程序会在他模拟的cpu和内核中去运行。

        粗浅的来讲,valgrind由两部分构成,一部分用来模拟cpu和内核,被称为framework(框架),一部分是他用来检测各种错误信息的插件工具。其中的插件包括:

        memcheck:是valgrind最重要的工具之一,是一个重量级的内存检查器,它可以帮我们检测是否有使用未初始化的内存,以及内存泄漏,访问越界之类的问题。

        callgrind:可以用来统计函数的互相调用情况。可以用来统计某个函数被调用了几次,以及他们的调用关系。

        cachegrind:cache分析器,可以精准的指出cache的丢失与命中。还可以统计cache命中与丢失的次数,让我们了解我们程序堆栈的使用情况。

        helgrind:主要用来检测线程资源的竞争问题,比如 POSIX pthreads API 的误用。由锁排序导致的死锁。以及数据的竞争问题等。

        massif:堆栈分析器。它可以统计堆和栈使用的内存大小是多少。

        extension:可以利用core的特性自己编辑的内存调试工具。

valgrind --tool=memcheck --leak-check=full --show-reachable=yes --log-file=check.log ./host_monitor

        在程序执行结束后,valgrind 将打印检测结果。

        valgrind 将内存泄漏分为 4 类:并且默认情况下,只会打印明确泄漏 和可能泄漏,如果需要打印 间接泄漏,需要加上选项 --show-reachable=yes.

        a. 明确泄漏(definitely lost):表示某段内存还没有被释放,但是已经没有指针指向它了,所以明确了这里一定发生了内存释放。

        b. 间接泄漏(indirectly lost):某一段内存没有被释放,指向它的指针仍然存在,但是,存放这个指针的内存已经被释放了。

        c. 可能泄漏(possibly lost):指针存在,但并不指向内存头地址,而是指向内存内部的位置。

        d. 仍可访达(still reachable):指针一直存在并指向首地址,直至程序退出时内存还没被释放。例如指针 ptr=malloc() 了一段内存,直至程序结束,ptr仍然指向malloc分配的内存的首地址,并且该内存仍然没有没释放。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1716082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 进阶(3)虚函数表解析

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 请多多指教&#xff01; 目录 一、虚函数表 二、单继承&#xff08;无虚函数覆盖&#xff09; 继承关系表&#xff1a; 对于实例&#xff1a;derive d 的虚函数表&#xff1a; 对于实例&#xff1a;b…

现货白银交易点差是多少

现货白银投资者通过交易平台进行买卖操作的时候&#xff0c;平台会以“点差”的形式向投资者收取一定的交易费用。所谓的点差&#xff0c;也就是平台所报出的买入价和卖出价之间的固定差额&#xff0c;由于现货白银的报价是“成对”的&#xff0c;所以点差的存在也是其交易模式…

连锁收银系统支持带结算功能

连锁实体店的收银系统需要支持结算功能&#xff0c;以适应连锁运营效率和提升连锁管理的水平。商淘云连锁收银系统与您一起分享连锁收银系统需支持结算功能的三大必要点。大家点赞收藏&#xff0c;以免划走后找不到了。 一是&#xff0c;连锁模式的运营比较复杂&#xff0c;有加…

【小技巧】Keil C51 报错“*** ERROR L107: ADDRESS SPACE OVERFLOW****

软件&#xff1a;Keil C51 C51V961版本 电脑&#xff1a;Win10 报错提示&#xff1a; compiling System.c... linking... *** ERROR L107: ADDRESS SPACE OVERFLOW SPACE: DATA SEGMENT: ?DT?LCD LENGTH: 0034H Program Size: data174.0 xdata17 code1205 Target not create…

开源进销存系统

推荐一款开源的进销存系统 项目地址&#xff1a;进销存系统 仓库管理系统 SAAS进销存 进销存ERP: 进销存系统 仓库管理系统 SAAS进销存 进销存ERPhttps://gitee.com/flyemu/jxc.git 主要功能模块 销售 采购 库存 资料 设置 支持saas多租户&#xff0c;100%开源可二开 …

【Redis】 关于 Redis 有序集合类型

文章目录 &#x1f343;前言&#x1f334;普通命令介绍&#x1f6a9;zadd&#x1f6a9;zcard&#x1f6a9;zcount&#x1f6a9;zrange&#x1f6a9;zrevrange&#x1f6a9;zrangebyscore&#x1f6a9;zpopmax&#x1f6a9;zpopmin&#x1f6a9;zrank&#x1f6a9;zrevrank&…

办公自动化-Python如何提取Word标题并保存到Excel中?

办公自动化-Python如何提取Word标题并保存到Excel中&#xff1f; 应用场景需求分析实现思路实现过程安装依赖库打开需求文件获取word中所有标题去除不需要的标题创建工作簿和工作表分割标题功能名称存入测试对象GN-TC需求标识符存入测试项标识存入需求标识符 完整源码实现效果学…

交换机的三层交换技术

现有pc1与pc2不在同一个网段之下&#xff0c;通过交换机相连接。 进人交换机1&#xff0c;创建两个vlan 10和vlan 20 &#xff0c;进入串口2设置串口模式为access&#xff0c;并且设置默认vlan为10.进入串口3设置串口模式为access&#xff0c;并且设置默认vlan为20. 进入串口1…

学习笔记——动态路由协议——OSPF(OSPF基本术语)

OSPF基本术语 1、链路状态(LS)与链路状态通告(LSA) 链路(LINK)&#xff1a;路由器上的一个接口。 状态(State)&#xff1a;描述接口以及其与邻居路由器之间的关系。 (1)链路状态(LS) OSPF是一种链路状态协议&#xff0c;所谓的链路状态&#xff0c;其实就是路由器的接口状态…

Java-数组内存解析

文章目录 1.内存的主要结构&#xff1a;栈、堆2.一维数组的内存解析3.二维数组的内存解析 1.内存的主要结构&#xff1a;栈、堆 2.一维数组的内存解析 举例1&#xff1a;基本使用 举例2&#xff1a;两个变量指向一个数组 3.二维数组的内存解析 举例1&#xff1a; 举例2&am…

Thingsboard规则链:Calculate Delta节点详解

在物联网(IoT)应用中&#xff0c;对设备数据的实时分析和处理是优化运营、预测维护的关键。Thingsboard作为一款功能强大的物联网平台&#xff0c;其规则引擎提供了丰富的节点来处理和分析数据流。其中&#xff0c;Calculate Delta节点是一个重要的工具&#xff0c;用于计算连续…

HAL库+LWIP+LAN8720+热插拔

定时任务中&#xff0c;查询LAN8720的状态寄存器 PHY_BSR 0x01&#xff0c;成功读取后&#xff0c;检查16位数据的BIT2&#xff0c;即可获取网线连接状态 uint32_t phyreg 0;if(HAL_ETH_ReadPHYRegister(&g_eth_handler, PHY_BSR, &phyreg) HAL_OK){if(((phyreg >…

电脑显示不出网络

你的电脑是否在开机后显示不出网络&#xff0c;或者有网络消失的现象&#xff1f;今天和大家分享我学到的一个办法&#xff0c;希望对大家有用。 分析出现这类现象的原因&#xff1a;可能是电脑网卡松动了&#xff0c;电脑中存在静电流。 解决办法&#xff1a;先将电脑关机&am…

20 VUE学习:插件

介绍 插件 (Plugins) 是一种能为 Vue 添加全局功能的工具代码。下面是如何安装一个插件的示例&#xff1a; import { createApp } from vueconst app createApp({})app.use(myPlugin, {/* 可选的选项 */ })一个插件可以是一个拥有 install() 方法的对象&#xff0c;也可以直接…

全文最详细的生产管理完整方案!那些让人头疼的生产管理难题及解决方法!

什么是生产管理系统&#xff1f;为何生产管理系统在企业管理中如此重要&#xff1f;生产管理系统的核心模块包括哪些&#xff1f;为何企业在生产管理系统中常常遭遇项目信息碎片化、任务分配和跟踪困难等痛点&#xff1f;又该如何针对生产管理痛点进行优化&#xff1f; 本文40…

【数据结构与算法 | 基础篇 | 队列篇】力扣102, 107

1. 力扣102 : 二叉树的层序遍历 (1). 题 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3]…

Nginx教程(持续更新中~)

浏览器优先查看host文件中的映射&#xff0c;如果host中没有就会从网上CDN找该域名对应的ip,但是目前使用的www.123.com是外卖假设的&#xff0c;CDN中并没有&#xff0c;所以就采用host中填写 第二种weight: 第三种 ip_hash: 第四种 fair: ​​​​​​

AWS 高防和阿里云高防深度对比

随着网络攻击的不断增加&#xff0c;企业对于网络安全的需求也越来越高。在这种情况下&#xff0c;高防护服务成为了企业网络安全的重要组成部分。AWS和阿里云作为全球领先的云计算服务提供商&#xff0c;都提供了高防护服务&#xff0c;但它们之间存在着一些差异。我们九河云一…

Idea java.lang.RuntimeException: java.lang.OutOfMemoryError: Java heap space 解决

咱们平时的开发过程中一定会进行本地调试&#xff0c;今天我也是安装了新的idea之后拉了一个比较大的项目进行本地调试的时候报错。报错信息如下&#xff1a; java: java.lang.OutOfMemoryError: Java heap space java.lang.RuntimeException: java.lang.OutOfMemoryError: Ja…

【火猫CS2】fantic取代C9参加YaLLa指南针

1、近日YaLLa Compass主办方宣布,由于Could9战队未能在截止日期前提交完整的参赛阵容,fantic战队将取代其参赛。该比赛将在阿联酋阿布扎比举行,总奖金40万美元。 最近一段时间Cloud9战队最近将electroNic转会至VP,又下放了HObbit和Perfecto,队伍因没有完整阵容已被迫退出EPL S1…