在Ubuntu环境下,使用JavaScript进行日志记录有多种方法。以下介绍几种常用的方式,包括使用Node.js内置模块以及第三方库来实现日志管理。
console 模块Node.js 提供了内置的 console 模块,适用于简单的日志记录需求。你可以使用 console.log、console.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
对于更复杂的日志需求,建议使用第三方日志库,如 winston 或 pino。这些库提供了更多的功能,如日志级别、日志格式化、日志轮转等。
winstonwinston 是一个功能强大的日志库,支持多种传输方式(控制台、文件、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);
}
pinopino 是一个高性能的日志库,适用于生产环境。
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;
为了在不同环境下灵活控制日志输出,可以使用环境变量来设置日志级别。
// 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
如果你使用的是 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进行日志记录,可以根据项目需求选择合适的方法:
console 模块。winston 或 pino,支持更多功能和更好的性能。选择合适的工具和方法,可以帮助你更好地管理和监控应用程序的运行状态。