hotelme-nuxt-logger
v1.0.5
Published
Стандартний logger для Nuxt проектів з JSON виводом сумісним з бекенд-логами
Maintainers
Readme
@hotelme/nuxt-logger
Стандартний logger для Nuxt 3 проектів з JSON виводом, сумісним з бекенд-логами.
Особливості
✅ JSON формат виводу в stdout
✅ Обов'язкові поля: ts, level, reqid, msg, project, log_type, pid
✅ Автоматичне логування всіх HTTP запитів з часом виконання
✅ X-Request-ID support - використовує reqid з header або генерує новий
✅ Timestamp з timezone - формат 2025-06-17T09:58:18.539733-0500
✅ Auto-import - logger доступний глобально
✅ TypeScript підтримка з повною типізацією
✅ Сумісність з бекенд-логами для єдиної системи моніторингу
Покращення порівняно зі стандартними логами
1. reqid з X-Request-ID header
// Береться з header або генерується автоматично
const reqid = event.node.req.headers['x-request-id'] || generateUUID()2. Timestamp з timezone та мікросекундами
{
"ts": "2025-06-17T09:58:18.539733-0500"
}3. Правильний msg для API запитів
// Для /api/* запитів
{ "msg": "api request", "request": "/api/hotels" }
// Для інших запитів
{ "msg": "stats", "request": "/hotels" }4. response замість status_code
{ "response": 200 }5. Всі логи в JSON форматі
Ніяких console.log з текстом - тільки structured JSON!
Встановлення
npm install @hotelme/nuxt-logger uuid
# або
yarn add @hotelme/nuxt-logger uuid
# або
pnpm add @hotelme/nuxt-logger uuidНалаштування
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@hotelme/nuxt-logger'],
logger: {
// Назва проекту для логів
projectName: 'my-project',
// Увімкнути автоматичне логування запитів
enableRequestLogging: true
},
// Альтернативно через env
runtimeConfig: {
public: {
projectName: process.env.NUXT_PUBLIC_PROJECT_NAME || 'my-project'
}
}
})Використання
Автоматичне логування запитів
Модуль автоматично логує кожен HTTP запит:
{
"msg": "api request",
"level": "Info",
"reqid": "aec7c27a231d1843",
"project": "hotelme",
"log_type": "frontend",
"pid": 53,
"ts": "2025-06-17T09:58:18.539733-0500",
"stage": "after",
"domain": "localhost:3000",
"request": "/api/hotels?city=kyiv",
"request_time": "0.045",
"method": "GET",
"response": 200,
"user_id": "a1b2c3d4e5f6"
}Ручне логування
// Auto-imported - працює всюди
logger.info('User logged in', { user_id: '123' })
logger.error('Failed to fetch', { error: err.message })
logger.warn('Rate limit approaching', { remaining: 10 })В API handlers
// server/api/hotels.get.ts
export default defineEventHandler((event) => {
const reqid = event.context.reqid // reqid з X-Request-ID
logger.info('Fetching hotels', { reqid, city: event.query.city })
try {
const hotels = await fetchHotels(event.query.city)
return hotels
} catch (error) {
logger.error('Failed to fetch hotels', {
reqid,
error: error.message,
city: event.query.city
})
throw error
}
})Передача X-Request-ID між сервісами
// Передаємо reqid в запити до бекенду
const response = await $fetch('/api/hotels', {
headers: {
'X-Request-ID': event.context.reqid
}
})API
Logger методи
logger.trace(msg: string, details?: Record<string, any>): void
logger.debug(msg: string, details?: Record<string, any>): void
logger.info(msg: string, details?: Record<string, any>): void
logger.warn(msg: string, details?: Record<string, any>): void
logger.error(msg: string, details?: Record<string, any>): void
logger.fatal(msg: string, details?: Record<string, any>): voidEvent Context
export default defineEventHandler((event) => {
const reqid = event.context.reqid // З X-Request-ID header
const userId = event.context.userId // UUID з cookie
})Формат логів
| Поле | Тип | Опис |
|------|-----|------|
| msg | string | "api request" для /api/*, "stats" для інших |
| level | string | Trace/Debug/Info/Warn/Error/Fatal |
| reqid | string | З header X-Request-ID або UUID |
| project | string | Назва проекту |
| log_type | string | "frontend" |
| pid | number | Process ID |
| ts | string | Timestamp з timezone |
| stage | string | "after" для завершених запитів |
| domain | string | Домен запиту |
| request | string | URL запиту |
| request_time | string | Час виконання в секундах |
| method | string | HTTP метод |
| response | number | HTTP статус код |
Інтеграція з системами моніторингу
Легко інтегрується з:
- ELK Stack (Elasticsearch, Logstash, Kibana)
- Grafana Loki
- Datadog
- CloudWatch
- Graylog
# Просто направ stdout в систему збору логів
node .output/server/index.mjs | your-log-collector
# Або в Docker
docker logs your-container | jq '.msg'Приклади фільтрації
# Логи з конкретним reqid
npm run dev | jq 'select(.reqid == "abc123")'
# Тільки помилки
npm run dev | jq 'select(.level == "Error")'
# API запити
npm run dev | jq 'select(.msg == "api request")'
# Повільні запити (>1s)
npm run dev | jq 'select(.request_time and (.request_time | tonumber) > 1.0)'Ліцензія
MIT
Підтримка
Для питань та багів: GitHub Issues
