DAILY DOCDAILY DOC
Rust
Node
Notes
Ubuntu
Leetcode
  • it-tools
  • excalidraw
  • linux-command
Rust
Node
Notes
Ubuntu
Leetcode
  • it-tools
  • excalidraw
  • linux-command
  • node

    • NODE
    • parseArgs
    • compose
    • date-format
    • dayjs
    • encrypt
    • env-cmd
    • glob
    • Koa 洋葱模型
    • lodash
    • logger
    • log4js
    • mongod
    • nanoid
    • node-red
    • node-stream
    • node:test
    • nodemailer
    • nodemon
    • nodered
    • parse-curl
    • pm2
    • toml
    • ws
    • yargs
    • zx

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()
Last Updated:
Contributors: rosendo
Prev
lodash
Next
log4js