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

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

其中 writefile.js 代码如下

复制代码
const {
	default: logger
} = require("./logger")

var name
var url
var params
var method
var res

function setlog(name, url, params, method) {
	this.name = name
	this.url = url
	this.params = params
	this.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-PLUS
	plus.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-PLUS
	var 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

				} // if
				resolve();
			}, 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()

相关推荐
辻戋2 小时前
从零实现React Scheduler调度器
前端·react.js·前端框架
徐同保2 小时前
使用yarn@4.6.0装包,项目是react+vite搭建的,项目无法启动,报错:
前端·react.js·前端框架
Qrun3 小时前
Windows11安装nvm管理node多版本
前端·vscode·react.js·ajax·npm·html5
中国lanwp3 小时前
全局 npm config 与多环境配置
前端·npm·node.js
JELEE.4 小时前
Django登录注册完整代码(图片、邮箱验证、加密)
前端·javascript·后端·python·django·bootstrap·jquery
TeleostNaCl6 小时前
解决 Chrome 无法访问网页但无痕模式下可以访问该网页 的问题
前端·网络·chrome·windows·经验分享
前端大卫7 小时前
为什么 React 中的 key 不能用索引?
前端
你的人类朋友7 小时前
【Node】手动归还主线程控制权:解决 Node.js 阻塞的一个思路
前端·后端·node.js
小李小李不讲道理9 小时前
「Ant Design 组件库探索」五:Tabs组件
前端·react.js·ant design
毕设十刻9 小时前
基于Vue的学分预警系统98k51(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js