当前位置: 首页 > news >正文

轻量级 C Logger

目录

一、描述

二、实现效果

三、使用案例

四、内存检测


一、描述

        最近实现一个 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分配的内存的首地址,并且该内存仍然没有没释放。

相关文章:

轻量级 C Logger

目录 一、描述 二、实现效果 三、使用案例 四、内存检测 一、描述 最近实现一个 WS 服务器&#xff0c;内部需要一个日志打印记录服务器程序的运行过程&#xff0c;故自己实现了一个轻量级的 logger&#xff0c;主要包含如下特征&#xff1a; 可输出 debug、info、warn、er…...

哪里能下载到合适的衣柜3D模型素材?

室内设计师在进行家居设计时&#xff0c;衣柜3D模型素材是非常重要的工具。那么&#xff0c;哪里能下载到合适的衣柜3D模型素材呢? 一、建e网&#xff1a; ①建e网是一个专注于3D模型素材分享的平台&#xff0c;上面可以找到大量的衣柜3D模型。 ②该网站提供的模型种类丰富&am…...

计算机毕业设计 | SpringBoot+vue仓库管理系统(附源码)

1&#xff0c;绪论 1.1 项目背景 随着电子计算机技术和信息网络技术的发明和应用&#xff0c;使着人类社会从工业经济时代向知识经济时代发展。在这个知识经济时代里&#xff0c;仓库管理系统将会成为企业生产以及运作不可缺少的管理工具。这个仓库管理系统是由&#xff1a;一…...

【Python】解决Python报错:TypeError: can only concatenate str (not “int“) to str

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…...

大数据技术分享 | Kylin入门系列:基础介绍篇

Kylin入门教程 在大数据时代&#xff0c;如何高效地处理和分析海量数据成为了企业面临的挑战之一。Apache Kylin作为一个开源的分布式分析引擎&#xff0c;提供了Hadoop之上的SQL查询接口及多维分析&#xff08;OLAP&#xff09;能力&#xff0c;使得对超大规模数据集的分析变…...

程序猿转型做项目经理一定要注意这 5 个坑

前言 国内的信息系统项目经理&#xff0c;很多都是从技术骨干转型的&#xff0c;我就是这样一路走过来的&#xff0c;这样有很多好处&#xff0c;比如技术过硬容易服众、熟悉开发流程更容易把控项目进度和质量、开发过程中碰到难题时更好组织攻坚等等&#xff0c;但是所谓成也…...

【Python爬虫】案例_github模拟登录

import requests import re from datetime import datetimedef login():sessionrequests.session()session.headers {User-Agent :XXXX #写自己的}url1 https://github.com/loginres_1 session.get(url1).content.decode()token re.findall(name"authenticity_token&q…...

小红书图文笔记怎么做?纯干货!

小红书图文笔记的制作是一门艺术&#xff0c;它需要结合精美的图片和有价值的内容&#xff0c;以吸引和留住用户的注意力。伯乐网络传媒给大家分享制作小红书图文笔记的干货指南&#xff0c;包括准备、制作、发布和优化的各个环节。 一、准备阶段 确定目标受众&#xff1a;找到…...

RocketMQ .NET

RocketMQ 是一款由阿里巴巴集团开发并开源给Apache软件基金会的分布式消息及流处理平台。以其高吞吐量、低延迟、高可用性等特点而广受欢迎。支持Java&#xff0c;C, Python, Go, .NET等。 异步解耦&#xff1a;可以实现上游和下游业务系统的松耦合设计&#xff0c;使得服务部…...

知攻善防应急响应靶机训练-Web2

前言&#xff1a; 本次应急响应靶机采用的是知攻善防实验室的Web-2应急响应靶机 靶机下载地址为&#xff1a; https://pan.quark.cn/s/4b6dffd0c51a 相关账户密码 用户:administrator 密码:Zgsfqq.com 解题过程&#xff1a; 一、攻击者的IP地址&#xff08;两个&#xff09;…...

opencv进阶 ——(七)图像处理之寸照换背景

寸照换背景&#xff0c;通常指的是将个人证件照片的背景色更换为另一种颜色&#xff0c;如白色、蓝色或红色等&#xff0c;以满足不同用途的要求。例如&#xff0c;护照照片通常要求白色背景&#xff0c;而身份证照片可能需要蓝色背景。这个过程通常涉及到图像处理技术&#xf…...

每日复盘-20240529

20240529 六日涨幅最大: ------1--------300956--------- 英力股份 五日涨幅最大: ------1--------301361--------- 众智科技 四日涨幅最大: ------1--------301361--------- 众智科技 三日涨幅最大: ------1--------300637--------- 扬帆新材 二日涨幅最大: ------1--------30…...

mybatis问题汇总

Mapped Statements collection does not contain value for mapper.xml中namespace存在问题 使用 ${}实现关键字&#xff08;表名、列名&#xff09;的可变 #{} 和 ${} 的区别...

Kafka SSL认证

证书生成 在kafka安装目录下/certificates生成keystore和trust文件&#xff0c;在其中一台机器声生成证书&#xff0c;然后将 生成的server.keystore.jks和server.truststore.jks文件拷贝其他broker节点上去即可 1.生成keystore [rootm1 certificates]# keytool -keystore se…...

【Spring】认识 Spring AOP

认识 Spring AOP 1.什么是 AOP2.AOP 中的概念3.用 AOP 方式管理日志3.1 编写 AOP 日志注解类3.2 编写控制器用于测试 1.什么是 AOP AOP&#xff08;Aspect Oriented Program&#xff0c;面向切面编程&#xff09;把业务功能分为核心、非核心两部分。 核心业务功能&#xff1a…...

什么是访问控制漏洞

什么是AC Bugs&#xff1f; 实验室 Vertical privilege escalation 仅通过隐藏目录/判断参数来权限控制是不安全的&#xff08;爆破url/爬虫/robots.txt/Fuzz/jsfinder&#xff09; Unprotected functionality 访问robots.txt 得到隐藏目录&#xff0c;访问目录 &#xff0c;…...

python基于百度,哈工大等停用表进行的中文分词

import os import pandas as pd import jieba# 加载停用词 def load_stopwords(filenames):stopwords set()for filename in filenames:with open(filename, r, encodingutf-8) as f:for line in f:stopwords.add(line.strip())return stopwords# 中文分词并去除停用词 def se…...

【学习笔记】计算机组成原理(七)

指令系统 文章目录 指令系统7.1 机器指令7.1.1 指令的一般格式7.1.2 指令字长 7.2 操作数类型和操作类型7.2.1 操作数类型7.2.2 数据在存储器中的存放方式7.2.3 操作类型 7.3 寻址方式7.3.1 指令寻址7.3.1.1 顺序寻址7.3.1.2 跳跃寻址 7.3.2 数据寻址7.3.2.1 立即寻址7.3.2.2 直…...

pillow学习4

ImageChops 模块 在 Pillow 库的内置模块 ImageChops 中包含了多个用于实现图片合成的函数。这些合成 功能是通过计算通道中像素值的方式来实现的。其主要用于制作特效、合成图片等操作。 常用的内置函数如下所示&#xff1a; &#xff08;1&#xff09;相加函数 add()&#xf…...

外企如何有效面对日益严格的跨境数据传输法律?

在当今这个数据驱动的时代&#xff0c;随着全球化步伐的加快&#xff0c;企业跨国界的数据交流已成为常态。但随之而来的&#xff0c;是各国政府对跨境数据传输日益严格的规定和监管&#xff0c;这让众多外资企业&#xff08;简称“外企”&#xff09;在享受全球市场红利的同时…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...