【科普】關于C 語言日志系統實戰:如何同時輸出到終端和文件?

1.概述

c語言沒有現成的日志庫,如果要記錄日志,需要自己封裝一個日志庫。如果要實現日志級別和參數打印,還是比較麻煩的,正好在github找到了一個c語言開源日志庫,可以實現日志級別打印,參數打印,而且還會記錄日期和行號,最重要的是代碼非常少,只有100多行,可以直接包含在我們自己的工程代碼中,不需要任何依賴。

2.源碼地址

GitCode - 全球開發者的開源社區,開源代碼托管平臺

3.使用介紹

3.1直接把工程目錄下的log.c和log.h下載下來,包含到工程代碼中即可,沒有其他依賴。

3.2日志級別由低到高,分別為 LOG_TRACE、LOG_DEBUG、LOG_INFO、LOG_WARN、LOG_ERROR、LOG_FATAL

3.3如果設置日志級別為LOG_TRACE,則所有級別日志都會打印,如果設置日志級別為LOG_WARN,則只會打印LOG_WARN以及更高級別(即LOG_ERROR和LOG_FATAL)的日志

4.測試代碼

log.c

#include "log.h"
#include <stdio.h>int main() {FILE *fp = fopen("log.txt", "a+");if(fp == NULL){printf("create log file failed.\n");return -1;}//設置日志級別(在終端打印)log_set_level(LOG_TRACE);//設置日志級別(在文件中打印)log_add_fp(fp, LOG_INFO);log_trace("start trace.");log_debug("start debug.");log_info("start info.");log_warn("start warn.");log_error("start error.");log_fatal("start fatal");// 支持參數打印log_info("number is %d, string is %s", 10010, "helloword");fclose(fp);
}

log.h

/*** Copyright (c) 2020 rxi** This library is free software; you can redistribute it and/or modify it* under the terms of the MIT license. See `log.c` for details.*/#ifndef LOG_H
#define LOG_H#include <stdio.h>
#include <stdarg.h>
#include <stdbool.h>
#include <time.h>#define LOG_VERSION "0.1.0"typedef struct {va_list ap;const char *fmt;const char *file;struct tm *time;void *udata;int line;int level;
} log_Event;typedef void (*log_LogFn)(log_Event *ev);
typedef void (*log_LockFn)(bool lock, void *udata);enum { LOG_TRACE, LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR, LOG_FATAL };#define log_trace(...) log_log(LOG_TRACE, __FILE__, __LINE__, __VA_ARGS__)
#define log_debug(...) log_log(LOG_DEBUG, __FILE__, __LINE__, __VA_ARGS__)
#define log_info(...)  log_log(LOG_INFO,  __FILE__, __LINE__, __VA_ARGS__)
#define log_warn(...)  log_log(LOG_WARN,  __FILE__, __LINE__, __VA_ARGS__)
#define log_error(...) log_log(LOG_ERROR, __FILE__, __LINE__, __VA_ARGS__)
#define log_fatal(...) log_log(LOG_FATAL, __FILE__, __LINE__, __VA_ARGS__)const char* log_level_string(int level);
void log_set_lock(log_LockFn fn, void *udata);
void log_set_level(int level);
void log_set_quiet(bool enable);
int log_add_callback(log_LogFn fn, void *udata, int level);
int log_add_fp(FILE *fp, int level);void log_log(int level, const char *file, int line, const char *fmt, ...);#endif

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90341.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90341.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90341.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025,數字人借直播場景邁過“真假線”丨數智化觀察

作者 | 曾響鈴文 | 響鈴說一夜帶貨超5500萬GMV、觀看人次1300萬&#xff0c;羅永浩數字人在百度電商的直播首秀正在掀起新的行業浪潮——2025&#xff0c;數字人直播帶貨成功出圈&#xff0c;加速進入大眾視野&#xff0c;被更多的消費者所認可。成就這場熱潮的關鍵點之一&…

HTML表格導出為Excel文件的實現方案

