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

在uni-app中引入本地日志插件

src/js_sdk/FXX-APP-LOG/FXX-APP-LOG.js

// 条件编译:仅在 APP-PLUS 平台(5+ App)下执行
// #ifdef APP-PLUS
const LogCat = {// 获取主Activity上下文main: plus.android.runtimeMainActivity(),// 导入Android原生类Environment: plus.android.importClass('android.os.Environment'),BufferedWriter: plus.android.importClass('java.io.BufferedWriter'),BufferedReader: plus.android.importClass('java.io.BufferedReader'),File: plus.android.importClass('java.io.File'),FileOutputStream: plus.android.importClass('java.io.FileOutputStream'),FileInputStream: plus.android.importClass('java.io.FileInputStream'),OutputStreamWriter: plus.android.importClass('java.io.OutputStreamWriter'),InputStreamReader: plus.android.importClass('java.io.InputStreamReader'),// 日志存储路径LogPath: '',/*** 初始化日志存储路径* 优先使用外部存储,不可用时回退到内部存储*/init: function () {if (this.Environment.MEDIA_MOUNTED ||!this.Environment.isExternalStorageRemovable()) {this.LogPath = this.main.getExternalFilesDir(null).getPath() + '/fxx_log'} else {this.LogPath = this.main.getFilesDir().getPath() + '/fxx_log'}console.log('日志文件存放路径->', this.LogPath)},/*** 将参数转换为字符串* @param {...any} args - 任意数量的参数* @returns {string} 拼接后的字符串*/argsToString: function (...args) {return args.map(arg => (typeof arg === 'object' ? JSON.stringify(arg) : String(arg))).join(',')},/*** 写入日志到文件* @param {...any} args - 要记录的日志内容*/writeLog: function (...args) {let date = getTime('YYYY-MM-DD') // 获取当前日期let datetime = getTime() // 获取完整的时间格式const msg = this.argsToString(...args) // 转换参数为字符串// 按日期分割日志文件let fileName = this.LogPath + '/log_' + date + '.txt'let content = `\n${datetime}: ${msg}\n` // 日志内容格式// 确保日志目录存在let file = new this.File(this.LogPath)if (!file.exists()) {file.mkdirs() // 递归创建目录}// 使用缓冲流写入文件let fos = nulllet bw = nulltry {fos = new this.FileOutputStream(fileName, true) // true表示追加模式bw = new this.BufferedWriter(new this.OutputStreamWriter(fos))bw.append(content) // 追加内容} catch (e) {console.log('写入日志失败->', e)} finally {try {if (bw != null) bw.close() // 关闭流if (fos != null) fos.close()} catch (closeEx) {console.log('关闭流失败->', closeEx)}}},/*** 删除指定日志文件* @param {string} fileName - 要删除的文件路径*/removeLogFile: function (fileName) {let file = new this.File(fileName)let fos = new this.FileOutputStream(fileName, true)fos.close()file.delete()console.log('删除日志文件->' + fileName)},/*** 获取日志文件列表* @returns {Array} 返回包含文件名和路径的对象数组*/getLogFileList: function () {let list = []let file = new this.File(this.LogPath)let tempList = file.listFiles()for (let i = 0; i < tempList.length; i++) {list.push({name: tempList[i].getName(),filePath: tempList[i].getPath()})}return list},/*** 读取日志文件内容* @param {string} path - 文件路径* @returns {Array} 按行分割的日志内容数组*/readLog: function (path) {const charset = 'utf-8'let file = new this.File(path)let list = []try {if (!file.exists()) return listlet inputStreamReader = new this.InputStreamReader(new this.FileInputStream(file),charset)let bufferedReader = new this.BufferedReader(inputStreamReader)let line = ''while ((line = bufferedReader.readLine()) != null) {if (line) list.push(line)}bufferedReader.close()inputStreamReader.close()} catch (e) {console.error('读取日志失败->', e)// 确保资源关闭if (bufferedReader) bufferedReader.close()if (inputStreamReader) inputStreamReader.close()}return list}
}// 初始化日志系统
LogCat.init()
// #endif// 非APP-PLUS平台的空实现
// #ifndef APP-PLUS
const LogCat = {}
// #endif/*** 重写console.log方法* 保持原始功能同时写入日志文件*/
console.writeLog = function (...args) {console.log(...args) // 保持原始控制台输出// #ifdef APP-PLUSLogCat.writeLog(...args) // 写入文件// #endif
}/*** 时间格式化函数* @param {string} [style] - 格式类型(可选),默认为 'YYYY-MM-DD hh:mm:ss'*  可选值:*    - 'hh:mm:ss'        : 时:分:秒*    - 'YYYY-MM-DD'      : 年-月-日*    - 'YYYYMMDD'        : 年月日*    - 'YYYY-MM-DD hh:mm:ss' : 年-月-日 时:分:秒 (默认)*    - 'YYYYMMDDhhmmss'  : 年月日时分秒*    - 'YYYY'            : 年*    - 'MM'              : 月*    - 'DD'              : 日*    - 'getDay'          : 星期几(0-6)* @returns {string} 格式化后的时间字符串*/
const getTime = (style = 'YYYY-MM-DD hh:mm:ss') => {const time = new Date()// 时间组件补零处理const pad = num => (num < 10 ? `0${num}` : num)const yyyy = time.getFullYear()const mm = pad(time.getMonth() + 1) // 月份从0开始const dd = pad(time.getDate())const h = pad(time.getHours())const m = pad(time.getMinutes())const s = pad(time.getSeconds())const z = time.getDay() // 星期几(0-6)// 格式映射表const formats = {'hh:mm:ss': `${h}:${m}:${s}`,'YYYY-MM-DD': `${yyyy}-${mm}-${dd}`,YYYYMMDD: `${yyyy}${mm}${dd}`,'YYYY-MM-DD hh:mm:ss': `${yyyy}-${mm}-${dd} ${h}:${m}:${s}`,YYYYMMDDhhmmss: `${yyyy}${mm}${dd}${h}${m}${s}`,YYYY: yyyy,MM: mm,DD: dd,getDay: z}return formats[style] || formats['YYYY-MM-DD hh:mm:ss']
}export default LogCat

