在Ubuntu系统中,对Node.js应用的日志进行轮转(log rotation)是一个常见的需求,以确保日志文件不会无限增长,占用过多磁盘空间。以下是几种实现日志轮转的方法:
logrotate 工具Ubuntu系统自带 logrotate 工具,可以方便地对日志文件进行轮转、压缩和删除旧日志。以下是如何配置 logrotate 来管理Node.js应用的日志:
创建日志目录和日志文件(如果尚未创建):
mkdir -p /var/log/myapp
touch /var/log/myapp/myapp.log
创建 logrotate 配置文件:
在 /etc/logrotate.d/ 目录下创建一个新的配置文件,例如 myapp:
sudo nano /etc/logrotate.d/myapp
配置 logrotate:
在配置文件中添加以下内容:
/var/log/myapp/myapp.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 root adm
}
解释:
daily: 每天轮转一次日志。rotate 7: 保留7个轮转日志文件。compress: 压缩旧日志文件。delaycompress: 延迟压缩,直到下一次轮转。missingok: 如果日志文件不存在,不会报错。notifempty: 如果日志文件为空,不进行轮转。create 640 root adm: 创建新日志文件时设置权限和所有者。测试配置:
运行以下命令测试 logrotate 配置是否正确:
sudo logrotate -f /etc/logrotate.d/myapp
winston 或 pino 等日志库如果你希望在Node.js应用内部处理日志轮转,可以使用 winston 或 pino 等日志库。这些库提供了内置的日志轮转功能。
winston安装 winston 和 winston-daily-rotate-file:
npm install winston winston-daily-rotate-file
配置 winston:
const winston = require('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 = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
transport
]
});
logger.info('Hello, world!');
pino安装 pino 和 pino-pretty:
npm install pino pino-pretty
配置 pino:
const pino = require('pino');
const prettyPrint = require('pino-pretty');
const logger = pino({
level: 'info',
transport: {
target: 'pino-pretty',
options: {
colorize: true
}
}
});
logger.info('Hello, world!');
systemd 服务管理日志如果你使用 systemd 管理Node.js应用,可以在服务文件中配置日志轮转。
创建 systemd 服务文件:
sudo nano /etc/systemd/system/myapp.service
配置服务文件:
[Unit]
Description=My Node.js Application
After=network.target
[Service]
ExecStart=/usr/bin/node /path/to/your/app.js
Restart=always
User=youruser
Group=yourgroup
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=myapp
[Install]
WantedBy=multi-user.target
重新加载 systemd 配置并启动服务:
sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl enable myapp
配置 rsyslog 进行日志轮转:
编辑 /etc/rsyslog.conf 或创建一个新的配置文件 /etc/rsyslog.d/50-default.conf,添加以下内容:
if $programname == 'myapp' then /var/log/myapp.log
& stop
重启 rsyslog 服务:
sudo systemctl restart rsyslog
通过以上方法,你可以有效地管理Node.js应用的日志轮转,确保日志文件不会过大,同时保留必要的历史记录。