console模塊Node.js內置的console模塊是最簡單的日志記錄方式,適合開發調試。通過console.log()輸出普通信息,console.error()輸出錯誤信息,日志會直接顯示在終端或重定向到文件(如node app.js > app.log 2>&1)。但這種方式缺乏日志級別、格式化和長期管理功能,僅適用于臨時調試。
第三方日志庫提供了日志級別、格式化、傳輸(文件/控制臺/HTTP)等功能,適合生產環境:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(), // 結構化日志(便于后續分析)
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }), // 錯誤日志單獨存儲
new winston.transports.File({ filename: 'combined.log' }), // 所有日志合并
new winston.transports.Console({ format: winston.format.simple() }) // 控制臺輸出(開發環境)
]
});
logger.info('Application started'); // 記錄info日志
const bunyan = require('bunyan');
const logger = bunyan.createLogger({ name: 'myapp' }); // 日志名稱
logger.info({ user: 'John' }, 'User logged in'); // 帶上下文的日志
const pino = require('pino')();
pino.info('This is a log message'); // 自動添加時間戳、日志級別
const log4js = require('log4js');
log4js.configure({
appenders: {
file: { type: 'file', filename: 'app.log', pattern: '-yyyy-MM-dd', keepFileExt: true }, // 按天輪轉
console: { type: 'console' }
},
categories: { default: { appenders: ['file', 'console'], level: 'info' } }
});
const logger = log4js.getLogger();
logger.info('Log4js is working');
這些庫均支持日志級別過濾(如僅記錄error及以上級別)、結構化日志(便于ELK等工具分析)和多傳輸目標(文件+控制臺+遠程服務器)。
當日志文件過大時,需通過輪轉分割文件,避免占用過多磁盤空間。Ubuntu下常用logrotate工具:
sudo apt-get install logrotate/etc/logrotate.d/nodejs文件,添加以下內容(針對Node.js日志目錄):/var/log/nodejs/*.log {
daily # 每天輪轉
missingok # 日志文件不存在時不報錯
rotate 7 # 保留最近7天的日志
compress # 壓縮舊日志(.gz格式)
notifempty # 日志為空時不輪轉
create 0640 root adm # 新日志文件權限
}
sudo logrotate -vf /etc/logrotate.d/nodejs(強制立即輪轉)。winston-daily-rotate-file插件)實現。PM2是Node.js進程管理工具,內置日志管理功能,適合生產環境:
sudo npm install pm2 -gpm2 start app.js --name my-app(自動生成out.log(標準輸出)和err.log(錯誤輸出))pm2 logs my-app:實時查看日志(--lines 100限制行數,--follow持續跟蹤)pm2 logs --json:以JSON格式輸出(便于后續處理)pm2 flush:清空當前日志ecosystem.config.js文件設置:module.exports = {
apps: [{
name: 'my-app',
script: 'app.js',
out_file: '/var/log/nodejs/my-app-out.log', // 標準輸出路徑
error_file: '/var/log/nodejs/my-app-err.log', // 錯誤輸出路徑
log_date_format: 'YYYY-MM-DD HH:mm:ss', // 日志時間格式
merge_logs: true, // 合并stdout和stderr
log_rotation: true, // 開啟輪轉
log_rotation_interval: '1d', // 每天輪轉
log_rotation_size: '10M', // 單個文件超過10M時輪轉
log_rotation_keep: 7 // 保留7個輪轉文件
}]
};
啟動:pm2 start ecosystem.config.js。將Node.js日志發送到系統日志(/var/log/syslog或/var/log/messages),統一管理:
sudo apt-get install rsyslog(Ubuntu默認安裝)/etc/rsyslog.d/50-default.conf,添加以下內容(將node程序的日志發送到/var/log/nodejs.log):if $programname == 'node' then /var/log/nodejs.log
& stop # 停止后續處理(避免重復記錄)
sudo systemctl restart rsyslogtail -f /var/log/nodejs.log。transports.Console或winston-syslog插件)。對于大規模應用,可使用日志分析平臺實現集中存儲、可視化和告警:
file input插件),Elasticsearch存儲并索引,Kibana可視化分析(如錯誤趨勢、請求耗時)。file input插件,解析JSON格式日志(Winston/Bunyan輸出的JSON可直接解析)。winston-graylog2或bunyan-graylog插件發送GELF格式日志到Graylog服務器。promtail收集日志(支持Node.js JSON格式),發送到Loki,通過Grafana展示日志面板。以上方案覆蓋了Ubuntu下Node.js日志管理的記錄、輪轉、進程管理、系統集成、分析全流程,可根據應用規模(開發/生產)、需求(簡單/復雜)選擇合適的組合(如開發用console+Winston,生產用PM2+logrotate+ELK)。