1、前端javascript可通過mime類型、blob對象或專業庫&#xff08;如sheetjs&#xff09;實現html表格導出excel&#xff0c;適用于中小型數據量&#xff1b;2、服務器端方案利用后端語言&#xff08;如python的openpyxl、java的apache poi&#xff09;處理復雜報表和大數據&…

企業微信iPad協議端強制拉群漏洞深度分析

正常一次最多邀請40人進群 超過40人的拉群&#xff0c;會變成邀請&#xff0c;需要對方同意 新版本修復了漏洞&#xff0c;但還是可以用老版本進行強制拉群 雖然官方也做了版本過低的限制&#xff0c;但還是有辦法繞過 要么修改版本號或者登錄幾天新版本&#xff0c;之后就可以…

Python編譯器(Pycharm Jupyter)

Pycharm下載不過多贅述pycharm導入anaconda創建的python環境選擇想要的環境 Jupyter Jupyter 是一個開源的交互式計算環境&#xff0c;能夠讓用戶將代碼、文本&#xff08;包括 Markdown&#xff09;、可視化結果等內容整合在一個文檔中&#xff0c;非常適合進行數據分析、科學…

漏洞修復與Fiddler抓包工具的使用

漏洞描述 1. 短信轟炸漏洞 Type:存在三個不同的值。Login是登錄處,register是注冊賬號處的短信驗證碼獲取值,還有一個update值。未注冊的用戶也可以進行發送短信。 2. 手機號繞過,修改密碼漏洞(邏輯漏洞) 目前注冊使用手機號與忘記密碼的手機號驗證測試都可以繞過, …

對象存儲-OSS

目錄 對象存儲背景 阿里云OSS 對象存儲背景 單節點環境下&#xff0c;文件往往存儲在tomcat服務器內&#xff0c;隨著業務需求的增多&#xff0c;單節點已不能滿足需求&#xff0c;項目架構需要擴展到多節點&#xff08;見下圖&#xff09;&#xff0c;此時文…

C語言函數的聲明

1定義&#xff1a;在C語言中&#xff0c;函數是一段具有特定功能的獨立代碼塊&#xff0c;它可以接收輸入參數、執行相關操作并返回結果。2為什么需要函數&#xff08;1&#xff09;代碼復用&#xff1a;避免重復編寫相同功能的代碼&#xff0c; &#xff08;2&#xff09;模塊…

AI人工智能名片小程序源碼系統,名片小程序+分銷商城+AI客服,包含完整搭建教程

智能名片核心功能AI人工智能名片小程序的核心功能設計旨在徹底改變傳統商務交流方式&#xff0c;為用戶提供前所未有的智能化體驗。個性化名片展示是系統的基礎功能&#xff0c;用戶可以通過豐富的模板庫和自定義設計工具&#xff0c;創建獨具特色的電子名片。系統提供多種預設…

React 教程:井字棋游戲

React 教程&#xff1a;井字棋游戲 使用 React 實現一個交互式的井字棋游戲&#xff0c;并配上好看的樣式 // 導入必要的CSS樣式和React庫 import "./App.css"; import { useState } from "react";// Square組件 - 表示棋盤上的一個格子 function Square({…

React源碼2 React中的工廠函數:createRoot()

#React V18.2 源碼前置基礎知識&#xff1a;工廠函數工廠函數是一種設計模式&#xff0c;用于動態創建對象或函數實例。其核心思想是通過封裝對象創建的細節&#xff0c;提供統一的接口&#xff0c;從而增強代碼的靈活性和可維護性&#xff0c;有一些核心作用&#xff1a;解耦創…

《UE5_C++多人TPS完整教程》學習筆記42 ——《P43 瞄準(Aiming)》

本文為B站系列教學視頻 《UE5_C多人TPS完整教程》 —— 《P43 瞄準&#xff08;Aiming&#xff09;》 的學習筆記&#xff0c;該系列教學視頻為計算機工程師、程序員、游戲開發者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09; Stephen Ulibarri…

