温馨提示×

Ubuntu Node.js应用如何进行日志轮转

小樊
54
2025-08-21 21:42:28
栏目: 编程语言

在Ubuntu系统中,对Node.js应用的日志进行轮转(log rotation)是一个常见的需求,以确保日志文件不会无限增长,占用过多磁盘空间。以下是几种实现日志轮转的方法:

方法一:使用 logrotate 工具

Ubuntu系统自带 logrotate 工具,可以方便地对日志文件进行轮转、压缩和删除旧日志。以下是如何配置 logrotate 来管理Node.js应用的日志:

  1. 创建日志目录和日志文件(如果尚未创建):

    mkdir -p /var/log/myapp
    touch /var/log/myapp/myapp.log
    
  2. 创建 logrotate 配置文件: 在 /etc/logrotate.d/ 目录下创建一个新的配置文件,例如 myapp

    sudo nano /etc/logrotate.d/myapp
    
  3. 配置 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: 创建新日志文件时设置权限和所有者。
  4. 测试配置: 运行以下命令测试 logrotate 配置是否正确:

    sudo logrotate -f /etc/logrotate.d/myapp
    

方法二:在Node.js应用中使用 winstonpino 等日志库

如果你希望在Node.js应用内部处理日志轮转,可以使用 winstonpino 等日志库。这些库提供了内置的日志轮转功能。

使用 winston

  1. 安装 winstonwinston-daily-rotate-file

    npm install winston winston-daily-rotate-file
    
  2. 配置 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

  1. 安装 pinopino-pretty

    npm install pino pino-pretty
    
  2. 配置 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应用,可以在服务文件中配置日志轮转。

  1. 创建 systemd 服务文件

    sudo nano /etc/systemd/system/myapp.service
    
  2. 配置服务文件

    [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
    
  3. 重新加载 systemd 配置并启动服务

    sudo systemctl daemon-reload
    sudo systemctl start myapp
    sudo systemctl enable myapp
    
  4. 配置 rsyslog 进行日志轮转: 编辑 /etc/rsyslog.conf 或创建一个新的配置文件 /etc/rsyslog.d/50-default.conf,添加以下内容:

    if $programname == 'myapp' then /var/log/myapp.log
    & stop
    
  5. 重启 rsyslog 服务

    sudo systemctl restart rsyslog
    

通过以上方法,你可以有效地管理Node.js应用的日志轮转,确保日志文件不会过大,同时保留必要的历史记录。

0