uniapp 添加本地文件日志 并增加防抖(防止重复写入被覆盖)
作者:互联网
base64.js
// // THIS FILE IS AUTOMATICALLY GENERATED! DO NOT EDIT BY HAND! // ;(function(global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : // cf. https://github.com/dankogai/js-base64/issues/119 (function() { // existing version for noConflict() const _Base64 = global.Base64; const gBase64 = factory(); gBase64.noConflict = () => { global.Base64 = _Base64; return gBase64; }; if (global.Meteor) { // Meteor.js Base64 = gBase64; } global.Base64 = gBase64; })(); }((typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : this ), function() { 'use strict'; /** * base64.ts * * Licensed under the BSD 3-Clause License. * http://opensource.org/licenses/BSD-3-Clause * * References: * http://en.wikipedia.org/wiki/Base64 * * @author Dan Kogai (https://github.com/dankogai) */ const version = '3.6.0'; /** * @deprecated use lowercase `version`. */ const VERSION = version; const _hasatob = typeof atob === 'function'; const _hasbtoa = typeof btoa === 'function'; const _hasBuffer = typeof Buffer === 'function'; const _TD = typeof TextDecoder === 'function' ? new TextDecoder() : undefined; const _TE = typeof TextEncoder === 'function' ? new TextEncoder() : undefined; const b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; const b64chs = [...b64ch]; const b64tab = ((a) => { let tab = {}; a.forEach((c, i) => tab[c] = i); return tab; })(b64chs); const b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/; const _fromCC = String.fromCharCode.bind(String); const _U8Afrom = typeof Uint8Array.from === 'function' ? Uint8Array.from.bind(Uint8Array) : (it, fn = (x) => x) => new Uint8Array(Array.prototype.slice.call(it, 0).map(fn)); const _mkUriSafe = (src) => src .replace(/[+\/]/g, (m0) => m0 == '+' ? '-' : '_') .replace(/=+$/m, ''); const _tidyB64 = (s) => s.replace(/[^A-Za-z0-9\+\/]/g, ''); /** * polyfill version of `btoa` */ const btoaPolyfill = (bin) => { // console.log('polyfilled'); let u32, c0, c1, c2, asc = ''; const pad = bin.length % 3; for (let i = 0; i < bin.length;) { if ((c0 = bin.charCodeAt(i++)) > 255 || (c1 = bin.charCodeAt(i++)) > 255 || (c2 = bin.charCodeAt(i++)) > 255) throw new TypeError('invalid character found'); u32 = (c0 << 16) | (c1 << 8) | c2; asc += b64chs[u32 >> 18 & 63] + b64chs[u32 >> 12 & 63] + b64chs[u32 >> 6 & 63] + b64chs[u32 & 63]; } return pad ? asc.slice(0, pad - 3) + "===".substring(pad) : asc; }; /** * does what `window.btoa` of web browsers do. * @param {String} bin binary string * @returns {string} Base64-encoded string */ const _btoa = _hasbtoa ? (bin) => btoa(bin) : _hasBuffer ? (bin) => Buffer.from(bin, 'binary').toString('base64') : btoaPolyfill; const _fromUint8Array = _hasBuffer ? (u8a) => Buffer.from(u8a).toString('base64') : (u8a) => { // cf. https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/12713326#12713326 const maxargs = 0x1000; let strs = []; for (let i = 0, l = u8a.length; i < l; i += maxargs) { strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs))); } return _btoa(strs.join('')); }; /** * converts a Uint8Array to a Base64 string. * @param {boolean} [urlsafe] URL-and-filename-safe a la RFC4648 §5 * @returns {string} Base64 string */ const fromUint8Array = (u8a, urlsafe = false) => urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a); // This trick is found broken https://github.com/dankogai/js-base64/issues/130 // const utob = (src: string) => unescape(encodeURIComponent(src)); // reverting good old fationed regexp const cb_utob = (c) => { if (c.length < 2) { var cc = c.charCodeAt(0); return cc < 0x80 ? c : cc < 0x800 ? (_fromCC(0xc0 | (cc >>> 6)) + _fromCC(0x80 | (cc & 0x3f))) : (_fromCC(0xe0 | ((cc >>> 12) & 0x0f)) + _fromCC(0x80 | ((cc >>> 6) & 0x3f)) + _fromCC(0x80 | (cc & 0x3f))); } else { var cc = 0x10000 + (c.charCodeAt(0) - 0xD800) * 0x400 + (c.charCodeAt(1) - 0xDC00); return (_fromCC(0xf0 | ((cc >>> 18) & 0x07)) + _fromCC(0x80 | ((cc >>> 12) & 0x3f)) + _fromCC(0x80 | ((cc >>> 6) & 0x3f)) + _fromCC(0x80 | (cc & 0x3f))); } }; const re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g; /** * @deprecated should have been internal use only. * @param {string} src UTF-8 string * @returns {string} UTF-16 string */ const utob = (u) => u.replace(re_utob, cb_utob); // const _encode = _hasBuffer ? (s) => Buffer.from(s, 'utf8').toString('base64') : _TE ? (s) => _fromUint8Array(_TE.encode(s)) : (s) => _btoa(utob(s)); /** * converts a UTF-8-encoded string to a Base64 string. * @param {boolean} [urlsafe] if `true` make the result URL-safe * @returns {string} Base64 string */ const encode = (src, urlsafe = false) => urlsafe ? _mkUriSafe(_encode(src)) : _encode(src); /** * converts a UTF-8-encoded string to URL-safe Base64 RFC4648 §5. * @returns {string} Base64 string */ const encodeURI = (src) => encode(src, true); // This trick is found broken https://github.com/dankogai/js-base64/issues/130 // const btou = (src: string) => decodeURIComponent(escape(src)); // reverting good old fationed regexp const re_btou = /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g; const cb_btou = (cccc) => { switch (cccc.length) { case 4: var cp = ((0x07 & cccc.charCodeAt(0)) << 18) | ((0x3f & cccc.charCodeAt(1)) << 12) | ((0x3f & cccc.charCodeAt(2)) << 6) | (0x3f & cccc.charCodeAt(3)), offset = cp - 0x10000; return (_fromCC((offset >>> 10) + 0xD800) + _fromCC((offset & 0x3FF) + 0xDC00)); case 3: return _fromCC(((0x0f & cccc.charCodeAt(0)) << 12) | ((0x3f & cccc.charCodeAt(1)) << 6) | (0x3f & cccc.charCodeAt(2))); default: return _fromCC(((0x1f & cccc.charCodeAt(0)) << 6) | (0x3f & cccc.charCodeAt(1))); } }; /** * @deprecated should have been internal use only. * @param {string} src UTF-16 string * @returns {string} UTF-8 string */ const btou = (b) => b.replace(re_btou, cb_btou); /** * polyfill version of `atob` */ const atobPolyfill = (asc) => { // console.log('polyfilled'); asc = asc.replace(/\s+/g, ''); if (!b64re.test(asc)) throw new TypeError('malformed base64.'); asc += '=='.slice(2 - (asc.length & 3)); let u24, bin = '', r1, r2; for (let i = 0; i < asc.length;) { u24 = b64tab[asc.charAt(i++)] << 18 | b64tab[asc.charAt(i++)] << 12 | (r1 = b64tab[asc.charAt(i++)]) << 6 | (r2 = b64tab[asc.charAt(i++)]); bin += r1 === 64 ? _fromCC(u24 >> 16 & 255) : r2 === 64 ? _fromCC(u24 >> 16 & 255, u24 >> 8 & 255) : _fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255); } return bin; }; /** * does what `window.atob` of web browsers do. * @param {String} asc Base64-encoded string * @returns {string} binary string */ const _atob = _hasatob ? (asc) => atob(_tidyB64(asc)) : _hasBuffer ? (asc) => Buffer.from(asc, 'base64').toString('binary') : atobPolyfill; // const _toUint8Array = _hasBuffer ? (a) => _U8Afrom(Buffer.from(a, 'base64')) : (a) => _U8Afrom(_atob(a), c => c.charCodeAt(0)); /** * converts a Base64 string to a Uint8Array. */ const toUint8Array = (a) => _toUint8Array(_unURI(a)); // const _decode = _hasBuffer ? (a) => Buffer.from(a, 'base64').toString('utf8') : _TD ? (a) => _TD.decode(_toUint8Array(a)) : (a) => btou(_atob(a)); const _unURI = (a) => _tidyB64(a.replace(/[-_]/g, (m0) => m0 == '-' ? '+' : '/')); /** * converts a Base64 string to a UTF-8 string. * @param {String} src Base64 string. Both normal and URL-safe are supported * @returns {string} UTF-8 string */ const decode = (src) => _decode(_unURI(src)); /** * check if a value is a valid Base64 string * @param {String} src a value to check */ const isValid = (src) => { if (typeof src !== 'string') return false; const s = src.replace(/\s+/g, '').replace(/=+$/, ''); return !/[^\s0-9a-zA-Z\+/]/.test(s) || !/[^\s0-9a-zA-Z\-_]/.test(s); }; // const _noEnum = (v) => { return { value: v, enumerable: false, writable: true, configurable: true }; }; /** * extend String.prototype with relevant methods */ const extendString = function () { const _add = (name, body) => Object.defineProperty(String.prototype, name, _noEnum(body)); _add('fromBase64', function () { return decode(this); }); _add('toBase64', function (urlsafe) { return encode(this, urlsafe); }); _add('toBase64URI', function () { return encode(this, true); }); _add('toBase64URL', function () { return encode(this, true); }); _add('toUint8Array', function () { return toUint8Array(this); }); }; /** * extend Uint8Array.prototype with relevant methods */ const extendUint8Array = function () { const _add = (name, body) => Object.defineProperty(Uint8Array.prototype, name, _noEnum(body)); _add('toBase64', function (urlsafe) { return fromUint8Array(this, urlsafe); }); _add('toBase64URI', function () { return fromUint8Array(this, true); }); _add('toBase64URL', function () { return fromUint8Array(this, true); }); }; /** * extend Builtin prototypes with relevant methods */ const extendBuiltins = () => { extendString(); extendUint8Array(); }; const gBase64 = { version: version, VERSION: VERSION, atob: _atob, atobPolyfill: atobPolyfill, btoa: _btoa, btoaPolyfill: btoaPolyfill, fromBase64: decode, toBase64: encode, encode: encode, encodeURI: encodeURI, encodeURL: encodeURI, utob: utob, btou: btou, decode: decode, isValid: isValid, fromUint8Array: fromUint8Array, toUint8Array: toUint8Array, extendString: extendString, extendUint8Array: extendUint8Array, extendBuiltins: extendBuiltins, }; // // export Base64 to the namespace // // ES5 is yet to have Object.assign() that may make transpilers unhappy. // gBase64.Base64 = Object.assign({}, gBase64); gBase64.Base64 = {}; Object.keys(gBase64).forEach(k => gBase64.Base64[k] = gBase64[k]); return gBase64; }));
log.js
import { Base64 } from './base64.js' // 保存文字 let logTextData=''; /** * js 日期格式化 * 传时间戳参数进行时间戳转换,不传时返回当前时间(返回年月日时分秒格式) * @param {Object} timeStamp 时间戳参数 非必传 * @param {Object} format 格式化样式 非必传 */ function getTimeStampDatetime(format = 'yyyy-MM-dd HH:mm:ss', timeStamp) { let nowDatetime = new Date() timeStamp ? nowDatetime = new Date(timeStamp) : nowDatetime = new Date() return nowDatetime.Format(format) } Date.prototype.Format = function(fmt) { var o = { "M+": this.getMonth() + 1, //月份 "d+": this.getDate(), //日 "H+": this.getHours(), //小时 "m+": this.getMinutes(), //分 "s+": this.getSeconds(), //秒 "q+": Math.floor((this.getMonth() + 3) / 3), //季度 "S": this.getMilliseconds() //毫秒 }; if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[ k]).substr(("" + o[k]).length))); return fmt; } // 获取日志文件名称 function getLogFileName() { // 今日日期 let nowDate = getTimeStampDatetime("yyyy-MM-dd") // 当前时间精确到秒 let nowTime = getTimeStampDatetime("HH:mm:ss") // 文件名称 let fileName = 'app-log.txt' // fileName = nowDate + 'log.txt' fileName = nowDate + '.txt' // 内容换行符(自定义) let newLine = "\r\n" + "======================================" + "\r\n" + nowTime + " =>>>" + "\r\n" return { nowDate:nowDate, newLine: newLine, fileName: fileName } } /** * 日志内容写入 * 文件写入手机地址,华为Android/data/应用包名/documents/app-log/2021-01-17log.text * @param {Object} params 写入内容 * @param {Object} encryption 是否加密 */ // 防抖 let writelogtime = null; function writeLog(params, encryption) { let text = JSON.stringify(params) if (encryption) { logTextData += (getLogFileName().newLine + " " + Base64.encode(text)); } else { logTextData += (getLogFileName().newLine + " " + text); } if (writelogtime) { clearTimeout(writelogtime) } //不然就创建新的定时器 3秒没有新日志再执行写入操作 writelogtime = setTimeout(function() { writeLogTxt() }, 3000) } function writeLogTxt(){ plus.io.requestFileSystem(plus.io.PUBLIC_DOCUMENTS, function(fs) { // 可通过fs操作PUBLIC_DOCUMENTS文件系统 // 创建日志文件夹 fs.root.getDirectory("app-log", { create: true, exclusive: false }, function(dir) { dir.getDirectory(getLogFileName().nowDate, { create: true, exclusive: false }, function(dir) { // 创建或写入文件 console.log("Directory Entry Name: " + dir.fullPath + getLogFileName().fileName); dir.getFile(getLogFileName().fileName, { create: true }, function(fileEntry) { // 找到文件准备写入操作 fileEntry.file(function(file) { // create a FileWriter to write to the file fileEntry.createWriter(function(writer) { // Write data to file. writer.seek(file.size - 1) // 换行插入日志文件 writer.write(logTextData); logTextData=''; }, function(e) { console.error("日志写入错误", error) }); }); }); }, function(err) { console.error("文件夹创建失败", err) }); }, function(err) { console.error("文件夹创建失败", err) }); }, function(error) { console.error("文件系统进入错误", error) }); } function delLogFile(){ console.log("日志删除") plus.io.resolveLocalFileSystemURL( '_documents/app-log', //指定的目录 function(entry) { var directoryReader = entry.createReader(); //获取读取目录对象 directoryReader.readEntries( function(entries) { //历遍子目录即可 for (var i = 0; i < entries.length; i++) { console.log("文件信息:" + entries[i].name); let twoDate=Date.parse(getLogFileName().nowDate)-(86400000*2); console.log("保留三天内日志",twoDate) if(Date.parse(entries[i].name)<twoDate){ entries[i].removeRecursively( function ( entry ) { writeLog( "日志删除成功"+entries[i].name,false); }, function ( e ) { writeLog( "日志删除成功"+e.message,false); } ); } } }, function(err) { console.log("没有异常日志"); }); }, function(err) { console.log("没有异常日志" ); }); } // 查询本地日志文件(直接当前页面调用,该接口未使用) function selectLogUrl(){ plus.io.resolveLocalFileSystemURL( '_documents/app-log', //指定的目录 function(entry) { var directoryReader = entry.createReader(); //获取读取目录对象 directoryReader.readEntries( function(entries) { //历遍子目录即可 let isLog = false; for (var i = 0; i < entries.length; i++) { console.log("文件信息:"+entries[i].name); if(entries[i].name==getLogFileName().nowDate){ console.log("获取到当天文件为",entries[i].name) var url="_documents/app-log/"+entries[i].name+'/'+getLogFileName().nowDate+'.txt'; var path=plus.io.convertLocalFileSystemURL(url); var newurl = plus.io.convertAbsoluteFileSystem(path); isLog=true; return newurl; } } if(isLog){ return ''; } }, function(err) { console.log("访问目录失败"); }); }, function(err) { console.log("访问目录失败"); }); } export default { writeLog, delLogFile, getLogFileName, selectLogUrl }
保存位置
标签:function,uniapp,防抖,const,string,src,Base64,return,日志 来源: https://www.cnblogs.com/fhysy/p/16673114.html