-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathlogger.js
More file actions
122 lines (111 loc) · 3.8 KB
/
logger.js
File metadata and controls
122 lines (111 loc) · 3.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// logger.js
const winston = require('winston');
const path = require('path');
const fs = require('fs');
const os = require('os');
// Используем системную директорию для временных файлов
const logDir = path.join(os.tmpdir(), 'bitrix24-mcp-logs');
let canWriteToLogDir = false;
try {
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir, { recursive: true });
}
// Проверяем, можем ли писать в эту директорию
fs.accessSync(logDir, fs.constants.W_OK);
canWriteToLogDir = true;
console.log(`Логи будут записываться в директорию: ${logDir}`);
} catch (error) {
console.error(`Предупреждение: Невозможно использовать директорию логов: ${error.message}`);
console.log(`Будет использоваться только консольный вывод логов`);
}
// Форматирование логов
const logFormat = winston.format.printf(({ level, message, timestamp, ...meta }) => {
return `${timestamp} [${level.toUpperCase()}]: ${message} ${
Object.keys(meta).length ? JSON.stringify(meta, null, 2) : ''
}`;
});
// Создаем массив транспортов
const transports = [
// Вывод всех логов в консоль всегда включен
new winston.transports.Console({
format: winston.format.combine(
winston.format.colorize(),
logFormat
)
})
];
// Добавляем файловые транспорты только если есть доступ к директории
if (canWriteToLogDir) {
transports.push(
// Запись всех логов с уровнем 'info' и ниже в 'combined.log'
new winston.transports.File({
filename: path.join(logDir, 'combined.log'),
maxsize: 5242880, // 5MB
maxFiles: 5,
}),
// Запись всех логов с уровнем 'error' и ниже в 'error.log'
new winston.transports.File({
filename: path.join(logDir, 'error.log'),
level: 'error',
maxsize: 5242880, // 5MB
maxFiles: 5,
})
);
}
// Конфигурация логгера
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info',
format: winston.format.combine(
winston.format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss'
}),
winston.format.errors({ stack: true }),
winston.format.splat(),
logFormat
),
defaultMeta: { service: 'bitrix24-mcp' },
transports: transports,
exitOnError: false
});
// Перехватчик всех необработанных исключений
if (canWriteToLogDir) {
logger.exceptions.handle(
new winston.transports.File({
filename: path.join(logDir, 'exceptions.log'),
maxsize: 5242880, // 5MB
maxFiles: 5,
})
);
}
// Обертки для удобного логирования HTTP запросов
logger.logApiRequest = (req, extraInfo = {}) => {
logger.info(`API Request: ${req.method} ${req.originalUrl}`, {
ip: req.ip,
userAgent: req.get('User-Agent'),
params: req.params,
query: req.query,
body: req.body,
...extraInfo
});
};
logger.logApiResponse = (req, res, data, extraInfo = {}) => {
logger.info(`API Response: ${req.method} ${req.originalUrl}`, {
statusCode: res.statusCode,
responseTime: Date.now() - req._startTime,
responseData: process.env.NODE_ENV === 'development' ? data : undefined,
...extraInfo
});
};
logger.logApiError = (req, error, extraInfo = {}) => {
logger.error(`API Error: ${req.method} ${req.originalUrl}`, {
ip: req.ip,
error: error.message,
stack: error.stack,
params: req.params,
query: req.query,
body: req.body,
...extraInfo
});
};
// Экспорт логгера
module.exports = logger;