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

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.lryc.cn/news/609069.html

相关文章:

  • C语言的基本结构
  • 加密流量论文复现:《Detecting DNS over HTTPS based data exfiltration》(上)
  • 代码随想录算法训练营第五十八天|动态规划part8
  • Linux 内存调优之如何限制进程、系统级别内存资源
  • 论文阅读笔记:《Dataset Condensation with Distribution Matching》
  • 学习方法论
  • React中的Hooks
  • 【深度学习新浪潮】谷歌新推出的AlphaEarth是款什么产品?
  • Unity_数据持久化_XML序列化与反序列化
  • 05.Redis 图形工具RDM
  • 6.1、Redis多级缓存原理和优化、Redis部分参数优化调整
  • Python篇--- Python 的加载、缓存、覆盖机制
  • 01.Redis 概述
  • 复现cacti的RCE
  • ELECTRICAL靶机
  • [硬件电路-145]:模拟电路 - 常见的电源芯片、用途、管脚定义
  • Spring+K8s+AI实战:3全栈开发指南
  • LeetCode Hot 100,快速学习,不断更
  • Steam饥荒联机版多人服务器搭建全解析 -- 阿里云Linux系统构建云服务器
  • kafka创建topic报错解决思路之一
  • 常⻅框架漏洞
  • 计算用户日活:从数据设计到可视化的全流程(高频场景题)
  • sqli-labs:Less-26关卡详细解析
  • C++-二叉树OJ题
  • 外设数据到昇腾310推理卡 之五 3403ATU
  • react native中markdown添加数学公式的支持
  • Java ++i 与 i++ 底层原理
  • 机器翻译入门:定义、发展简史与核心价值
  • [自动化Adapt] 录制引擎
  • MVCC:数据库事务隔离的 “时空魔法”