中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

政府網(wǎng)站建設(shè)人員組成上海優(yōu)化公司選哪個

政府網(wǎng)站建設(shè)人員組成,上海優(yōu)化公司選哪個,wordpress特效主題,美食網(wǎng)站怎樣做鍋包肉嵌入式日志信息保存調(diào)試(ulog) 獲取 項目地址:https://github.com/rdpoor/ulog uLog 為嵌入式微控制器或任何資源有限的系統(tǒng)提供結(jié)構(gòu)化的日志記錄機制。它繼承了流行的 Log4c 和 Log4j 平臺背后的一些概念,但開銷更低。 使用方…

嵌入式日志信息保存調(diào)試(ulog)

獲取

項目地址:https://github.com/rdpoor/ulog

uLog 為嵌入式微控制器或任何資源有限的系統(tǒng)提供結(jié)構(gòu)化的日志記錄機制。它繼承了流行的 Log4cLog4j 平臺背后的一些概念,但開銷更低。

使用方法

ulog中的ulog.culog.h文件移植進(jìn)入自己的工程。

  • 打開使能ulog函數(shù)使能,在ulog.h中
#define ULOG_ENABLED
  • 日志輸出等級
typedef enum {ULOG_TRACE_LEVEL=100,ULOG_DEBUG_LEVEL,ULOG_INFO_LEVEL,ULOG_WARNING_LEVEL,ULOG_ERROR_LEVEL,ULOG_CRITICAL_LEVEL,ULOG_ALWAYS_LEVEL
} ulog_level_t;
  • main函數(shù)分析

記住一個點:自定義里面的等級A,只有我們使用的ULOG_XXX函數(shù)中XXX的等級 >= A 的時候,該函數(shù)才會被真正的執(zhí)行

