QNX/LINUX/Android系統動態配置動態庫.so文件日志打印級別的方法

背景

通常我們會在量產的產品上,配置軟件僅打印少量日志,以提升產品的運行性能。同時我們要考慮預留方法讓軟件能夠擁有能力可以在燒錄版本后能夠通過修改默寫配置,打印更多日志。因為量產后的軟件通常開啟熔斷與加密,不能夠輕松替換動態庫,或者鏡像文件。

分析

一種比較簡單的方法是,通過讀取文件來重新配置。一般我們盡可能要讓自己動態庫獨立配置,而不是讓動態庫從可執行程序的main()函數入口讀取配置。通過可執行程序配置(設置回調函數,或者設置日志等級)會讓動態庫對可執行程序的耦合度增大。如果自己是乙方只提供.so,可執行程序入口由甲方提供,那么如上實現的方法就更麻煩了。為了方便各個動態庫單獨配置,我們可以利用 C語言的__attribute__ 特性來實現動態庫自己動態配置日志等級。參考實現方案如下。

方案

?my_log.c 參考代碼如下:

#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
#include <stdarg.h>
#include <sys/time.h>#define INPUT_LOG_LEVEL_FILE_PATH        "/mnt/data/log-level"char my_printf_str[1024];
static int gLogLevel = MY_LOG_LEVEL_INFO;int my_log_print(int level, const char* fmt, ...){if (level > gLogLevel) return 0;va_list args;int val;struct timeval tv;gettimeofday(&tv, NULL);va_start( args, fmt );if(Callback_register.print != NULL) {vsprintf(BTF_printf_str, fmt, args);Callback_register.print("%d ", pthread_self());Callback_register.print("[%ld.%ld] ", tv.tv_sec, tv.tv_usec);val = Callback_register.print(my_printf_str);}else {printf("%d-", pthread_self());printf("[%ld.%ld] ", tv.tv_sec, tv.tv_usec);val = vprintf(fmt, args );}va_end(args);return val;
}int init_log_level(){char out = '0';FILE* fLogLevel = fopen(INPUT_LOG_LEVEL_FILE_PATH, "rb");do {if (NULL == fLogLevel) {printf("heyang: success log level file does not exist %s. Exiting.\n", INPUT_LOG_LEVEL_FILE_PATH);break;}if ((fread(&out, 1, 1, fLogLevel)) != 0) {rintf("read log level from file: %c\n", out);}fclose(fLogLevel);} while(0);int ret = atoi(&out);return ret > 0 ? ret : gLogLevel;
}static int __attribute__((constructor(101))) ___________________log_init() {gLogLevel = init_log_level();return 0;
}

my_log.h定義如下:

#define MY_LOG_LEVEL_FATAL 0
#define MY_LOG_LEVEL_ERROR 1
#define MY_LOG_LEVEL_WARNING 2
#define MY_LOG_LEVEL_INFO 3
#define MY_LOG_LEVEL_DEBUG 4
#define MY_LOG_LEVEL_VERBOSE 5int my_log_print(int level, const char* fmt, ...);

這樣就能能夠通過讀取?/mnt/data/log-level文件節寫的等級來動態配置了。

注意,加載這個.so的可執行程序需要配置好讀取文件的sepolicy權限(如果需要)。

測試

在代碼中使用:

   my_log_print(MY_LOG_LEVEL_VERBOSE, "BTF: heyang print verbose level\n");my_log_print(MY_LOG_LEVEL_DEBUG, "BTF: heyang print debug level\n");my_log_print(MY_LOG_LEVEL_INFO, "BTF: heyang print info level\n");my_log_print(MY_LOG_LEVEL_WARNING, "BTF: heyang print warning level\n");my_log_print(MY_LOG_LEVEL_ERROR, "BTF: heyang print error level\n");my_log_print(MY_LOG_LEVEL_FATAL, "BTF: heyang print fatal level\n");

在文件節點寫入配置

touch?/mnt/data/log-levelecho 3 > /mnt/data/log-levelreset

重啟后運行可執行文件,在終端查看打印發現,so的 __attribute__((constructor(101))) 代碼成功執行。調用相關接口能夠打印對應等級的日志。

再換個配置試試:

echo 5 > /mnt/data/log-levelreset

然后測試能夠打印全部日志:

