微信小程序集成前端日志庫的詳細(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-08
Json對象和字符串互相轉(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-10
javascript簡單實(shí)現(xiàn)命名空間效果
這篇文章主要介紹了javascript簡單的實(shí)現(xiàn)命名空間效果的方法。需要的朋友可以過來參考下,希望對大家有所幫助2014-03-03
Taro?小程序持續(xù)集成實(shí)現(xiàn)及原理
這篇文章主要為大家介紹了Taro?小程序持續(xù)集成實(shí)現(xiàn)及原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
JS實(shí)現(xiàn)網(wǎng)頁頂部向下滑出的全國城市切換導(dǎo)航效果
這篇文章主要介紹了JS實(shí)現(xiàn)網(wǎng)頁頂部向下滑出的全國城市切換導(dǎo)航效果,涉及javascript鼠標(biāo)事件及頁面元素顯示的實(shí)現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08
檢查輸入的是否是數(shù)字使用keyCode配合onkeypress事件
檢查輸入的是否是數(shù)字在本文使用keyCode配合onkeypress事件來實(shí)現(xiàn),具體示例如下2014-01-01

