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

东莞东城做网站公司业务网站制作

东莞东城做网站公司,业务网站制作,云浮罗定疫情最新消息,python学了能干嘛背景 通常我们会在量产的产品上,配置软件仅打印少量日志,以提升产品的运行性能。同时我们要考虑预留方法让软件能够拥有能力可以在烧录版本后能够通过修改默写配置,打印更多日志。因为量产后的软件通常开启熔断与加密,不能够轻松…

背景

通常我们会在量产的产品上,配置软件仅打印少量日志,以提升产品的运行性能。同时我们要考虑预留方法让软件能够拥有能力可以在烧录版本后能够通过修改默写配置,打印更多日志。因为量产后的软件通常开启熔断与加密,不能够轻松替换动态库,或者镜像文件。

分析

一种比较简单的方法是,通过读取文件来重新配置。一般我们尽可能要让动态库独立配置,而不是让可执行程序从main()函数入口读取配置。这样动态库对可执行程序的依赖比较大,同时如果是乙方只提供.so,可执行程序入口由甲方提供,那么这样实现的方法就更麻烦了。为了方便各个动态库单独配置,我们可以利用 C语言的__attribute__ 特性来实现。参考实现方案如下。

方案

 my_log.c 参考代码如下:

#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
#include <stdarg.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;va_start( args, fmt );if(Callback_register.print != NULL) {vsprintf(BTF_printf_str, fmt, args);Callback_register.print("%d ", pthread_self());val = Callback_register.print(my_printf_str);}else {printf("%d-", pthread_self());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))) _________very_long_function_name__________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.dtcms.com/wzjs/127388.html

相关文章:

  • 揭阳网站定制服务器ip域名解析
  • 北京网站建设报价明细国内搜索引擎
  • 二手交易网站建设最新国内重大新闻
  • 免费软件制作网站免费推广工具有哪些
  • 天翼云wordpress插件网络营销优化推广公司
  • 做网站免费模板怎么上传到空间网站管理
  • 深圳专业网站建设服务最近新闻热点事件
  • wordpress开源程序建站教程聊城疫情最新消息
  • 东营网站建设电话最全资源搜索引擎
  • 如何将网站指向404我国的网络营销公司
  • 怎么查网站开发的语言百度知道官网手机版
  • 软件系统设计上海全国关键词排名优化
  • 重庆网站制作和推广公司做网络推广需要多少钱
  • flask做的网站 网址seo推广优化方案
  • 上海低价网站建设佛山网站建设正规公司
  • 赛迪建设网站网页搜索关键词
  • Wordpress外贸网站搭建公司免费网站建设
  • 一汽大众网站谁做的苏州seo报价
  • 网站视频怎么做的好网络营销案例有哪些
  • 政府网站 asp超级外链工具源码
  • 重庆网站建设招标电商网站平台
  • 用cms做网站的缺点化妆品营销推广方案
  • 政府网站建设问题网络营销是什么?
  • 怎么做新浪网站网络营销工具平台
  • 做网站文字居中代码免费下载百度seo
  • wordpress搭建服务器郑州网站推广优化公司
  • 长春专业做网站的公司有哪些企业查询系统官网天眼查
  • 福州最好的网站建设服务商杭州seo网络推广
  • wordpress 网站关键词公司网络营销推广
  • 淘宝领卷网站什么做网址注册