其他

?以上僅是通過printf()演示。實際使用,建議更換為slog或者其他的高級日志系統。

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

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

相關文章

WebGL圖形編程實戰【4】:光影交織 × 逐片元光照與渲染技巧

現實世界中的物體被光線照射時&#xff0c;會反射一部分光。只有當反射光線進人你的眼睛時&#xff0c;你才能夠看到物體并辯認出它的顏色。 光源類型 平行光&#xff08;Directional Light&#xff09;&#xff1a;光線是相互平行的&#xff0c;平行光具有方向。平行光可以看…

【Hive入門】Hive基礎操作與SQL語法:DDL操作全面指南

目錄 1 Hive DDL操作概述 2 數據庫操作全流程 2.1 創建數據庫 2.2 查看數據庫 2.3 使用數據庫 2.4 修改數據庫 2.5 刪除數據庫 3 表操作全流程 3.1 創建表 3.2 查看表信息 3.3 修改表 3.4 刪除表 4 分區與分桶操作 4.1 分區操作流程 4.2 分桶操作 5 最佳實踐與…

YOLO數據處理

YOLO&#xff08;You Only Look Once&#xff09;的數據處理流程是為了解決目標檢測領域的核心挑戰&#xff0c;核心目標是為模型訓練和推理提供高效、規范化的數據輸入。其設計方法系統性地解決了以下關鍵問題&#xff0c;并對應發展了成熟的技術方案&#xff1a; 一、解決的問…

Ubuntu-Linux中vi / vim編輯文件,保存并退出

1.打開文件 vi / vim 文件名&#xff08;例&#xff1a; vim word.txt &#xff09;。 若權限不夠&#xff0c;則在前方添加 sudo &#xff08;例&#xff1a;sudo vim word.txt &#xff09;來增加權限&#xff1b; 2.進入文件&#xff0c;按 i 鍵進入編輯模式。 3.編輯結…

PCL繪制點云+法線

讀取的點云ASCII碼文件&#xff0c;每行6個數據&#xff0c;3維坐標3維法向 #include <iostream> #include <fstream> #include <vector> #include <string> #include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pc…

如何在學習通快速輸入答案(網頁版),其他學習平臺通用,手機上快速粘貼

目錄 1、網頁版&#xff08;全平臺通用&#xff09; 2、手機版&#xff08;學習通&#xff0c;其他平臺有可能使用&#xff09; 1、網頁版&#xff08;全平臺通用&#xff09; 1、首先CtrlC復制好答案 2、在學習通的作業里輸入1 3、對準1&#xff0c;然后鼠標右鍵 &#xff…

002 六自由度舵機機械臂——姿態解算理論

00 DH模型的核心概念 【全程干貨【六軸機械臂正逆解計算及仿真示例】】 如何實現機械臂的逆解計算-機器譜-robotway DH模型是機器人運動學建模的基礎方法&#xff0c;通過??四個參數??描述相鄰關節坐標系之間的變換關系。其核心思想是將復雜的空間位姿轉換分解為繞軸旋轉…

pymongo功能整理與基礎操作類

以下是 Python 與 PyMongo 的完整功能整理&#xff0c;涵蓋基礎操作、高級功能、性能優化及常見應用場景&#xff1a; 1. 安裝與連接 (1) 安裝 PyMongo pip install pymongo(2) 連接 MongoDB from pymongo import MongoClient# 基礎連接&#xff08;默認本地&#xff0c;端口…

Trae+DeepSeek學習Python開發MVC框架程序筆記(四):使用sqlite存儲查詢并驗證用戶名和密碼

繼續通過Trae向DeepSeek發問并修改程序&#xff0c;實現程序運行時生成數據庫&#xff0c;用戶在系統登錄頁面輸入用戶名和密碼后&#xff0c;控制器通過模型查詢用戶數據庫表來驗證用戶名和密碼&#xff0c;驗證通過后顯示登錄成功頁面&#xff0c;驗證失敗則顯示登錄失敗頁面…

如何識別金融欺詐行為并進行分析預警

金融行業以其高效便捷的服務深刻改變了人們的生活方式。然而,伴隨技術進步而來的,是金融欺詐行為的日益猖獗。從信用卡盜刷到復雜的龐氏騙局,再到網絡釣魚和洗錢活動,金融欺詐的形式層出不窮,其規模和影響也在不斷擴大。根據全球反欺詐組織(ACFE)的最新報告,僅2022年,…

