uni app 的app端 写入运行日志到指定文件夹。

uni app 的app 端 写入指定目录文件夹。并自动生成当前日期的日志文件。删除十日前的日志文件

其中 writefile.js 代码如下

const {default: logger
} = require("./logger")var name
var url
var params
var method
var resfunction setlog(name, url, params, method) {this.name = namethis.url = urlthis.params = paramsthis.method = method}function setres(res) {this.res = res
}function savelog() {var logs = {操作: this.name,接口: this.url,参数: this.params,接口方式: this.method,返回: this.res}logger.log(JSON.stringify(logs))
}function removelog() {logger.removeFile(10)
}module.exports = {setlog: setlog,savelog: savelog,setres: setres,removelog: removelog
};

logger.js 文件代码如下

/**
* 标题:自定义日志存储在txt中
* 说明:
1. 自定义日志存储在txt中
2. 生成的文件存放在对应app目录下的 _doc/logs 文件夹中
··· js
// main.js 文件进行全局挂载
// 引入logger
import logger from  '@/components/libs/logger.js'
// 挂载logger
uni.$console = logger;
```
...
* 使用方法 *********************************************
* 1. 使用全局挂载的方式(和console)一致
* uni.$console.debug('日志信息');
* uni.$console.log('日志信息');
* uni.$console.info('日志信息');
* uni.$console.warn('日志信息');
* uni.$console.error('日志信息');* 2. 在普通js文件单独引入的方法
* import logger from '@/path/to/the/logger.js'
* logger.log('日志信息')
* logger.error('日志信息')*/// 日志存放的文件夹目录
const LOG_DIR = '_doc/logs';/*** 获取当前时间*/
function getDayStr() {var y, m, d, h, mm, s;var date = new Date();y = date.getFullYear();m = date.getMonth() + 1;d = date.getDate();m = m < 10 ? "0" + m : m;d = d < 10 ? "0" + d : d;// //console.log('日期:',y,m,d)// return '20220607' // 生成指定日期return '' + y + m + d;
}
/*** 获取当前时间,yyyy-mm-dd hh:mm:ss* 用于记录日志的时间信息*/
function getTimeStr() {var y, m, d, h, mm, s;var date = new Date();y = date.getFullYear();m = date.getMonth() + 1;d = date.getDate();h = date.getHours();mm = date.getMinutes();s = date.getSeconds();m = m < 10 ? "0" + m : m;d = d < 10 ? "0" + d : d;h = h < 10 ? "0" + h : h;mm = mm < 10 ? "0" + mm : mm;s = s < 10 ? "0" + s : s;var timeStr = y + "-" + m + "-" + d + " " + h + ":" + mm + ":" + s;return timeStr;
}
/*** 日志TXT的名称*/
function getLogFileName() {const txt = LOG_DIR + '/' + getDayStr() + '.txt';console.log('TXT文件名称:', txt)return txt;
}
/*** @param {Object} tag 标识* @param {Object} msg 空格*/
function writeToTxt(tag) {let msgs = '';for (var i = 1; i < arguments.length; i++) {const item = arguments[i];if (typeof(item) == 'string' ||typeof(item) == 'number' ||typeof(item) == 'boolean') {msgs = msgs + '\t' + item;} else {msgs = msgs + '\t' + JSON.stringify(item);}}let fileName = getLogFileName();// 获取当前时间let txt_msg = getTimeStr() + '\t[' + tag + ']\t' + msgs + '\n';if (tag == 'ERROR') {console.error(txt_msg);} else {// //console.log(txt_msg);}// #ifdef APP-PLUSplus.io.resolveLocalFileSystemURL(fileName, (fs) => {// //console.log(fs);});plus.io.requestFileSystem(plus.io.PRIVATE_DOC, (fs) => {fs.root.getFile(fileName, {create: true}, function(entry) {// 写入到本地entry.createWriter(function(writer) {writer.onwrite = function(e) {// console.log("Write data success!");console.log("写入本地日志 >>>> ", txt_msg);};writer.onerror = function(e) {console.eror('写入本地日志失败 >>>> ', JSON.stringify(e), txt_msg)}// Write data to the end of file.writer.seek(writer.length);writer.write(txt_msg);}, function(e) {console.log(e.message);});});}, function(e) {console.log("Request file system failed: " + JSON.stringify(e));});// #endif
}/*** 压缩所有的日志为zip*/
function zipLogDir(callback) {//console.log('开始压缩');// #ifdef APP-PLUSvar zipFile = "_doc/logs.zip";var targetPath = LOG_DIR;// 开始压缩文件console.log('开始压缩', targetPath, zipFile);plus.zip.compress(targetPath, zipFile,function(res) {console.log("开始压缩 Compress success!", res);if (callback) {callback({success: true,res,zipPath: zipFile});}},function(error) {console.error("开始压缩 Compress error!", error);if (callback) {callback({success: false,error});}});// #endif
}
/*** 删除多少天之前的日志文件*/
function removeFile(durationDay) {return new Promise((resolve, reject) => {if (!durationDay || durationDay <= 0) {durationDay = 10;}var dirPath = LOG_DIR;plus.io.resolveLocalFileSystemURL(dirPath, function(entry) {//读取这个目录对象var directoryReader = entry.createReader();// console.log(dirPath)//读取这个目录下的所有文件directoryReader.readEntries(function(entries) {console.log('日志文件数量', entries.length)//如果有才操作if (entries.length > 0) {let now = getDayStr();for (let file of entries) {// console.log(file.name);// 判断需要保留的日志let day = file.name.replace('.txt', '');// console.log(parseInt(day) + parseInt(durationDay) < parseInt(now));// console.log(parseInt(day));// console.log(parseInt(durationDay));// console.log(parseInt(day) + parseInt(durationDay));// console.log(parseInt(now));if (parseInt(day) + parseInt(durationDay) < parseInt(now)) {console.log('需要删除的日志是', file.name);try {file.remove(function() {console.error('删除日志成功', file.name);}, function(e) {console.error('删除日志失败', file.name, e);});} catch (e) {console.error('删除日志失败', file.name, e);}} else {console.log('保留的日志是', file.name);}} // for} // ifresolve();}, function(e) {console.log('读取文件失败:' + e.message)resolve();})}, function(e) {console.log('读取目录失败:' + e.message)resolve();})});
}/*** 自定义TXT日志*/
const logger = {/*** @param {Object} msg 日志信息的字符串信息*/debug: function() {writeToTxt('DEBUG', ...arguments);console.debug(...arguments);},log: function() {writeToTxt('LOG', ...arguments);console.log(...arguments);},info: function() {writeToTxt('INFO', ...arguments);console.info(...arguments);},warn: function() {writeToTxt('WARN', ...arguments);console.warn(...arguments);},error: function() {writeToTxt('ERROR', ...arguments);console.error(...arguments);},/*** @param {String} tag 日志信息的自定义信息*/tag: function(tag) {writeToTxt(tag, ...arguments);console.log(...arguments);},/*** @param {Object} msg 日志信息的字符串信息*/network: function() {writeToTxt('NETWORK', ...arguments);console.log(...arguments);},/*** @param {Object} msg 日志信息的字符串信息*/logIpExchange: function(msg) {writeToTxt('IpExchange', ...arguments);console.log(...arguments);},/*** 压缩成zip,并返回路径* @param {Object} callback*/zipLogDir,/*** 删除多少${durationDay}天之前的日志文件* @param {Object} durationDay 默认是10天*/removeFile,/*** 主要使用方法。先移除* @param {Object} callback*/removeFileAndZipLogDir(callback) {removeFile().then(() => {zipLogDir(callback);});}
}export default logger;

代码中参考了其他大佬的部分代码。具体时谁的忘了。见谅

使用

import writeFile from '../../utils/writeFile'

    writeFile.setlog("登录按钮点击", url, params, "post")

    res 为接口返回值

    writeFile.setres(res)
writeFile.savelog()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95446.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

桌面应用开发语言与框架选择指南

桌面应用开发的语言和框架选择非常丰富&#xff0c;从原生性能到跨平台解决方案应有尽有。下面我将它们分为几大类进行详细介绍&#xff0c;并附上各自的优缺点和适用场景。 一、 原生开发 (Native Development) 原生开发能提供最佳的性能和与操作系统最完美的集成体验。 1. …

C++知识

文章目录1.Cmap为什么线程不安全?2.map大量插入会有性能问题&#xff0c;为什么3.set的应用场景4.map set mutiset mutimap unordered_map unordered_set的底层实现、使用场景、优缺点1.Cmap为什么线程不安全? 其实STL中的容器都是线程不安全的&#xff0c;如果想要线程安全…

自学嵌入式第三十四天:网络编程-TCP

一、UDP用户数据报收发次数要对应&#xff1b;数据与数据之间有边界&#xff0c;多次调用收发时都是不同的数据报&#xff1b;接收方的数据大小>发送方的数据大小&#xff0c;如果接受方数据小了则会丢弃未读的部分&#xff0c;再次调用只会读下一包数据&#xff1b;二、服务…

Apache IoTDB:国产时序数据库的崛起与工业物联网的未来

&#x1f4d1;前言 在工业物联网的浪潮中&#xff0c;数据不再是副产品&#xff0c;而是驱动决策的核心资产。"随着物联网、工业互联网和智能监控的迅猛发展&#xff0c;时序数据正以前所未有的速度爆发。据预测&#xff0c;到2025年全球物联网设备将达750亿台&#xff0c…

一键核验,安全无忧!手机号三要素详情版API,为您的业务筑牢身份认证防线

一、什么是手机号三要素核验API&#xff1f; 手机号三要素核验API 是一种通过编程接口&#xff0c;实时验证一条个人身份信息是否与该国运营商登记的实名信息一致的在线服务。 这里的“三要素”特指&#xff1a; 姓名 身份证号码 手机号码 核验过程&#xff1a;用户提交上述三个…

轻松上手 qData 数据中台开源版:Docker Compose 助你10分钟跑起来

说在前面 谁适合看这份指南&#xff1f; 初次接触 qData&#xff0c;希望快速体验功能的小伙伴不想折腾复杂环境配置和前端打包的人想用“一键启动”省事体验完整平台的用户 我们已经为你准备好“开箱即用”的完整部署包&#xff0c;包括&#xff1a; ✅ 前端静态资源&…

Qt读写Excel--QXlsx基本使用

1、概述 Document 类是一个用于操作 XLSX 文件的类&#xff0c;继承自 QObject。它提供了对 Excel 文件的读写操作&#xff0c;包括单元格的读写、图片和图表的插入、单元格合并、列和行的格式化、数据验证和条件格式化等功能。此外&#xff0c;它还支持对工作簿和工作表的操作…

P13929 [蓝桥杯 2022 省 Java B] 山 题解

缩减一下题目的意思&#xff0c;问区间 [2022,2022222022] 有多少个数是回文数并且先单调不减&#xff0c;后单调不增。 因为有这两条条件&#xff0c;我们可以得知在判断时只用判断前半段的每个数是不是和对面相应的位置相等&#xff0c;以及是否单调不减。 为什么不用看后半段…

Unity Android 文件的读写

配置AndroidManifest 文件在Assets 目录下查找AndroidManifest 文件&#xff0c;添加权限声明&#xff0c;在application 节点中添加requestLegacyExternalStorage 属性。<!-- 权限声明 --> <uses-permission android:name"android.permission.READ_EXTERNAL_STO…

Pydantic模型验证测试:你的API数据真的安全吗?

url: /posts/03b2afdf35f55dbaef631710ab6da82c/ title: Pydantic模型验证测试:你的API数据真的安全吗? date: 2025-09-03T23:46:18+08:00 lastmod: 2025-09-03T23:46:18+08:00 author: cmdragon summary: Pydantic在FastAPI中用于数据验证和序列化,通过Python类型注解自动…

【Proteus仿真】AT89C51单片机中断系列仿真——INT0中断控制LED小灯/INT0和INT1中断控制数码管

目录 0案例视频效果展示 0.1例子1&#xff1a;INT0控制LED闪烁 0.2例子2&#xff1a;INT0中断控制数码管计数 0.3例子3&#xff1a;INT0中断实现秒表功能 0.4例子4&#xff1a;INT0INT1中断控制数码管计数 1基础知识补充——中断系统 1.1 中断源一览 1.2 控制寄存器 1…

MTK Linux DRM分析(三十三)- MTK mtk_mipi_tx.c

一、MIPI PHY驱动简介 1. MIPI 协议分层 应用层:显示(DSI)、摄像头(CSI)。 协议层:定义像素/图像帧如何封装成数据包。 物理层(PHY):具体电气信号传输方式 —— 这里就是 D-PHY 或 C-PHY。 2. D-PHY(Differential PHY) 传输方式:差分信号(类似 LVDS/USB/PCIe …

G2D 图形加速器

文章目录G2D 图形加速器1. 功能简介1.1 矩形填充1.2 旋转和镜像 (rotate and mirror)1.3 透明度混合1.4 colorkey1.5 缩放 (Stretchblt)2. G2D 框架3. 全志 G2D 使用示例3.1 使用G2D实现图像旋转缩放3.2 实时预览中加入旋转缩放功能G2D 图形加速器 G2D模块主要实现图像旋转、数…

【FPGA】单总线——DS18B20

目录 项目&#xff1a;项目&#xff08;含quartus工程、仿真文件&#xff09; 1. 单总线通信时序详解 1.1 初始化&#xff08;复位脉冲 存在脉冲&#xff09; 1.2 写时隙&#xff08;写“0”和写“1”&#xff09; 1.3 读时隙 2. DS18B20 暂存器与温度数据格式 2.1 暂存…

JUC的安全并发包机制

目录 1. Lock机制&#xff1a;明锁控制 2. 栅栏机制(CyclicBarrier) 3. 闭锁机制(CountDownLatch) 4. 信号量机制(Semaphore) 5. 无锁机制 1. Lock机制&#xff1a;明锁控制 Lock接口提供了比synchronized更灵活的锁机制&#xff0c;属于明锁&#xff08;需要手动获取和释…

开源企业级快速开发平台(JeecgBoot)

JeecgBoot 是一款基于 Spring Boot Vue 技术栈的开源企业级快速开发平台&#xff0c;旨在通过「低代码代码生成」模式降低企业级应用的开发成本&#xff0c;提升开发效率。其核心定位是“开箱即用的中后台解决方案”&#xff0c;覆盖权限管理、表单报表、工作流、代码生成等核…

探索 PostgreSQL 和 MySQL 之间的主要差异和相似之处,找到满足您项目需求的最佳数据库解决方案。

探索 PostgreSQL 和 MySQL 之间的主要差异和相似之处&#xff0c;找到满足您项目需求的最佳数据库解决方案。 探索 PostgreSQL 和 MySQL 之间的主要差异和相似之处&#xff0c;找到满足您项目需求的最佳数据库解决方案。 关系数据库已经存在了很长时间。事实上&#xff0c;关系…

如何画时序图、流程图、状态流转图

如何画时序图、流程图、状态流转图流程图符号约定时序图元素交互框最佳实践状态流转图在研发或者写技术方案的时候&#xff0c;我们经常会画各种图。图比文字更加容易理解一些&#xff0c;那么如何画出优秀好看的图呢下面简单介绍一些画图时需要注意的点 流程图 流程图是流程…

CSDN 与 掘金 高效学习指南

CSDN 和掘金&#xff08;juejin.cn&#xff09;是国内最活跃的技术社区&#xff0c;但信息量巨大、质量参差不齐。高效运用的关键是&#xff1a;从“被动浏览”转向“主动获取”&#xff0c;避免陷入“收藏一堆文章却学不会”的陷阱。 以下是为你量身定制的CSDN 与 掘金 高效学…

容器tomcat镜像制作

pull-tomcat镜像 docker pull tomcat启动 –security-opt 禁用默认的安全策略&#xff0c;放宽限制 docker run -d --name mysql-tomcat -p 8080:8080 --security-opt seccompunconfined tomcat:latest进入容器直接访问404&#xff0c;网页相关的webapps下面为空&#xff0c;将…