ubuntu

ubuntu下js如何进行日志记录

小樊
43
2025-08-31 22:12:29
栏目: 编程语言

在Ubuntu环境下,使用JavaScript进行日志记录有多种方法。以下介绍几种常用的方式,包括使用Node.js内置模块以及第三方库来实现日志管理。

1. 使用 Node.js 内置的 console 模块

Node.js 提供了内置的 console 模块,适用于简单的日志记录需求。你可以使用 console.logconsole.error 等方法输出日志信息。

示例代码:

// logger.js
function logInfo(message) {
    console.log(`[INFO] ${new Date().toISOString()} - ${message}`);
}

function logError(error) {
    console.error(`[ERROR] ${new Date().toISOString()} - ${error.message}`);
}

module.exports = { logInfo, logError };
// app.js
const { logInfo, logError } = require('./logger');

logInfo('应用程序启动成功');
try {
    // 一些可能会抛出错误的代码
    throw new Error('示例错误');
} catch (error) {
    logError(error);
}

运行方式:

node app.js

2. 使用第三方日志库

对于更复杂的日志需求,建议使用第三方日志库,如 winstonpino。这些库提供了更多的功能,如日志级别、日志格式化、日志轮转等。

使用 winston

winston 是一个功能强大的日志库,支持多种传输方式(控制台、文件、HTTP等)和日志格式。

安装 winston

npm install winston

示例代码:

// logger.js
const winston = require('winston');

const logger = winston.createLogger({
    level: 'info', // 日志级别
    format: winston.format.combine(
        winston.format.timestamp({
            format: 'YYYY-MM-DD HH:mm:ss'
        }),
        winston.format.printf(({ timestamp, level, message }) => {
            return `[${timestamp}] [${level.toUpperCase()}] - ${message}`;
        })
    ),
    transports: [
        new winston.transports.Console(),
        new winston.transports.File({ filename: 'app.log' })
    ]
});

module.exports = logger;
// app.js
const logger = require('./logger');

logger.info('应用程序启动成功');
try {
    // 一些可能会抛出错误的代码
    throw new Error('示例错误');
} catch (error) {
    logger.error(error.message);
}

使用 pino

pino 是一个高性能的日志库,适用于生产环境。

安装 pino

npm install pino

示例代码:

// logger.js
const pino = require('pino');
const logger = pino({
    level: 'info', // 日志级别
    transport: {
        target: 'pino-pretty', // 在控制台输出美化格式
        options: {
            colorize: true
        }
    }
});

module.exports = logger;
// app.js
const logger = require('./logger');

logger.info('应用程序启动成功');
try {
    // 一些可能会抛出错误的代码
    throw new Error('示例错误');
} catch (error) {
    logger.error(error.message);
}

日志轮转

对于需要长期保存日志的应用,建议配置日志轮转,以防止日志文件过大。可以使用 winston-daily-rotate-file 等库来实现。

安装 winston-daily-rotate-file

npm install winston-daily-rotate-file

示例配置:

// logger.js
const winston = require('winston');
const { createLogger, format, transports } = winston;
const DailyRotateFile = require('winston-daily-rotate-file');

const transport = new DailyRotateFile({
    filename: 'application-%DATE%.log',
    datePattern: 'YYYY-MM-DD-HH',
    zippedArchive: true,
    maxSize: '20m',
    maxFiles: '14d'
});

const logger = createLogger({
    level: 'info',
    format: format.combine(
        format.timestamp(),
        format.printf(({ timestamp, level, message }) => {
            return `[${timestamp}] [${level.toUpperCase()}] - ${message}`;
        })
    ),
    transports: [
        transport,
        new transports.Console({
            format: format.combine(
                format.colorize(),
                format.simple()
            )
        })
    ]
});

module.exports = logger;

3. 使用环境变量控制日志级别

为了在不同环境下灵活控制日志输出,可以使用环境变量来设置日志级别。

示例代码:

// logger.js
const winston = require('winston');

const logLevel = process.env.LOG_LEVEL || 'info'; // 默认日志级别为 info

const logger = winston.createLogger({
    level: logLevel,
    format: winston.format.combine(
        winston.format.timestamp({
            format: 'YYYY-MM-DD HH:mm:ss'
        }),
        winston.format.printf(({ timestamp, level, message }) => {
            return `[${timestamp}] [${level.toUpperCase()}] - ${message}`;
        })
    ),
    transports: [
        new winston.transports.Console(),
        new winston.transports.File({ filename: 'app.log' })
    ]
});

module.exports = logger;

在运行应用时,可以通过设置环境变量来调整日志级别:

LOG_LEVEL=debug node app.js

4. 集成到 Express 应用中

如果你使用的是 Express 框架,可以将日志记录集成到中间件中,方便统一管理请求日志。

示例代码:

// logger.js
const winston = require('winston');
const { createLogger, format } = winston;

const logger = createLogger({
    level: 'info',
    format: format.combine(
        format.timestamp(),
        format.printf(({ timestamp, level, message }) => {
            return `[${timestamp}] [${level.toUpperCase()}] - ${message}`;
        })
    ),
    transports: [
        new winston.transports.Console(),
        new winston.transports.File({ filename: 'app.log' })
    ]
});

module.exports = logger;
// app.js
const express = require('express');
const logger = require('./logger');

const app = express();

// 日志中间件
app.use((req, res, next) => {
    logger.info(`${req.method} ${req.url}`);
    next();
});

app.get('/', (req, res) => {
    res.send('Hello World!');
});

app.get('/error', (req, res) => {
    throw new Error('示例错误');
});

app.use((err, req, res, next) => {
    logger.error(err.message);
    res.status(500).send('服务器内部错误');
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    logger.info(`服务器正在运行在端口 ${PORT}`);
});

总结

在Ubuntu环境下使用JavaScript进行日志记录,可以根据项目需求选择合适的方法:

选择合适的工具和方法,可以帮助你更好地管理和监控应用程序的运行状态。

0
看了该问题的人还看了