使用示例:

// 基本使用
LogCat.writeLog('用户操作', {action: 'login', time: new Date()})// 通过重写的console方法
console.writeLog('API响应数据:', responseData)// 读取日志
const logs = LogCat.readLog('/path/to/logfile.txt')// 获取日志列表
const logFiles = LogCat.getLogFileList()

注意事项:

  1. 需要真机运行才能测试完整功能
  2. Android需要存储权限(Android 6.0+需要动态申请)
  3. 大量日志写入建议使用队列机制
  4. 敏感信息记录前应做脱敏处理
http://www.lryc.cn/news/606673.html

相关文章:

  • 开发者体验如何度量?
  • android APT技术
  • 嵌入式系统教学范式演进:云端仿真平台如何重构温湿度监测实验教学
  • JavaScript语法树简介:AST/CST/词法/语法分析/ESTree/生成工具
  • 2025 腾讯广告算法大赛 Baseline 项目解析
  • gd32modbus从机移植
  • 烽火HG680-KX-海思MV320芯片-2+8G-安卓9.0-强刷卡刷固件包
  • 关税战火中的技术方舟:新西兰证券交易所的破局之道 ——从15%关税冲击到跨塔斯曼结算联盟,解码下一代交易基础设施
  • VSCode:通义灵码插件安装使用 -- 免费AI编程工具
  • 高端房产管理小程序
  • C++继承中虚函数调用时机问题及解决方案
  • Spring框架下的中医针灸系统实现
  • 使用uniapp开发小程序-【引入字体并全局使用】
  • 1.6万 Star 的流行容器云平台停止开源
  • GitHub 趋势日报 (2025年07月31日)
  • hadoop.yarn 带时间的LRU 延迟删除
  • 【实战】Dify从0到100进阶--插件开发(1)Github爬取插件
  • 【2025/08/01】GitHub 今日热门项目
  • 24 SAP CPI 调用SAP HTTP接口
  • R语言基础图像及部分调用函数
  • Dify API接口上传文件 postman配置
  • osloader!DoGlobalInitialization函数分析之HW_CURSOR--NTLDR源代码分析之设置光标
  • django操作orm整套
  • 学习设计模式《二十》——解释器模式
  • 如何使用Postman做接口测试
  • curl命令使用
  • 【机器学习与数据挖掘实战 | 医疗】案例20:基于交叉验证和LightGBM算法的糖尿病遗传风险预测
  • 机器学习②【字典特征提取、文本特征处理(TF-IDF)、数据标准化与归一化、特征降维】
  • 解决IDEA无法克隆GitHub上的工程的问题
  • 解决IDEA中MAVEN项目总是将LANGUAGE LEVEL重置的问题