perf(wai): 用户wai活动日志

dev/supplier-email-drawer
Lei OT 6 months ago
parent 3158595b30
commit a49936dabc

@ -4,6 +4,7 @@ const { sessionStore } = require('../../core'); // Import from core/index.js
const { createWhatsApp } = require('../../core/baileys'); // Import from core/index.js
const { getConnection } = require('../../services/connections.service');
const { isEmpty } = require('../../utils/commons.util');
const { getUserLogger } = require('../../utils/logger.util');
const { domain } = require('../../config').server;
const newConnect = async ctx => {
@ -14,6 +15,7 @@ const newConnect = async ctx => {
// return { phone, session_id: phone, ...existsSession, stauts: 'open', wai_server: domain };
}
try {
getUserLogger(phone).info(`WhatsApp ${phone} 正在连接`);
const whatsApp1 = await createWhatsApp(phone);
ctx.assert(whatsApp1, 503, 'No available connections');
whatsApp1.start();

@ -9,7 +9,7 @@ const { objectMapper, pick } = require('../../utils/commons.util');
const { sessionStore } = require('..');
const { getOutboundMessage, upsertOutboundMessage } = require('../../services/outbound_messages.service');
const logger = require('../../utils/logger.util');
const { logger, getUserLogger } = require('../../utils/logger.util');
const { DbData } = require('../../helper/wai.msg.helper');
const connectionEventNames = ['connection:connect', 'connection:open', 'connection:close'];
@ -40,7 +40,7 @@ const webhookBodyBuilder = (messageData, messageType) => {
createTime: new Date(new Date().getTime() + 8 * 60 * 60 * 1000).toISOString(), // GMT +8
domainName,
conversationid: messageData?.externalId || '',
whatsAppNo: messageData?.whatsAppNo || '',
whatsAppNo: messageData?.whatsAppNo || messageData.from || messageData.to || '',
waiMessage: {
...defaultContent,
...messageData,
@ -68,6 +68,7 @@ const setupConnectionHandler = () => {
// connectionEventNames.forEach(eventName => {
whatsappEvents.on('connection:connect', async connectionData => {
try {
getUserLogger(connectionData.phone).info({ msg: `连接https://web.whatsapp.com/`, connectionData });
// find Or create
await addCurrentConnection({
...objectMapper(connectionData, { phone: [{ key: 'wa_id' }, { key: 'sesson_id' }], channelId: 'channel_id', createTimestamp: 'createtime', version: 'version' }, false),
@ -79,9 +80,9 @@ const setupConnectionHandler = () => {
}
});
whatsappEvents.on('connection:open', async connectionData => {
logger.info(`event ${'connection:open'}`, connectionData);
// todo: 更新实例
try {
getUserLogger(connectionData.whatsAppNo).info({ msg: `已登录`, connectionData });
await updateConnection(
{
...objectMapper(connectionData, { whatsAppNo: [{ key: 'wa_id' }, { key: 'sesson_id' }], channelId: 'channel_id' }),
@ -97,8 +98,8 @@ const setupConnectionHandler = () => {
}
});
whatsappEvents.on('connection:close', async connectionData => {
logger.info(`event ${'connection:close'}`, connectionData);
try {
getUserLogger(connectionData.whatsAppNo).warn({ msg: `断开连接`, connectionData });
sessionStore.removeSession(connectionData.channelId);
await updateConnection(
{
@ -121,8 +122,8 @@ const setupConnectionHandler = () => {
*/
const setupCredsHandler = () => {
whatsappEvents.on('creds:update', async creds => {
logger.info('creds:update', creds);
try {
getUserLogger(creds.whatsAppNo).info({ msg: `二维码`, creds });
const webhookBody = webhookBodyBuilder({ ...creds, to: creds.whatsAppNo, connection: '' }, 'creds:update');
await callWebhook(webhookBody);
} catch (error) {
@ -143,6 +144,9 @@ const setupMessageHandler = () => {
// logger.info('message pending', messageData);
// return false;
// }
const { from, to, whatsAppNo } = messageData;
const _whatsAppNo = whatsAppNo || from || to;
getUserLogger(_whatsAppNo).info({ eventName, messageData });
try {
const now = new Date(new Date().getTime() + 60 * 60 * 1000).toISOString();

@ -1,7 +1,7 @@
const axios = require('axios');
const { default: axiosRetry } = require('axios-retry');
const webhookUrl = require('../../config').webhook;
const logger = require('../../utils/logger.util');
const { logger, getUserLogger } = require('../../utils/logger.util');
// 5s, 10s, 20s, 30s, 1m, 15m, 30m, 1h
const retryDelays = [5000, 10000, 20000, 30000, 300000, 900000, 1800000, 3600000];
@ -27,10 +27,10 @@ async function callWebhook(messageData) {
logger.error('no webhook url provided\n', messageData);
return;
}
getUserLogger(messageData.whatsAppNo).info({ webhookUrl, messageData });
await axios.post(webhookUrl, messageData);
logger.info(JSON.stringify({ webhookUrl: webhookUrl, messageData }, undefined, 2), 'Webhook called successfully');
} catch (error) {
logger.error(JSON.stringify({ webhookUrl: webhookUrl, messageData, error: error.message }, undefined, 2), 'Error calling webhook');
logger.error(JSON.stringify({ webhookUrl, messageData, error: error.message }, undefined, 2), 'Error calling webhook');
}
}

@ -3,7 +3,53 @@ const log4js = require('log4js');
const logger = log4js.getLogger();
const sqlLogger = log4js.getLogger('SQL');
// 用户日志
// 按 用户ID 和 登录日期 区分
const pino = require('pino');
const path = require('path');
const fs = require('fs');
const userLoggers = {}; // Store user loggers
function getUserLogger(_userId) {
const userId = _userId.replace('+', '');
if (userLoggers[userId]) {
return userLoggers[userId];
}
const today = new Date(new Date().getTime() + 8 * 60 * 60 * 1000).toISOString().slice(0, 10); // YYYY-MM-DD
const logDirectory = path.join(__dirname, '../logs');
const logFile = path.join(logDirectory, `user.${userId}.${today}.log`);
// Ensure the logs directory exists
fs.mkdirSync(logDirectory, { recursive: true });
// Create or open the log file stream
// const logStream = fs.createWriteStream(logFile, { flags: 'a' }); // 'a' for append mode
const dest = pino.destination(logFile);
const logger = pino(
{
level: 'info',
formatters: {
level: label => {
return { level: label };
},
},
// timestamp: pino.stdTimeFunctions.isoTime,
timestamp: () => {
return `,"time":"${new Date(new Date().getTime() + 8 * 60 * 60 * 1000).toISOString()}"`; // GMT+8
},
},
dest,
);
userLoggers[userId] = logger;
return logger;
}
module.exports = logger;
module.exports.logger = logger;
module.exports.sqlLogger = sqlLogger;
module.exports.getUserLogger = getUserLogger;
module.exports.default = logger;

Loading…
Cancel
Save