Я могу записывать журналы в файл журнала с реализацией ниже pino.
Кто-нибудь может сообщить мне, возможно ли одновременно войти в консоль, чтобы контролировать безумие console.info().
import pino from 'pino';
import { getEnvConfig } from "config/env";
const envConfig = getEnvConfig();
const logdir: string = envConfig.log_dir;
const logfile: string = `${logdir}/appName-${new Date(Date.now()).toISOString().split('T')[0]}.log`;
export const logger = pino({
level: envConfig.log_level ?? "info",
formatters: {
bindings: (bindings) => {
return { pid: bindings.pid, host: bindings.hostname, node_version: process.version };
},
level: (label: string) => {
return { level: label.toUpperCase() };
},
},
timestamp: pino.stdTimeFunctions.isoTime,
transport: ({ target: 'pino/file', options: { destination: logdir, mkdir: true } }),
});






Согласно документации, вместо этого вы можете использовать pipelines, чтобы указать несколько транспортов, что позволит вам сохранить существующие средства форматирования уровней. pino-pretty использует STDIN и STDOUT, поэтому он должен выводиться на консоль.
import pino, { LoggerOptions } from 'pino';
import { getEnvConfig } from "config/env";
const envConfig = getEnvConfig();
const logdir: string = envConfig.log_dir;
const logfile: string = `${logdir}/appName-${new Date(Date.now()).toISOString().split('T')[0]}.log`;
const pinoOptions: LoggerOptions = {
level: envConfig.log_level ?? "info",
formatters: {
bindings: (bindings) => {
return { pid: bindings.pid, host: bindings.hostname, node_version: process.version };
},
level: (label: string) => {
return { level: label.toUpperCase() };
},
},
timestamp: pino.stdTimeFunctions.isoTime,
transport: ({
pipeline: [{
target: 'pino-pretty', // must be installed separately
},
{
target: 'pino/file', options: { destination: logdir, mkdir: true },
},
],
}
),
}
export const logger = pino(pinoOptions);
Хорошо. Использование targets не позволит вам указать форматировщик для уровня, поэтому вместо этого используйте pipeline. Я обновил свой ответ, и он выдает в файле тот же результат, что и исходный код.
Спасибо... После вышеупомянутых изменений возникла ошибка: «Ошибка: option.transport.targets не разрешает форматирование пользовательского уровня». Если я закомментирую форматтеры:{}, он выведет журналы как на консоль, так и в файл. Я в порядке, если средства форматирования не применяются в журналах консоли, но они должны применяться в файле журнала.