Files
vue-pult/server/log.js
2025-10-01 11:54:13 +03:00

135 lines
4.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const fs = require('node:fs/promises');
const path = require('path');
require('./utils/date-extensions.js'); // Добавляем метод TIME() к Date
let s= {day:new Date(), num:0};
let synch_log=false;
exports.save = async (data)=> {
try {
let currentDate = new Date();
data.time=currentDate.TIME();
const dir = './log/'+currentDate.getFullYear()+'-'+(currentDate.getMonth()+1);
const file = dir+'/'+currentDate.getDate()+'.log';
//await fs.access('./log/'+currentDate.getFullYear()+'-'+(currentDate.getMonth()+1)).then(() => {
//}).catch( async () => { await fs.mkdir('./log/'+currentDate.getFullYear()+'-'+(currentDate.getMonth()+1)); });
// await fs.access(file).then( async () => {
// await fs.appendFile(file, JSON.stringify(data) + '#\n', { encoding: 'utf8' });
// }).catch(async () => {
// await fs.writeFile(file, JSON.stringify(data) + '#\n', { encoding: 'utf8' });
// });
await fs.mkdir(dir, { recursive: true });
await fs.appendFile(file, JSON.stringify(data) + '#\n', { encoding: 'utf8' });
} catch(err) {
// Проверяем, что socket_to_server существует и подключен
if (global.socket_to_server && global.socket_to_server.readyState === 1) {
try {
await global.socket_to_server.send(JSON.stringify({
do: "err/add",
name: err.name,
message: err.message,
stack: err.stack,
info: "Сохранение логов-" + JSON.stringify(data)
}));
} catch (sendError) {
console.error('[LOG] Ошибка отправки ошибки на сервер:', sendError.message);
}
} else {
console.error('[LOG] socket_to_server недоступен для отправки ошибки:', err.message);
}
}
}
let SendLogs=async ()=> {
let file='./log/'+s.day.getFullYear()+'-'+(s.day.getMonth()+1)+'/'+s.day.getDate()+'.log';
let dan;
try {
dan=(await fs.readFile(file, { encoding: 'utf8' })).split('#\n');
} catch (err) { dan=[""]; }
let flag=false;
for (let i=s.num; i< dan.length-1; i++) {
// dan[i]
//socket_to_server.send(JSON.stringify({do:"log", dan:dan[i]}));
let dand
try {
dand= JSON.parse(dan[i]);
} catch (err) {
dand= {do:"err", inf:dan[i], err};
}
let otv;
try {
if (global.send_to_server) {
otv = await global.send_to_server({do:"log/add", dan:dand, num:i, data:s.day.getFullYear()+'-'+(s.day.getMonth()+1)+'-'+s.day.getDate()});
} else {
console.warn('[LOG] send_to_server недоступен, пропускаем отправку логов');
otv = { do: "error", num: i };
}
} catch (sendError) {
console.error('[LOG] Ошибка отправки логов на сервер:', sendError.message);
otv = { do: "error", num: i };
}
if ( otv.do=="log" && otv.num == i ) {s.num=i+1; flag=true;} else return;
}
if (flag) save();
if ( s.day.getFullYear() < (new Date()).getFullYear() || s.day.getMonth()<(new Date()).getMonth() || s.day.getDate()< (new Date()).getDate() ) {
s.day.setDate(s.day.getDate()+1); s.num=0; await SendLogs();
} else {
// [+] отправка команды на WEB о том что все логи синхронизированны
if (synch_log==false) { synch_log=true; if (global.wsServer && global.wsServer.clients) { global.wsServer.clients.forEach(client => client.send(JSON.stringify({do:"synch-log", synch_log}))); } }
}
}
let timerLog= async ()=> {
// [+] отправка команды на WEB о том что есть не синхронизированные логи
if (synch_log && global.wsServer && global.wsServer.clients) {
synch_log=false;
global.wsServer.clients.forEach(client => client.send(JSON.stringify({do:"synch-log", synch_log})));
}
await SendLogs(); setTimeout(timerLog, 300000);
}
let load =async ()=> {
try {s= JSON.parse( await fs.readFile(path.join(__dirname, 'data/log.ini') ) ); s.day=new Date(s.day); } catch (e) { }
setTimeout(timerLog, 5000);
}
let save =async ()=> {
try { await fs.writeFile(path.join(__dirname, 'data/log.ini'), JSON.stringify(s)); } catch (e) { }
}
load();
exports.synch_log=()=>{return synch_log;}