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

OpenWrt | 如何在 ucode 脚本中打印日志

文章目录

  • 一、问题背景
  • 二、实现方法

一、问题背景

OpenWrtucode 是一种轻量级脚本语言,专为嵌入式系统和 OpenWrt 环境设计。它的语法类似于 JavaScript,并提供了丰富的内置功能,使其适用于系统配置、Web 开发(如 LuCI 界面)以及嵌入式脚本任务。

例如一段标准的 ucode 脚本示例如下:

'use strict';let ubus = require('ubus').connect();// 返回一个方法列表
return {// 定义一个 ubus 对象名example: {// 定义一个方法method: {call: function() {return { message: "Hello World" };}}}
}

需要将此脚本放到 OpenWrt 系统的 /usr/share/rpcd/ucode 文件夹下,随后使用以下命令重启 rpcd 服务

/etc/init.d/rpcd restart

此时所编写的 example 服务即被注册进了 ubus 中,通过命令 ucode list 可以看到刚刚新建的 example在这里插入图片描述

随后使用 ubus call example method 调用刚刚新增的方法,即可得到 Hello World 的输出
在这里插入图片描述

那么我们在编辑相关 ucode 脚本时,我们希望有日志打印,知道我们程序的运行状态,方便我们的调试,因此本文将详细介绍如何在 ucode 脚本中添加日志打印的方法。

二、实现方法

参考:

  • System logging functions: https://ucode.mein.io/module-log.html
  • OpenWrt Ucode Example: https://github.com/openwrt/rpcd/blob/master/examples/ucode/example-plugin
  • OpenWrt ubus:https://openwrt.org/docs/techref/ubus

首先,从 System logging functions 中的介绍可以知道,只要导入 log 包,调用 log.ulog(LOG_INFO, "Log message"); 即可打印日志,此时日志将输出到 OpenWrt 的日志中。
在这里插入图片描述

同时,使用 ulog_open(ULOG_SYSLOG, LOG_DAEMON, "LOG TAG"); 可以修改此脚本的打印的 TAG,方便在日志中筛选,例如有如下代码,分别打印四种级别的日志:

'use strict';// 导入日志包
import * as log from 'log';let ubus = require('ubus').connect();return {example: {method: {call: function() {// 修改日志打印的TAG 为 EXAMPLE-TAGlog.ulog_open(log.ULOG_SYSLOG, log.LOG_DAEMON, "EXAMPLE-TAG");// 打印 DEBUG 级别的日志log.ulog(log.LOG_DEBUG, "This is DEBUG log");// 打印 INFO 级别的日志log.ulog(log.LOG_INFO, "This is INFO log");// 打印 WARNING 级别的日志log.ulog(log.LOG_WARNING, "This is WARNING log");// 打印 ERROR 级别的日志log.ulog(log.LOG_ERR, "This is ERROR log");// 当调用了 ulog_open 需要调用 ulog_close, 还原系统日志的配置, 避免前面设置的 TAG 影响到其他日志打印log.ulog_close();return { message: "Hello World" };}}}
}

此时重启 rpcd 服务,执行定义的 ucode 方法,在系统日志中即可以看到相关的日志打印。
在这里插入图片描述

http://www.xdnf.cn/news/17128.html

相关文章:

  • 基于BiLSTM+CRF实现NER
  • Remix框架:高性能React全栈开发实战
  • 如何查看SoC线程的栈起始地址及大小
  • 【Bluedroid】btif_av_handle_event 流程源码解析
  • 数据结构(概念及链表)
  • NumPy库学习(三):numpy在人工智能数据处理的具体应用及方法
  • 安卓加固脱壳
  • io_getevents系统调用及示例
  • [Oracle] DUAL数据表
  • 性能测试工具ApacheBench、Jmeter
  • Linux Deepin深度操作系统应用商店加载失败,安装星火应用商店
  • Ubuntu系统VScode实现opencv(c++)视频的处理与保存
  • 基于单片机火灾报警系统/防火防盗系统设计
  • linux下jvm之jstack的使用
  • 应急响应整理
  • 百度网盘SVIP下载速度异常
  • 浅谈Python中的os.environ:环境变量交互机制
  • 基于Springboot+UniApp+Ai实现模拟面试小工具八:管理端基础功能实现
  • mybatis-plus从入门到入土(四):持久层接口之BaseMapper和选装件
  • OSPF HCIP
  • CICD--自动化部署--jinkins
  • 微服务的使用
  • SpringAI无人机智能灌溉、本地化AI推理、分析气象站、分析球场草皮系统实践
  • 【openlayers框架学习】十一:openlayers实战功能介绍与前端设计
  • 图像张量中的通道维度
  • 计算机网络:如何在实际网络中进行子网划分
  • 机器翻译入门:定义、发展简史与核心价值
  • Day23--回溯--39. 组合总和,40. 组合总和 II,131. 分割回文串
  • SQL 地理空间原理与实现
  • GLM-4.5 解读:统一推理、编码与智能体的全能王