logologo
Початок
Посібник
Розробка
Плагіни
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
Початок
Посібник
Розробка
Плагіни
API
logologo

Швидкий старт

Огляд розробки плагінів
Написання першого плагіна
Структура каталогу проєкту

Серверна розробка

Огляд
Плагін (Plugin)
Колекції (таблиці даних)
Операції з базою даних (Database)
Керування джерелами даних (DataSourceManager)
Керування ресурсами (ResourceManager)
Контроль доступу (ACL)
Проміжне ПЗ (Middleware)
Кеш (Cache)
Подія (Event)
Контекст запиту (Context)
Скрипт оновлення (Migration)
Логи (Logger)
Інтернаціоналізація (I18n)
Командний рядок (Command)
Керування завданнями за розкладом (CronJobManager)
Тестування (Test)

Клієнтська розробка

Огляд
Плагін (Plugin)
Контекст (Context)
Маршрутизатор (Router)
Контроль доступу (ACL)
Керування джерелами даних (DataSourceManager)
Ресурс (Resource)
Запит (Request)
Стилі та теми (Styles & Themes)
Логи (Logger)
Інтернаціоналізація (I18n)
Тестування (Test)

Інше

Посібник з оновлення плагінів
Список мов
Керування залежностями
Збірка
Previous PageСкрипт оновлення (Migration)
Next PageІнтернаціоналізація (I18n)
Повідомлення про переклад ШІ

Ця документація була автоматично перекладена штучним інтелектом.

#Логер

Система логування NocoBase побудована на базі Winston. За замовчуванням, NocoBase розділяє логи на логи запитів API, логи виконання системи та логи виконання SQL. Логи запитів API та логи виконання SQL генеруються всередині застосунку. Розробникам плагінів зазвичай потрібно логувати лише системні події, пов'язані з їхніми плагінами.

Цей документ пояснює, як створювати та друкувати логи під час розробки плагінів.

#Стандартні методи логування

NocoBase надає методи для логування системних подій. Логи формуються відповідно до визначених полів і виводяться у вказані файли.

// Стандартний метод логування
app.log.info("message");

// Використання в проміжному ПЗ (middleware)
async function (ctx, next) {
  ctx.log.info("message");
}

// Використання в плагінах
class CustomPlugin extends Plugin {
  async load() {
    this.log.info("message");
  }
}

Усі вищезгадані методи використовують наступний синтаксис:

Перший параметр — це повідомлення логу, а другий — необов'язковий об'єкт метаданих, який може містити будь-які пари ключ-значення. При цьому module, submodule та method будуть виділені як окремі поля, а решта полів поміщені в поле meta.

app.log.info('message', {
  module: 'module',
  submodule: 'submodule',
  method: 'method',
  key1: 'value1',
  key2: 'value2',
});
// => level=info timestamp=2023-12-27 10:30:23 message=message module=module submodule=submodule method=method meta={"key1": "value1", "key2": "value2"}

app.log.debug();
app.log.warn();
app.log.error();

#Виведення в інші файли

Якщо ви бажаєте використовувати стандартний метод логування системи, але не хочете виводити логи у файл за замовчуванням, ви можете створити власний екземпляр системного логера за допомогою createSystemLogger.

import { createSystemLogger } from '@nocobase/logger';

const logger = createSystemLogger({
  dirname: '/pathto/',
  filename: 'xxx',
  seperateError: true, // Чи виводити логи рівня error окремо у файл 'xxx_error.log'
});

#Власний логер

Якщо ви не бажаєте використовувати системні методи логування, а хочете застосувати нативні методи Winston, ви можете створити логи наступними способами.

#createLogger

import { createLogger } from '@nocobase/logger';

const logger = createLogger({
  // options
});

options розширює оригінальний winston.LoggerOptions.

  • transports — використовуйте 'console' | 'file' | 'dailyRotateFile' для застосування попередньо налаштованих методів виведення.
  • format — використовуйте 'logfmt' | 'json' | 'delimiter' для застосування попередньо налаштованих форматів логування.

#app.createLogger

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

app.createLogger({
  dirname: '',
  filename: 'custom', // Виводиться у /storage/logs/main/custom.log
});

#plugin.createLogger

Сценарій використання та метод ідентичні app.createLogger.

class CustomPlugin extends Plugin {
  async load() {
    const logger = this.createLogger({
      // Виводиться у /storage/logs/main/custom-plugin/YYYY-MM-DD.log
      dirname: 'custom-plugin',
      filename: '%DATE%.log',
      transports: ['dailyRotateFile'],
    });
  }
}