微信小程序集成前端日志庫的詳細(xì)記錄
在微信小程序內(nèi)接入日志庫的記錄
在開發(fā)微信小程序時,為了更好地調(diào)試和維護(hù)代碼,通常需要記錄日志信息。我嘗試了多種日志庫,包括Winston、pion和loglevel,并最終選擇了loglevel作為日志庫,并實(shí)現(xiàn)了日志上傳到服務(wù)器的功能。本文詳細(xì)記錄了這一過程,以供參考。
使用Winston失敗
最初,我嘗試在微信小程序中使用Winston日志庫。然而,Winston依賴Node.js的部分核心模塊(如stream、path和os),這些模塊在微信小程序的環(huán)境中不可用。這導(dǎo)致了編譯和運(yùn)行時錯誤。
示例錯誤信息:
Module not found: Error: Can't resolve 'stream' in 'node_modules/winston/dist/winston/transports'
手動編寫日志庫:
為了繞過上述這些問題,我嘗試手動編寫一個簡單的日志庫。該庫能夠記錄日志,并根據(jù)配置將日志發(fā)送到服務(wù)器
示例代碼:
// utils/logger.js import { getEnvironment } from './env' class Logger { constructor(config) { this.level = config.level || 'info'; this.sendToServer = config.sendToServer || false; this.serverUrl = config.serverUrl || ''; this.printInDev = config.printInDev || false; } log(level = this.level, message) { const env = getEnvironment() if (this.shouldLog(level)) { if (typeof message === 'undefined') { message = level; level = this.level; } //通過配置參數(shù)控制是否打印 if (this.printInDev || env == 'prod' || env == 'test') { console.log(`[${level.toUpperCase()}]: ${message}`); } if (this.sendToServer) { if (env == 'prod' || env == 'test') { this.sendLogToServer(level, message); } } } } info(message) { this.log('info', message); } warn(message) { this.log('warn', message); } error(message) { this.log('error', message); } shouldLog(level) { const levels = ['info', 'warn', 'error']; const currentLevelIndex = levels.indexOf(this.level); const messageLevelIndex = levels.indexOf(level); return messageLevelIndex >= currentLevelIndex; } sendLogToServer(level, message) { wx.request({ url: this.serverUrl, method: 'POST', data: { level, message, }, success(res) { console.log('Log sent to server:', res); }, fail(err) { console.error('Failed to send log to server:', err); }, }); } } module.exports = Logger;
app.js使用:
引入模塊
const Logger = require('./utils/logger.js');
在小程序onLaunch中初始化并掛在到wx
//實(shí)例話 Logger const logger = new Logger({ level: env, // 可配置為 'info', 'warning', 'error' sendToServer: true, // 是否發(fā)送到服務(wù)端 printInDev: false, //開發(fā)環(huán)境是否打印日志 serverUrl: 'https://your-server-url.com/logs', // 服務(wù)端 URL }); wx.logger = logger; //掛載到wx
使用小程序onError捕獲異常
onError(error) { wx.logger.log(error); },
最后重寫小程序page(),使日志庫能夠監(jiān)聽頁面生命周期
// utils/overridePage.js function overridePage() { const logger = wx.logger; const originalPage = Page; Page = function (pageConfig) { const originalOnLoad = pageConfig.onLoad; pageConfig.onLoad = function (options) { logger.log(`Page loaded: ${this.route}`); if (originalOnLoad) originalOnLoad.call(this, options); }; const originalOnShow = pageConfig.onShow; pageConfig.onShow = function () { logger.log(`Page shown: ${this.route}`); if (originalOnShow) originalOnShow.call(this); }; const originalOnHide = pageConfig.onHide; pageConfig.onHide = function () { logger.log(`Page hidden: ${this.route}`); if (originalOnHide) originalOnHide.call(this); }; const originalOnUnload = pageConfig.onUnload; pageConfig.onUnload = function () { logger.log(`Page unloaded: ${this.route}`); if (originalOnUnload) originalOnUnload.call(this); }; originalPage(pageConfig); }; } module.exports = overridePage;
const overridePage = require('./utils/overridePage.js');
wx.logger = logger; //掛載到wx overridePage(); //重寫page
使用loglevel
為了簡化日志記錄,我們決定使用更輕量級的loglevel庫。loglevel可以很方便地在微信小程序中使用,并且我們可以通過插件實(shí)現(xiàn)日志上傳功能。
安裝loglevel:
npm install loglevel
下載完成后,需要使用微信的npm構(gòu)建功能
在小程序內(nèi)使用loglevel
app.js import log from 'loglevel'; onlaunch(){ log.setLevel('info'); //設(shè)置 loglevel 日志輸出級別 log.trace('This is a trace message'); log.debug('This is a debug message'); log.info('This is an info message'); log.warn('This is a warning message'); log.error('This is an error message'); }
日志上傳服務(wù)器,loglevel的上傳插件使用XMLHttpRequest()上傳,小程序內(nèi)不支持,需要重寫上傳模塊,下附上傳插件源碼鏈接
https://github.com/artemyarulin/loglevel-serverSend/blob/master/loglevel-serverSend.js
重寫上傳模塊
// utils/loglevel-server-send-wx.js var loglevelServerSend = function (options) { var _url = options && options.url || 'http://localhost:8000/main/log', _callOriginal = options && options.callOriginal || false, _prefix = options && options.prefix, _sendQueue = [], _isSending = false; var _sendNextMessage = function () { if (!_sendQueue.length || _isSending) return; _isSending = true; var msg = _sendQueue.shift(); wx.request({ url: _url, method: 'POST', data: msg, header: { 'Content-Type': 'text/plain' }, success: function () { _isSending = false; setTimeout(_sendNextMessage, 0); }, fail: function () { _isSending = false; setTimeout(_sendNextMessage, 0); } }); }; wx.log = { log: function (level, message) { if (typeof _prefix === 'string') message = _prefix + message; else if (typeof _prefix === 'function') message = _prefix(level, message); else message = level + ': ' + message; console.log(`[${level.toUpperCase()}]: ${message}`); if (options && options.sendToServer) { _sendQueue.push(message); _sendNextMessage(); } }, info: function (message) { this.log('info', message); }, warn: function (message) { this.log('warn', message); }, error: function (message) { this.log('error', message); } }; }; module.exports = loglevelServerSend;
在app.js 中調(diào)用
const loglevelServerSend = require('./utils/loglevel-server-send-wx.js'); onLaunch(){ log.setLevel('info'); //設(shè)置 日志輸出級別 wx.log = log; //掛載到wx //wx.log*等觸發(fā)日志上傳服務(wù)端 loglevelServerSend({ url: 'https://your-server-url.com/logs', prefix: function (level, message) { return `[${new Date().toISOString()}] [${level.toUpperCase()}]: ${message}`; }, sendToServer: env === 'dev' || env === 'test' || env === 'pre' || env === 'prod', //設(shè)置允許上傳日志的環(huán)境 callOriginal: false // 上傳日志時是否控制臺打印 }); wx.log.level = 'info'; //動態(tài)改變?nèi)罩据敵龅募墑e } //捕獲異常 onError(error) { wx.log.log('error', error); },
獲取小程序當(dāng)前環(huán)境
如需根據(jù)小程序環(huán)境動態(tài)設(shè)置日志輸出級別,添加以下模塊
// utils/environment.js function getEnvironment() { return __wxConfig.envVersion; } function getLogLevel(env) { const levels = { 'develop': 'info', 'trial': 'warning', 'pre': 'error', 'release': 'error' }; return levels[env] || 'info'; } module.exports = { getEnvironment, getLogLevel };
結(jié)論
通過上述步驟,我成功在微信小程序中集成了loglevel日志庫,并實(shí)現(xiàn)了日志上傳到服務(wù)器的功能。這不僅提高了日志管理的靈活性,也為未來的維護(hù)和調(diào)試提供了更強(qiáng)大的支持。
參考資料
到此這篇關(guān)于微信小程序集成前端日志庫的文章就介紹到這了,更多相關(guān)微信小程序集成前端日志庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入探討JavaScript中parseInt與Number數(shù)字轉(zhuǎn)換方法的區(qū)別
在Javascript編程中,數(shù)字是一種常見的數(shù)據(jù)類型,經(jīng)常需要在不同的情境下進(jìn)行不同類型的操作,本文將深入探討parseInt()和Number()的區(qū)別,通過代碼示例和詳細(xì)解釋,幫助大家更好地理解它們的用途,需要的朋友可以參考下2023-08-08Json對象和字符串互相轉(zhuǎn)換json數(shù)據(jù)拼接和JSON使用方式詳細(xì)介紹(小結(jié))
JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式.這篇文章主要介紹了Json對象和字符串互相轉(zhuǎn)換json數(shù)據(jù)拼接和JSON使用方式詳細(xì)介紹(小結(jié))的相關(guān)資料,需要的朋友可以參考下2016-10-10javascript簡單實(shí)現(xiàn)命名空間效果
這篇文章主要介紹了javascript簡單的實(shí)現(xiàn)命名空間效果的方法。需要的朋友可以過來參考下,希望對大家有所幫助2014-03-03Taro?小程序持續(xù)集成實(shí)現(xiàn)及原理
這篇文章主要為大家介紹了Taro?小程序持續(xù)集成實(shí)現(xiàn)及原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04JS實(shí)現(xiàn)網(wǎng)頁頂部向下滑出的全國城市切換導(dǎo)航效果
這篇文章主要介紹了JS實(shí)現(xiàn)網(wǎng)頁頂部向下滑出的全國城市切換導(dǎo)航效果,涉及javascript鼠標(biāo)事件及頁面元素顯示的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08檢查輸入的是否是數(shù)字使用keyCode配合onkeypress事件
檢查輸入的是否是數(shù)字在本文使用keyCode配合onkeypress事件來實(shí)現(xiàn),具體示例如下2014-01-01