怎样自定义Ubuntu JS日志格式
在Ubuntu系统中,自定义JavaScript(Node.js)应用程序的日志格式主要通过第三方日志库(如Winston、Morgan)实现,也可直接通过代码手动配置。以下是具体方法:
Winston是Node.js最流行的日志库之一,支持时间戳、日志级别、自定义消息格式、多传输目标(控制台、文件、数据库等),功能强大且灵活。
npm install winston。logger.js文件,通过winston.format.combine组合多个格式化器(如时间戳、消息模板),并通过transports指定日志输出位置(控制台、文件)。示例如下:const { createLogger, format, transports } = require('winston');
const logger = createLogger({
level: 'info', // 设置最低日志级别(info及以上会输出)
format: format.combine(
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), // 添加时间戳(格式可自定义)
format.printf(({ timestamp, level, message }) => { // 自定义日志输出模板
return `[${timestamp}] ${level.toUpperCase()}: ${message}`;
})
),
transports: [
new transports.Console(), // 输出到控制台
new transports.File({ filename: 'logs/error.log', level: 'error' }), // 错误日志单独存文件
new transports.File({ filename: 'logs/combined.log' }) // 所有日志存合并文件
]
});
module.exports = logger;
logger.info('Hello, world.')、logger.error('Something went wrong.'))。运行应用后,日志将按自定义格式输出到控制台和指定文件。若你的应用基于Express.js框架,可使用Morgan中间件快速记录HTTP请求日志(如请求方法、URL、状态码、响应时间),并自定义格式。
npm install morgan。morgan.token定义自定义token(如请求路径、状态码),再用morgan函数生成自定义格式字符串。示例如下:const express = require('express');
const morgan = require('morgan');
const app = express();
// 定义自定义token(获取请求方法、URL、状态码)
morgan.token('customFormat', (req, res) => {
return `${req.method} ${req.originalUrl} - ${res.statusCode}`;
});
// 使用自定义格式(格式为:方法 URL - 状态码)
app.use(morgan(':customFormat'));
// 示例路由
app.get('/', (req, res) => {
res.send('Hello, world!');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
http://localhost:3000时,控制台将输出类似GET / - 200的日志(表示GET请求、路径/、状态码200)。若不想引入第三方库,可通过Node.js内置的fs模块手动写入日志文件,实现简单的格式化(时间戳+日志级别+消息)。
logger.js文件,定义log函数,拼接时间戳、日志级别和消息,写入文件。示例如下:const fs = require('fs');
const path = require('path');
// 创建日志文件流(追加模式)
const logStream = fs.createWriteStream(path.join(__dirname, 'logs/combined.log'), { flags: 'a' });
// 自定义log函数
function log(level, message) {
const timestamp = new Date().toISOString().replace('T', ' ').substring(0, 19); // 格式:YYYY-MM-DD HH:mm:ss
const logEntry = `[${timestamp}] ${level.toUpperCase()}: ${message}\n`; // 拼接日志条目
logStream.write(logEntry); // 写入文件
console.log(logEntry.trim()); // 同时输出到控制台(可选)
}
module.exports = { log };
log函数,调用时传入日志级别(如info、error)和消息(如log('info', 'Application started.')、log('error', 'Database connection failed.'))。日志将写入logs/combined.log文件和控制台。winston-daily-rotate-file等库实现按日期/大小分割日志,避免单个文件过大。process.env.NODE_ENV)控制日志级别(开发环境用debug,生产环境用info/error),提高日志管理的灵活性。journalctl),可使用winston-systemd等库,或配置rsyslog(编辑/etc/rsyslog.conf),但这属于系统级配置,非JS应用本身的日志格式自定义。