diff --git a/ai/ai.js b/ai/ai.js index 53da86877abc4ae6f339be3be25c1496be6180cb..31ca1fb7350587cb3823535100df2be38656f03b 100644 --- a/ai/ai.js +++ b/ai/ai.js @@ -13,6 +13,7 @@ * limitations under the License. */ const fs = require('fs'); +const winston = require('winston'); const path = require('path'); const { exec } = require('child_process'); const iconv = require("iconv-lite"); @@ -21,6 +22,8 @@ const SAVE_CMD = 1; const DIAGNOSIS_CMD = 3; const SAVE_BACK_CMD = 2; const DIAGNOSIS_BACK_CMD = 4; +// 创建logger +const logger = winston.createLogger(require('./../winston.config.js')); // 注册 function init() { @@ -37,8 +40,10 @@ function process(session_id, cmd, data) { let filePath = path.join(__dirname, 'db_cache', `${session_id}.db`);// 拼接路径 let dirPath = path.dirname(filePath);// 获取db文件所在的目录 if (cmd === SAVE_CMD) { + logger.info(`Preparing to write to DB,sessionId:${session_id},cmd:${SAVE_CMD}`) save(dirPath, filePath, session_id, data); } else if (cmd === DIAGNOSIS_CMD) { + logger.info(`Obtain diagnostic report results,sessionId:${session_id},cmd:${DIAGNOSIS_CMD}`) diagnosis(dirPath, filePath, session_id, data); } } @@ -52,7 +57,7 @@ function save(dirPath, filePath, session_id, data) { let message = { code: -1, message: '' }; fs.mkdir(dirPath, { recursive: true }, (err) => { if (err) { - console.log('Directory creation failed:', err); + logger.error(`Directory creation failed:${err},sessionId:${session_id},cmd:${SAVE_CMD}`); return; } let dataBuffer = Buffer.from(data); @@ -60,9 +65,11 @@ function save(dirPath, filePath, session_id, data) { if (err) { message.code = 1; message.message = 'File write failed'; + logger.error(`File write failed,sessionId:${session_id},cmd:${SAVE_CMD}`); } else { message.code = 0; message.message = 'File written successfully'; + logger.info(`File written successfully,sessionId:${session_id},cmd:${SAVE_CMD}`); } sendMsg(session_id, SAVE_BACK_CMD, message); }); @@ -82,6 +89,7 @@ function diagnosis(dirPath, filePath, session_id, data) { if (errDir) { message.code = 1; message.message = 'DB file not imported'; + logger.error(`DB file not imported,unable to find DB folder,sessionId:${session_id},cmd:${DIAGNOSIS_CMD}`); sendMsg(session_id, DIAGNOSIS_BACK_CMD, message); return; } @@ -89,12 +97,14 @@ function diagnosis(dirPath, filePath, session_id, data) { if (errFile) { message.code = 1; message.message = 'DB file not imported'; + logger.error(`DB file not imported,unable to find DB file,sessionId:${session_id},cmd:${DIAGNOSIS_CMD}`); sendMsg(session_id, DIAGNOSIS_BACK_CMD, message); return; } if (!data) { message.code = 1; message.message = 'Time range not provided'; + logger.error(`Time range not provided,sessionId:${session_id},cmd:${DIAGNOSIS_CMD}`); sendMsg(session_id, DIAGNOSIS_BACK_CMD, message); return; } @@ -109,11 +119,13 @@ function diagnosis(dirPath, filePath, session_id, data) { if (error || (stderr && stderr.length > 0)) { message.code = 1; message.message = `error: ${error ? error.message : stderr.toString()}`; + logger.error(`error: ${error ? error.message : stderr.toString()},sessionId:${session_id},cmd:${DIAGNOSIS_CMD},command:${command}`); sendMsg(session_id, DIAGNOSIS_BACK_CMD, message); return; } message.code = 0; message.message = iconv.decode(stdout, 'gbk');// 字节流解码成字符串 + logger.info(`Successfully obtained diagnostic results,sessionId:${session_id}`) sendMsg(session_id, DIAGNOSIS_BACK_CMD, message); }) }); @@ -150,12 +162,13 @@ function clear(session_id) { fs.access(filePath, fs.constants.F_OK, (err) => { // 不存在直接return if (err) { + logger.error(`${err},sessionId:${session_id}`); return; } // 存在则继续删除 fs.unlink(filePath, (err) => { if (err) { - console.log('File deletion failed:', err); + logger.error(`File deletion failed:${err},sessionId:${session_id}`); } }); }) @@ -164,7 +177,7 @@ function deleteDirPath() { let dirPath = path.join(__dirname, 'db_cache'); fs.rm(dirPath, { recursive: true, force: true }, (err) => { if (err) { - console.log('Failed to delete folder cached db:', err); + logger.error(`Failed to delete folder cached db:${err},sessionId:${session_id}`); } }) } diff --git a/app.js b/app.js index 5494b4f90a2625b94b7c56bce4848ae3a3fce3a7..ca9604836249412def87aa92182df7a93e295548 100644 --- a/app.js +++ b/app.js @@ -13,19 +13,20 @@ * limitations under the License. */ const WebSocket = require('ws'); +const winston = require('winston'); const SessionManage = require('./session.js'); const Utils = require('./Util.js'); const TypeManage = require('./typeManage.js'); const wss = new WebSocket.Server({ port: `${Utils.AuthMsg.SW_PORT}`, maxPayload: 1024 * 1024 * 500 }); +// 创建logger +const logger = winston.createLogger(require('./winston.config.js')); // 当有新客户端连接时触发 wss.on('connection', function connection(ws) { - console.log("The server has been connected"); // WebSocket的一个属性,用于控制 WebSocket 连接如何处理接收到的二进制数据; ws.binaryType = 'arraybuffer'; // 接收来自客户端的消息 ws.on('message', function incoming(message) { - console.log("Received information from the client"); // 判断头部字节数 if (new Uint8Array(message).byteLength < Utils.AuthMsg.MESSAGE_BYTE) { return; @@ -36,8 +37,10 @@ wss.on('connection', function connection(ws) { // 鉴权session和sessionId let isAuthSuccess = SessionManage.SessionJs.checkSession(decoderMessage.session_id, decoderMessage.session); if (!isAuthSuccess) { + logger.error(`${decoderMessage.session_id} Authentication failed`); return; }; + logger.info(`type:${decoderMessage.type},sessionId:${decoderMessage.session_id},cmd:${decoderMessage.cmd}`); pluginSystem.execute(decoderMessage.type, 'process', decoderMessage.session_id, decoderMessage.cmd, decoderMessage.data); }; // type为会话信息 @@ -50,6 +53,7 @@ wss.on('connection', function connection(ws) { // 鉴权session和sessionId let isAuthSuccess = SessionManage.SessionJs.checkSession(decoderMessage.session_id, decoderMessage.session); if (!isAuthSuccess) { + logger.error('Authentication failed'); return; }; pluginSystem.execute(decoderMessage.type, 'process', decoderMessage.session_id, decoderMessage.cmd, decoderMessage.data); @@ -84,7 +88,7 @@ wss.on('connection', function connection(ws) { // 当发生错误时触发 ws.on('error', function error(err) { - console.error('发生错误:', err); + logger.error(`Connection error:${err}`); }); }) // 业务侧调,用来往客户端发送消息 diff --git a/package.json b/package.json index e6302045dcd776cdbd34ff73dbfe243f2f43beb9..f533aac8b4bd42f380bd581c169d6e9dbe1d6d1b 100644 --- a/package.json +++ b/package.json @@ -12,11 +12,12 @@ }, "dependencies": { "iconv-lite": "^0.6.3", + "node-windows": "^1.0.0-beta.8", "protobufjs": "^7.4.0", "require.js": "^1.0.0", "socket.io": "^4.7.5", - "ws": "^8.18.0", - "node-windows": "^1.0.0-beta.8", - "unzipper": "^0.12.3" + "unzipper": "^0.12.3", + "winston": "^3.17.0", + "ws": "^8.18.0" } } diff --git a/session.js b/session.js index 2d5cec948a26d768e73e82f6887a3b0afc718109..e6a7695fae048b77ae2b52b09b4bb5e4fd72cfb2 100644 --- a/session.js +++ b/session.js @@ -13,12 +13,16 @@ * limitations under the License. */ const Utils = require('./Util.js'); +const winston = require('winston'); const TypeManage = require('./typeManage.js'); +// 创建logger +const logger = winston.createLogger(require('./winston.config.js')); class SessionJs { static sessionMap = getSessionMap(); static applySession = function (ws, decoderMessage) { // 防止连续申请session if (ws.userData && ws.userData.sessionId) { + logger.warn('Please do not apply for the session again'); return; }; let sendSessionMsg = {}; @@ -40,6 +44,11 @@ class SessionJs { sendSessionMsg.session = ws.userData.sessionId ? SessionJs.sessionMap.get(ws.userData.sessionId)[0] : ''; sendSessionMsg.data_lenght = 0; }; + if(ws.userData.sessionId){ + logger.info(`Successfully applied for session,sessionId:${ws.userData.sessionId}`); + }else{ + logger.error('The current session is full, session request failed'); + } ws.send(Utils.Utils.encode(sendSessionMsg)); }; static checkSession(sessionId, session) { @@ -47,6 +56,7 @@ class SessionJs { }; static clearSession(session_id) { SessionJs.sessionMap.set(session_id, null); + logger.warn(`Session cleared,sessionId:${session_id}`); }; }; diff --git a/update/update.js b/update/update.js index f8b575066d87b4a9aded696294894df41db094c1..6dd94b64a5519a843dd2a4d22e0ed879cfbdccea 100644 --- a/update/update.js +++ b/update/update.js @@ -13,6 +13,7 @@ * limitations under the License. */ const fs = require('fs') +const winston = require('winston'); const path = require('path'); const unzipper = require('unzipper'); const { exit } = require('process'); @@ -25,6 +26,8 @@ const UPDATE_SUCCESS_CMD = 2; // 升级成功 const UPDATE_FAIL_CMD = 4; // 升级失败 let isUpdate = false; let sessionIdMap = new Map(); +// 创建logger +const logger = winston.createLogger(require('./../winston.config.js')); function init() { const apps = require('../app'); @@ -35,6 +38,7 @@ function process(session_id, cmd, message) { // 获取扩展程序版本号 if (cmd === GET_CMD) { // 返回扩展程序当前版本 + logger.info(`The current version is ${Version.version.version}`); sendMsg(session_id, GET_CMD, Version.version.version) // 升级版本 } else if (cmd === UPDATE_CMD) { @@ -58,7 +62,7 @@ function update(session_id, data) { // 将文件写入update/update.zip fs.writeFile(updateZipPath, data, (err) => { if (err) { - console.error('File write failed:', err); + logger.error(`File write failed:${err}`); isUpdate = false; publishStatus(UPDATE_FAIL_CMD); sendMsg(session_id, UPDATE_FAIL_CMD, ''); @@ -81,7 +85,7 @@ function update(session_id, data) { isUpdate = false; publishStatus(UPDATE_FAIL_CMD); sendMsg(session_id, UPDATE_FAIL_CMD, '') - console.error(err); + logger.error(err); }) }) } @@ -95,7 +99,7 @@ function findProjectRoot(session_id, startDir) { isUpdate = false; publishStatus(UPDATE_FAIL_CMD); sendMsg(session_id, UPDATE_FAIL_CMD, '') - console.error('err: Reached root directory but package. json not found'); + logger.error('err: Reached root directory but package. json not found'); } currentDir = parentDir; } diff --git a/winston.config.js b/winston.config.js new file mode 100644 index 0000000000000000000000000000000000000000..2df7a1301717c403413d097408bdff2c99ba2d77 --- /dev/null +++ b/winston.config.js @@ -0,0 +1,19 @@ +const winston = require('winston'); + +module.exports = { + // 定义日志级别 + level: 'info', + // 定义日志格式 + format: winston.format.combine( + winston.format.timestamp({ + format: 'YYYY-MM-DD HH:mm:ss' + }), + winston.format.errors({ stack: true }), + winston.format.json() + ), + // 定义日志传输方式 + transports: [ + // 记录到文件 + new winston.transports.File({ filename: 'combined.log' }) + ] +}; \ No newline at end of file