Сервіс логування
Сервіс логування призначений для створення логерів, оснащених відповідними транспортами, що забезпечують передачу логів до визначених місць призначення. Кожен логер має свої власні рівні логування, які визначають обсяг інформації, що буде збиратись та реєструватись.
Рівні логування є ключовими складовими логера, оскільки вони визначають, наскільки детально будуть фіксуватись події. Чим нижчий рівень, тим більше логів буде створюватись та зберігатись. Важливою особливістю є можливість зміни рівнів логування без перезавантаження ядра обчислень. Це дає змогу тимчасово підвищити рівень логування для детального аналізу роботи конкретного маршруту чи іншої складової системи без порушення продуктивності.
Обрання правильного типу транспорту для логування також має велике значення, оскільки воно визначає, куди будуть направлятись записи логів. В робочому оточенні рекомендується використовувати сучасні системи логування, наприклад, Elasticsearch, щоб забезпечити ефективний з бір та аналіз логів.
Архітектура
Сервіс логування є важливим компонентом на рівні з DiscoveryService, оскільки необхідність у фіксації подій виникає на всій протязі програми. Логування з'єднувачів повинно здійснюватись на тому ж рівні, що й логування конкретних етапів обробки кінцевого маршруту.
Сервіс проникає червоною лінією в ядро обчислень через абстрактні модулі, такі як AbstractService. Визначення сервісу логування є необхідним елементом цієї архітектури. Крім того, сервіс логування впроваджує концепцію частоти рівня логування, що дозволяє логувати через кожен запит до кінцевого маршруту або події. Це дозволяє підвищувати рівень логування, не понижуючи при цьому продуктивність веб-застосунку в цілому.
Рівні логування
У роботі веб-сервера використовуються два логери: логер ядра обчислень та логер бізнес-схеми. Це розподілення дозволяє
фіксувати роботу в різних транспортах на рівні логерів, що забезпечує більшу гнучкість системи. Логер ядра обчислень та
логер бізнес-схеми здійснюють логування в Elasticsearch або файлову систему, а сповіщення про помилки надходять у
Telegram тільки від логера бізнес-схеми.
Рівні логування ядра обчислень:
const levels = {
error: 0, // errors and exceptions
warn: 1, // warning
system: 2, // system log
api: 3, // api processing
database: 4, // db queries
storage: 5, // redis or file storage processing
info: 6, // compute core info
schema: 7, // registry schema structure
verbose: 8, // verbose
};
Рівні логування бізнес-схеми:
const levels = {
error: 0, // errors
exception: 1, // exception processing
warn: 2, // warning
api: 3, // execute api proccesing
info: 4, // api information
debug: 5, // debug mode
};
Розділення рівнів помилок та виключень у бізнес-схемі спрямоване на можливість використання різних методів логування. Наприклад, рівень error може бути використаний для логування та сповіщення, тоді як рівень exception - ні. Докладніше про рівні логування та їх використання можна знайти в розділі "Методологія".
Тип транспорту
У майбутніх версіях, таких як v2.0.0, v3.0.0, ..., vX.X.X, які знаходяться в активній роз робці, буде впроваджена
можливість передавати записи логів в Elasticsearch та Telegram. Elasticsearch ідеально підходить для використання
у робочому середовищі як система зберігання логів. Telegram ж буде чудовим механізмом для надсилання
сповіщень - alerting - для виявлення критичних помилок та швидкого їх виправлення.
Застосування
Сервіс логування використовується як в ядрі обчислень так і бізнес-схемі:
1. Використання в ядрі обчислень:
import { inversify } from '~packages'
import { CoreSymbols } from '~symbols'
import { AbstractConnector } from './abstract.connector'
import type {
IMongoConnector,
NMongoConnector,
Mongoose,
IDiscoveryService,
ILoggerService
} from '~types'
const { injectable, inject } = inversify
@injectable()
export class MongoConnector extends AbstractConnector implements IMongoConnector {
private _connection: Mongoose.Mongoose | undefined;
private _config: NMongoConnector.Config | undefined;
constructor(
@inject(CoreSymbols.DiscoveryService)
private readonly _discoveryService: IDiscoveryService,
@inject(CoreSymbols.LoggerService)
private readonly _loggerService: ILoggerService,
// ... other inject structures
) {
super();
}
// ... other methods
public async stop(): Promise<void> {
this._config = undefined;
if (!this._connection) return;
try {
await this._connection.disconnect();
this._loggerService.system("Mongo connector has been stopped.", {
tag: "Connection",
scope: "Core",
namespace: "MongodbConnector",
});
} catch (e) {
this._loggerService.error(e, {
namespace: "MongoConnector",
scope: "Core",
errorType: "FATAL",
tag: "Connection",
});
throw e;
} finally {
this._connection = undefined;
}
}
// ... other methods
}
де:
MongoConnector- клас зʼєднувача зNoSQLMongoDBбазою даних.stop- метод класу зʼєднувача, який відповідає за зупинку модуля та закриття зʼєднання.this._loggerService.system(...- виклик методу сервісу логуванняLoggerServiceз рівнемsystem.this._loggerService.error(...- виклик методу сервісу логуванняLoggerServiceз рівнемerror.
2. Використання в бізнес-схемі:
import { setRouter } from '@x-fiber/calculator';
type Routes = 'get-one'
export const BusUsersAggRouter = setRouter<Routes>({
'get-one': {
GET: {
scope: 'public:route',
params: [],
version: 'v1',
handler: async (request, agents, context) => {
const { logger } = agents.fnAgent;
logger.debug([
{
name: 'John',
surname: 'Doe',
age: 18,
},
]);
},
},
},
});
де:
setRouterє вбудованою функцією ядра обчислень, що відповідає за створення опису документаМаршрутизатор.BusUsersAggRouter- опис документаМаршрутизаторв прикладній областіBusUsersAgg.logger- простір імен для доступу до методів з сервісу логуванняLoggerService.debug- рівень логуванняdebugдля створення логів відладки.