怎樣自定義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應用本身的日志格式自定義。