Перейти до основного вмісту

Сервіс логування

інформація

Сервіс логування призначений для створення логерів, оснащених відповідними транспортами, що забезпечують передачу логів до визначених місць призначення. Кожен логер має свої власні рівні логування, які визначають обсяг інформації, що буде збиратись та реєструватись.

Рівні логування є ключовими складовими логера, оскільки вони визначають, наскільки детально будуть фіксуватись події. Чим нижчий рівень, тим більше логів буде створюватись та зберігатись. Важливою особливістю є можливість зміни рівнів логування без перезавантаження ядра обчислень. Це дає змогу тимчасово підвищити рівень логування для детального аналізу роботи конкретного маршруту чи іншої складової системи без порушення продуктивності.

Обрання правильного типу транспорту для логування також має велике значення, оскільки воно визначає, куди будуть направлятись записи логів. В робочому оточенні рекомендується використовувати сучасні системи логування, наприклад, Elasticsearch, щоб забезпечити ефективний збір та аналіз логів.

Архітектура

Сервіс логування є важливим компонентом на рівні з DiscoveryService, оскільки необхідність у фіксації подій виникає на всій протязі програми. Логування з'єднувачів повинно здійснюватись на тому ж рівні, що й логування конкретних етапів обробки кінцевого маршруту.

logger-service-arch.svg

примітка

Сервіс проникає червоною лінією в ядро обчислень через абстрактні модулі, такі як 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 - ні. Докладніше про рівні логування та їх використання можна знайти в розділі "Методологія".

Тип транспорту

warning

У майбутніх версіях, таких як 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 - клас зʼєднувача з NoSQL MongoDB базою даних.
  • 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 для створення логів відладки.