135 lines
4.7 KiB
JavaScript
135 lines
4.7 KiB
JavaScript
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;} |