温馨提示×

linux下nodejs日志权限

小樊
46
2026-09-26 18:30:37
栏目: 编程语言

在 Linux 下使用 Node.js 写日志时,日志文件的权限问题通常出现在以下几个方面:

  1. 进程以什么用户运行
  2. 日志目录/文件创建时的 umask
  3. 日志库是否显式设置权限
  4. 多进程 / 多用户访问冲突

下面按常见场景说明。


一、最基础的权限问题

1. 进程用户决定权限

  • Node.js 进程以 root 运行 → 日志通常是 root:root
  • 以 www / node / 普通用户运行 → 日志属于该用户

查看:

ps -ef | grep node
ls -l /var/log/your-app/

2. umask 影响新日志文件权限

Node.js 创建文件时受 umask 影响:

fs.writeFileSync('app.log', 'hello');

默认 umask 通常是 022:

  • 文件权限:644
  • 目录权限:755

修改 umask:

umask 002
node app.js

或在代码中:

process.umask(0o002);

二、不同日志方案的权限控制

1. 原生 fs(不推荐生产)

const fs = require('fs');
fs.writeFileSync('app.log', data, { mode: 0o664 });

⚠️ 只对新文件有效,已存在文件不会变


2. winston(最常用)

文件权限

winston 本身 不直接支持 mode,依赖系统 umask

const winston = require('winston');
const { createLogger, transports } = winston;

createLogger({
  transports: [
    new transports.File({
      filename: '/var/log/app/app.log'
    })
  ]
});

✅ 解决方式:

chown app:app /var/log/app
chmod 775 /var/log/app
umask 002

3. pino(高性能)

const pino = require('pino');
const logger = pino({
  level: 'info'
}, fs.createWriteStream('/var/log/app/app.log'));

权限仍由 umask 决定


4. PM2 场景(非常重要)

PM2 默认以 启动用户 运行

pm2 start app.js

日志位置:

~/.pm2/logs/

修改日志目录权限:

sudo chown -R app:app /var/log/app

PM2 启动指定用户:

pm2 start app.js --run-as-user app --run-as-group app

三、多进程 / 集群模式权限冲突

问题

  • cluster 模式
  • 多个 Node 进程写同一日志文件
  • 权限不一致导致 EACCES

推荐方案

✅ 不要多个进程直接写同一文件

方案:

  • 使用 pino + 日志轮转
  • 使用 logrotate
  • 集中式日志(rsyslog / fluentd)

四、logrotate 权限示例

/var/log/app/*.log {
  daily
  rotate 7
  compress
  missingok
  notifempty
  create 664 app app
  sharedscripts
  postrotate
    pm2 reload all
  endscript
}

五、最佳实践总结 ✅

✅ 日志目录提前建好
✅ 明确运行用户
✅ 使用 umask 控制默认权限
✅ 不要 root 跑 Node
✅ 用 logrotate 管理
✅ 多进程用日志服务,不要抢写文件


如果你愿意,可以告诉我:

  • 用的 哪个日志库
  • 是否 PM2 / Docker
  • 报错信息(EACCES ?)

我可以直接给你一套可用配置。

0 踩