#include <stdio.h>
#include <string.h>
#include "ulog.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>// 用戶自定義用于調(diào)試的函數(shù)函數(shù)
void my_console_logger(ulog_level_t severity, char *msg)
{printf("console: %s [%s]: %s\n","time", // user defined functionulog_level_name(severity),msg);
}
// 用戶自定義用于將日志存儲進(jìn)文件的函數(shù)
void my_file_logger(ulog_level_t severity, char *msg)
{int fd = open("file.txt",O_RWRD|O_CRATE,0655);printf(,"file: %s [%s]: %s\n","time", // user defined functionulog_level_name(severity),msg)close(fd);
}int main()
{int arg = 42;// ulog的初始化ULOG_INIT();// 訂閱my_console_logger函數(shù),給予相應(yīng)的等級為 ULOG_WARNING_LEVELULOG_SUBSCRIBE(my_console_logger, ULOG_WARNING_LEVEL);// 訂閱my_file_logger函數(shù),給予相應(yīng)的等級為 ULOG_DEBUG_LEVELULOG_SUBSCRIBE(my_file_logger, ULOG_DEBUG_LEVEL);// 只會執(zhí)行 my_file_logger的函數(shù),理由是 ULOG_WARNING_LEVEL > ULOG_INFO_LEVEL 的等級// 但是 ULOG_DEBUG_LEVEL < ULOG_INFO_LEVEL 的等級// 自定義函數(shù)相應(yīng)等級只有小于等于的時候才會執(zhí)行相應(yīng)的操作函數(shù)ULOG_INFO("Info, arg=%d", arg);         // logs to file but not console// ULOG_WARNING_LEVEL > ULOG_DEBUG_LEVELULOG_CRITICAL("Critical, arg=%d", arg); // logs to file and console// 改變my_console_logger函數(shù)的操作等級為 ULOG_INFO_LEVELULOG_SUBSCRIBE(my_console_logger, ULOG_INFO_LEVEL);// 改變后兩個自定義函數(shù)的操作等級都小于等于 ULOG_INFO_LEVEL,所以兩個函數(shù)都會執(zhí)行ULOG_INFO("Info, arg=%d", arg); // logs to file and console// 取消 my_file_logger 函數(shù)的訂閱操作ULOG_UNSUBSCRIBE(my_file_logger);// 其中my_file_logger取消了,又 ULOG_INFO_LEVEL >= ULOG_INFO_LEVEL, 所以打印調(diào)試信息ULOG_INFO("Info, arg=%d", arg); 
}

自定義日志函數(shù)編寫

  • windows
char* get_timestamp()
{time_t ti_t;struct tm s_tm;time(&ti_t);localtime_s(&s_tm, &ti_t);char* time_chr = (char*)malloc(sizeof(char)*20);memset(time_chr,0,20);sprintf(time_chr, "%d-%d-%d %d:%d:%d",s_tm.tm_year + 1900, s_tm.tm_mon + 1, s_tm.tm_mday, s_tm.tm_hour, s_tm.tm_min, s_tm.tm_sec);return time_chr;
}void my_console_logger(ulog_level_t severity, const char* msg) {char *get_time = get_timestamp();printf("%s [%s]: %s\n",get_time,    // user defined functionulog_level_name(severity),msg);free(get_time);
}
  • linux
char *get_timestamp()
{time_t tt;struct tm *t;time(&tt);char *time_chr = (char *)malloc(sizeof(char) * 20);memset(time_chr, 0, 20);t = localtime(&tt);sprintf(time_chr, "%d-%d-%d %d:%d:%d", t->tm_year+1900,t->tm_mon + 1,t->tm_mday,(t->tm_hour + 15)%24,t->tm_min,t->tm_sec);return time_chr;
}void my_console_logger(ulog_level_t severity, const char *msg)
{char *get_time = get_timestamp();printf("%s [%s]: %s\n",get_time, // user defined functionulog_level_name(severity),msg);free(get_time);
}void my_file_logger(ulog_level_t severity, const char *msg)
{char *get_time = get_timestamp();FILE* fp = fopen("my_test.txt", "a+"); // 打開文件my_test.txt 這里文件可以跟改為時間fprintf(fp, "%s [%s]: %s\n",get_time, // user defined functionulog_level_name(severity),msg);free(get_time);
}

執(zhí)行后,文件中的內(nèi)容類似以下,這個格式是按照自己喜好在日志函數(shù)中自己編寫。

2023-4-18 20:23:14 [INFO]: Info, arg=42
2023-4-18 20:23:14 [CRITICAL]: main.c:67 arg=42
2023-4-18 20:23:14 [INFO]: main.c:66 arg=42

源碼分析

  • ulog_message
#define ULOG_DEBUG(...) ulog_message(ULOG_DEBUG_LEVEL, __VA_ARGS__)
// 這里的...表示的是可變參數(shù)  __VA_ARGS__ 這個也是對應(yīng)的表示可變參數(shù) 這里也可以改為
// #define ULOG_DEBUG(...) ulog_message(ULOG_DEBUG_LEVEL, const char* fmt, ...)void ulog_message(ulog_level_t severity, const char* fmt, ...) {// va_list 是一個字符指針,可以理解為指向當(dāng)前參數(shù)的一個指針,取參必須通過這個指針進(jìn)行va_list ap;int i;// 然后應(yīng)該對ap 進(jìn)行初始化,讓它指向可變參數(shù)表里面的第一個參數(shù),也就是const char* fmtva_start(ap, fmt);// 依次獲取ap的類型,并進(jìn)行sprintf函數(shù)類型功能組合成字符串,// 最大長度 ULOG_MAX_MESSAGE_LENGTH,超過會被截斷vsnprintf(s_message, ULOG_MAX_MESSAGE_LENGTH, fmt, ap);// 將這個 ap 指針關(guān)掉,以免發(fā)生危險va_end(ap);for (i = 0; i < ULOG_MAX_SUBSCRIBERS; i++) {// 函數(shù)是依次執(zhí)行的,那個函數(shù)先注冊,那個先運行if (s_subscribers[i].fn != NULL) {// 只有使用的輸出等級大于自定義函數(shù)等級的時候,就會執(zhí)行if (severity >= s_subscribers[i].threshold) {s_subscribers[i].fn(severity, s_message);}}}
}
  • ulog_err_t
// 錯誤標(biāo)志枚舉
typedef enum {ULOG_ERR_NONE = 0,ULOG_ERR_SUBSCRIBERS_EXCEEDED,ULOG_ERR_NOT_SUBSCRIBED,
} ulog_err_t;
  • ulog_subscribe、ulog_unsubscribe
// 執(zhí)行函數(shù)指針
typedef void (*ulog_function_t)(ulog_level_t severity, char* msg);
// 執(zhí)行結(jié)構(gòu)體
typedef struct {ulog_function_t fn;ulog_level_t threshold;
} subscriber_t;
// 執(zhí)行結(jié)構(gòu)體數(shù)組
#define ULOG_MAX_SUBSCRIBERS 6
static subscriber_t s_subscribers[ULOG_MAX_SUBSCRIBERS];// search the s_subscribers table to install or update fn
// 訂閱函數(shù),也就是將函數(shù)放入執(zhí)行結(jié)構(gòu)體數(shù)組中,并賦予相應(yīng)的輸出等級
ulog_err_t ulog_subscribe(ulog_function_t fn, ulog_level_t threshold) {int available_slot = -1;int i;for (i = 0; i < ULOG_MAX_SUBSCRIBERS; i++) {if (s_subscribers[i].fn == fn) {// 執(zhí)行結(jié)構(gòu)體數(shù)組已經(jīng)含有該執(zhí)行函數(shù),進(jìn)行更新即可// already subscribed: update threshold and return immediately.s_subscribers[i].threshold = threshold;return ULOG_ERR_NONE;}else if (s_subscribers[i].fn == NULL) {// found a free slot// 找到數(shù)組中最近的一個未使用的執(zhí)行結(jié)構(gòu)體,賦予標(biāo)志信息available_slot = i;}}// fn is not yet a subscriber.  assign if possible.if (available_slot == -1) {// 執(zhí)行結(jié)構(gòu)體數(shù)組中已經(jīng)存儲滿return ULOG_ERR_SUBSCRIBERS_EXCEEDED;}// 將執(zhí)行函數(shù)信息,放入執(zhí)行結(jié)構(gòu)體數(shù)組s_subscribers[available_slot].fn = fn;s_subscribers[available_slot].threshold = threshold;return ULOG_ERR_NONE;
}// search the s_subscribers table to remove
// 取消訂閱,就是將該函數(shù)從執(zhí)行結(jié)構(gòu)體數(shù)組中刪除
ulog_err_t ulog_unsubscribe(ulog_function_t fn) {int i;for (i = 0; i < ULOG_MAX_SUBSCRIBERS; i++) {if (s_subscribers[i].fn == fn) {s_subscribers[i].fn = NULL;    // mark as emptyreturn ULOG_ERR_NONE;}}return ULOG_ERR_NOT_SUBSCRIBED;
}
  • ulog_level_name
// 獲取相應(yīng)的輸出等級字符串
const char* ulog_level_name(ulog_level_t severity) {switch (severity) {case ULOG_TRACE_LEVEL: return "TRACE";case ULOG_DEBUG_LEVEL: return "DEBUG";case ULOG_INFO_LEVEL: return "INFO";case ULOG_WARNING_LEVEL: return "WARNING";case ULOG_ERROR_LEVEL: return "ERROR";case ULOG_CRITICAL_LEVEL: return "CRITICAL";case ULOG_ALWAYS_LEVEL: return "ALWAYS";default: return "UNKNOWN";}
}
http://www.risenshineclean.com/news/7844.html

相關(guān)文章:

  • 泉州自助建站seo怎么優(yōu)化效果更好
  • 沒備案的網(wǎng)站可以做淘客優(yōu)化大師班級
  • 如何做好公司網(wǎng)站公司seo是什么職位
  • php網(wǎng)站怎么做靜態(tài)化西安百度推廣聯(lián)系方式
  • 網(wǎng)站后臺卸載cmsdede安卓優(yōu)化大師新版
  • 句容建設(shè)路幼兒園網(wǎng)站鄭州高端網(wǎng)站建設(shè)哪家好
  • 外貿(mào)網(wǎng)站建設(shè)軟件百度一下你就知道主頁
  • 上海殷行建設(shè)網(wǎng)站百度上海分公司
  • 自學(xué)網(wǎng)站建設(shè)需要什么學(xué)歷關(guān)鍵詞排名點擊軟件首頁
  • seo網(wǎng)站建設(shè)公司哪家好網(wǎng)店培訓(xùn)班
  • 網(wǎng)站的用戶登錄一般怎么做的成功的軟文營銷案例
  • 網(wǎng)站如何做電腦和手機appseo創(chuàng)業(yè)
  • 網(wǎng)頁設(shè)計與網(wǎng)站建設(shè)大作業(yè)友情鏈接搜讀
  • 網(wǎng)上購物app進(jìn)一步優(yōu)化落實
  • 做網(wǎng)站開發(fā)需要什么證書重慶百度推廣關(guān)鍵詞優(yōu)化
  • 想做個ktv的網(wǎng)站怎么做網(wǎng)絡(luò)廣告策劃方案范文
  • 武漢市建設(shè)廳網(wǎng)站國內(nèi)最新新聞?wù)?/a>
  • 微博推廣軟件網(wǎng)站的seo是什么意思
  • 電子請柬網(wǎng)站開發(fā)app推廣實名認(rèn)證接單平臺
  • 政府網(wǎng)站頁面設(shè)計標(biāo)準(zhǔn)win10優(yōu)化大師怎么樣
  • 上海哪家網(wǎng)站建得好百度seo最成功的優(yōu)化
  • 福州外文網(wǎng)站建設(shè)網(wǎng)絡(luò)推廣平臺幾大類
  • 企業(yè)網(wǎng)站制作公司24小時接單seo sem
  • wordpress郵件模板seo實戰(zhàn)視頻
  • 服務(wù)器windos做網(wǎng)站整合營銷傳播方案
  • 家居網(wǎng)站建設(shè)全網(wǎng)營銷微信營銷軟件免費版
  • wordpress的cms插件山東進(jìn)一步優(yōu)化
  • 校園網(wǎng)上超市網(wǎng)站建設(shè)推廣b站在線觀看人數(shù)在哪
  • 免費個人網(wǎng)站空間申請2023年10月疫情還會嚴(yán)重嗎
  • 網(wǎng)站建設(shè)7個基本流程寧波seo外包服務(wù)商