SQL Server 臨時表、表變量與WITH語句的用法與區別

引言 在SQL Server數據處理中,臨時表、表變量和WITH語句(CTE)是關鍵的中間結果集管理工具。臨時表適合大數據量操作,表變量優化小數據量場景,而CTE則簡化復雜查詢邏輯。三者選擇需綜合考量數據量級、事務需求及代碼可讀性。本文將深入解析其工作機制,通過實測對比指導場…

【Android】組件及布局介紹

一&#xff1a;代碼分析 1&#xff1a;Android界面開發方式 &#xff08;1&#xff09;JavaView&#xff08;傳統視圖系統&#xff09; 這是 Android 早期的開發方式&#xff0c;用 Java 或 Kotlin 代碼配合 XML 布局文件 來構建界面。&#xff08;簡單了解即可&#xff09; 分…

Android 音視頻 IPC序列化工具-Flattenable

Android Binder與AIDL與Service使用案例及分析-CSDN博客 講講這個類,被用在Android音視頻中,跨進程序列化反序列化用。與Binder驅動有很強的聯系。位于: feameworks/native/utils/Flattenable.h Flattenable, 譯為令人滿意的。可能是作者十分滿意自己的這些作品吧,起了這…

文獻學習|全面繪制和建模水稻調控組景觀揭示了復雜性狀背后的調控架構。

摘要&#xff1a; 解析調控復雜性狀的機制對于推進作物改良至關重要。在此&#xff0c;我們提出了一個全面的水稻&#xff08;Oryza sativa&#xff09;調控組圖譜&#xff0c;涵蓋了來自三個代表性品種的23種不同組織的染色質可及性。我們的研究揭示了117,176個獨特的開放染色…

Linux的壓縮與解壓縮

一、使用tar命令進行打包與解包 1.0、tar命令簡介和常用選項 tar命令是Linux中經常使用的歸檔工具&#xff0c;它的主要功能是【對文件或者目錄進行打包歸檔】&#xff0c;歸檔為一個文件&#xff0c;但是并不進行壓縮&#xff1b;tar命令的歸檔操作效果如下&#xff1a; tar命…

OpenCV+OCR實現弧形文字識別

以下是基于OpenCV與OCR實現弧形文字識別的完整技術方案&#xff0c;結合了圖像預處理、幾何變換與OCR引擎調用等關鍵步驟&#xff0c;并提供優化技巧&#xff1a;&#x1f50d; 一、技術原理弧形文字識別的核心在于??將彎曲文本轉換為水平直線??&#xff0c;便于OCR引擎處理…

【保姆級目標檢測教程】Ubuntu 20.04 部署 YOLOv13 全流程(附訓練/推理代碼)

前言 YOLOv13 是 YOLO 系列的全新一代實時目標檢測框架&#xff0c;在保持極高推理速度的同時顯著提升了檢測精度&#xff0c;廣泛適用于嵌入式部署、工業質檢、智能安防等多種場景。該版本提供了 Nano、Small、Large、X-Large 四種模型規格&#xff0c;用戶可以根據計算資源和…

【大模型】到底什么是Function Calling和MCP,以及和ReAct推理的關系是什么?

文章目錄背景&#xff1a;什么是Agent&#xff1f;背景&#xff1a;為什么需要Function Calling或者MCP&#xff1f;Function Calling和MCP在用戶請求中的整體流程Function Calling&#xff08;函數/工具調用&#xff09;MCP (Model Context Protocol)ReAct (Reasoning and Act…

CANDENCE 17.4 進行元器件緩存更新

在我從立創商城導入CANDENCE元器件后&#xff0c;在ORCAD放置元器件時出現了下面的錯誤解決辦法&#xff1a;1、在左邊找到 Design Cache文件夾&#xff0c;在文件夾上鼠標右擊選擇 Cleanup Cache2、再放置該元器件&#xff0c;不管這個&#xff0c;點擊確定3、這時候成功放上…