logger
nodejs 中常用 日志文件处理,对应的各种实现方案
下载量对比 bunyan-vs-log4js-vs-loglevel-vs-morgan-vs-pino-vs-signale-vs-winston
winston
npm i winston
单日志文件
import dayjs from 'dayjs';
import winston from 'winston';
const logger = winston.createLogger({
level: 'debug',
exitOnError: false,
format: winston.format.combine(
winston.format.splat(),
// winston.format.colorize(),
// winston.format.label({ label: 'LABEL' }),
winston.format.timestamp({ format: dayjs().format('YYYY-MM-DD HH:mm:ss') }),
winston.format.printf(options => {
const { level, message, label, timestamp } = options;
return `${timestamp} [${level}]: ${message}`;
})
),
// defaultMeta: { service: 'user-service' },
transports: [
new DailyRotateFile({
dirname: `${dir}`,
filename: '%DATE%',
level: env.NNK_DEV ? 'debug' : 'info',
datePattern: 'YYYY-MM-DD',
maxSize: '5m',
extension: '.log',
maxFiles: '7d',
zippedArchive: false,
}),
new winston.transports.File({ filename: '/Users/neptune/trader/logs/error.log', level: 'error' }),
new winston.transports.File({ filename: '/Users/neptune/trader/logs/combined.log' }),
],
});
logger.add(
new winston.transports.Console({
format: winston.format.combine(
winston.format.colorize(),
winston.format.printf(options => {
const { level, message, label, timestamp } = options;
return `${timestamp} [${level}]: ${message}`;
})
),
})
);
logger.log({
level: 'info',
message: 'Hello distributed log files!',
props: 1,
});
logger.info('Hello again distributed logs %s', '223');
logger.log('debug', 'args2 %j', { message: 'meta info' });
多个日志文件
import dayjs from 'dayjs';
import path from 'path';
import winston from 'winston';
import { isProdEnv, timeStamp } from './utils.js';
const appLogPath = path.resolve('logs', dayjs().format('YYYY-MM-DD'));
const ProjectLoggerFileList = [
'binanceFutures',
'app',
'github',
'binanceSpot',
'binanceAnnounce',
'lbk',
'tg',
'mail',
];
const fileFormat = winston.format.combine(
winston.format.splat(),
// winston.format((info, options) => {
// const { level, message, ...meta } = info;
// return info;
// })(),
// winston.format.colorize(),
// winston.format.label({ label: 'LABEL' }),
winston.format.timestamp({ format: timeStamp }),
winston.format.printf(options => {
const { level, message, label, timestamp } = options;
return `${timestamp} [${level}]: ${message}`;
})
);
for (const key of ProjectLoggerFileList) {
winston.loggers.add(key, loggerOptions(key));
}
function loggerOptions(key) {
const transports = [
new winston.transports.File({
filename: `${appLogPath}/${key}-error.log`,
level: 'error',
}),
new winston.transports.File({
filename: `${appLogPath}/${key}.log`,
level: 'debug',
}),
];
if (!isProdEnv) {
transports.push(
// @ts-ignore
new winston.transports.Console({
format: winston.format.combine(winston.format.colorize(), fileFormat),
})
);
}
return {
level: isProdEnv ? 'info' : 'debug',
exitOnError: false,
format: fileFormat,
// defaultMeta: { service: 'user-service' },
transports: transports,
};
}
export default getLog('app');
export function getLog(type = 'app') {
return winston.loggers.get(type);
}
loglevel
npm i loglevel
Javascript
import log from "loglevel"
log.setLevel("debug");
log.info()
log.warn()
log.error()