紛析云:開源財務管理軟件的創新與價值

在企業數字化轉型中&#xff0c;紛析云作為一款優秀的開源財務管理軟件&#xff0c;正為企業財務管理帶來新變革&#xff0c;以下是其核心要點。 一、產品概述與技術架構 紛析云采用微服務架構&#xff0c;功能組件高內聚低耦合&#xff0c;可靈活擴展和定制。前端基于現代框…

蛋白質大語言模型ESM介紹

ESM(Evolutionary Scale Modeling)是 Meta AI Research 團隊開發的一系列用于蛋白質的預訓練語言模型。這些模型在蛋白質結構預測、功能預測和蛋白質設計等領域展現出了強大的能力。以下是對 ESM 的詳細介紹: 核心特點 大規模預訓練:基于大規模蛋白質序列數據進行無監督學…

OpenCv高階(七)——圖像拼接

目錄 一、圖像拼接的原理過程 1. 特征檢測與描述&#xff08;Feature Detection & Description&#xff09; 2. 特征匹配&#xff08;Feature Matching&#xff09; 3. 圖像配準&#xff08;Image Registration&#xff09; 4. 圖像變換與投影&#xff08;Warping&…

Native層Trace監控性能

一、基礎實現方法 1.1 頭文件引用 #include <utils/Trace.h> // 基礎版本 #include <cutils/trace.h> // 兼容舊版本1.2 核心宏定義 // 區間追蹤&#xff08;推薦&#xff09; ATRACE_BEGIN("TraceTag"); ...被監控代碼... ATRACE_END();// 函數級自…

金融行業微服務架構設計與挑戰 - Java架構師面試實戰

金融行業微服務架構設計與挑戰 - Java架構師面試實戰 本文通過模擬一位擁有十年Java研發經驗的資深架構師馬架構與面試官之間的對話&#xff0c;深入探討了金融行業項目在微服務架構下的技術挑戰與解決方案。 第一輪提問 面試官&#xff1a; 馬架構&#xff0c;請介紹一下您…

服務器虛擬化:技術解析與實踐指南

在信息技術飛速發展的今天,企業對服務器資源的需求日益增長,傳統物理服務器存在資源利用率低、部署周期長、管理成本高等問題。服務器虛擬化技術應運而生,它通過將物理服務器的計算、存儲、網絡等資源進行抽象和整合,劃分成多個相互隔離的虛擬服務器,從而提高資源利用率、…

OpenCV 圖形API(54)顏色空間轉換-----將圖像從 RGB 色彩空間轉換到 HSV色彩空間RGB2HSV()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 將圖像從 RGB 色彩空間轉換為 HSV。該函數將輸入圖像從 RGB 色彩空間轉換到 HSV。R、G 和 B 通道值的常規范圍是 0 到 255。 輸出圖像必須是 8 位…

Spring Boot的優點:賦能現代Java開發的利器

Spring Boot 是基于 Spring 框架的快速開發框架&#xff0c;自 2014 年發布以來&#xff0c;憑借其簡潔性、靈活性和強大的生態系統&#xff0c;成為 Java 后端開發的首選工具。尤其在 2025 年&#xff0c;隨著微服務、云原生和 DevOps 的普及&#xff0c;Spring Boot 的優勢更…

基于強化學習的智能交通控制系統設計

標題:基于強化學習的智能交通控制系統設計 內容:1.摘要 隨著城市交通流量的不斷增長&#xff0c;傳統交通控制方法在應對復雜多變的交通狀況時逐漸顯現出局限性。本文旨在設計一種基于強化學習的智能交通控制系統&#xff0c;以提高交通運行效率、減少擁堵。通過構建強化學習模…

數據挖掘技術與應用課程論文——數據挖掘中的聚類分析方法及其應用研究

數據挖掘中的聚類分析方法及其應用研究 摘要 聚類分析是數據挖掘技術中的一個重要組成部分,它通過將數據集中的對象劃分為多個組或簇,使得同一簇內的對象具有較高的相似性,而不同簇之間的對象具有較低的相似性。 本文系統地研究了數據挖掘中的多種聚類分析方法及其應用。首先…