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

东莞东城做网站公司营销型网站seo

东莞东城做网站公司,营销型网站seo,燕郊网站建设哪家好,中国好设计背景 通常我们会在量产的产品上,配置软件仅打印少量日志,以提升产品的运行性能。同时我们要考虑预留方法让软件能够拥有能力可以在烧录版本后能够通过修改默写配置,打印更多日志。因为量产后的软件通常开启熔断与加密,不能够轻松…

背景

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

分析

一种比较简单的方法是,通过读取文件来重新配置。一般我们尽可能要让动态库独立配置,而不是让可执行程序从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/212335.html

相关文章:

  • 学做动态网站百度广告怎么投放多少钱
  • 建筑设计网站app制作app软件平台
  • 开发制作一个网站sem竞价推广代运营收费
  • 创建公司网站 教程如何搜索关键词
  • 网站刷单账务处理怎么做百度seo怎么关闭
  • 网络平台推广员河南seo快速排名
  • 周口网站建设网络营销推广的
  • 网站建站平台排行榜合肥全网优化
  • 广电如何做视频网站百度pc版网页
  • 广东省住房和城乡建设网站口碑营销的前提及好处有哪些?
  • 怎么做电商无货源模式四川seo多少钱
  • 做企业网站备案都需要什么培训班招生方案有哪些
  • 阿里免费logo生成器seo网络营销招聘
  • 怎么做送餐网站阐述网络推广的主要方法
  • 网站腾讯qq对话框怎么做百度网讯科技客服人工电话
  • 网站 极简主义今日头条新闻视频
  • 做优化网站多少钱百度搜索引擎入口官网
  • 做农业网站搜全网的浏览器
  • 深圳网络营销网站建设怎么在百度上设置自己的门店
  • 西宁网站设计公司seo搜索引擎推广
  • 广告公司出售家具 税率性价比高seo排名优化的
  • 免费1级做爰网站网站功能优化的方法
  • 上海翼成信息科技有限公司做的什么网站推广普通话宣传标语
  • 贵阳网站建设推广万网域名续费
  • 安亭公司网站建设企业网址
  • 做快递单网站今日头条关键词排名优化
  • 网站建设标签代运营电商公司排行榜
  • wordpress ebook插件对搜索引擎优化的认识
  • 公司级别网站开发怎么交换友情链接
  • 廊坊网站建设案例竞价排名规则