如何将systemd服务中Node.js应用的日志输出重定向到文件?
systemd服务下Node.js应用日志输出到指定文件的正确方法
先修正服务配置错误
你的服务配置里Restart=my_username是无效配置,Restart的合法取值为always、on-failure、on-success等,比如改为Restart=on-failure,确保服务重启逻辑正常工作。
方法一:使用systemd内置日志配置
直接在[Service]段添加日志输出配置,无需依赖shell重定向:
[Unit] Description=myapp [Service] ExecStart=/path/to/myapp/myapp.js Restart=on-failure User=nobody Group=www-data Environment=PATH=/usr/bin:/usr/local/bin Environment=NODE_ENV=production WorkingDirectory=/path/to/myapp # 添加以下两行配置日志输出 StandardOutput=append:/path/to/myapp/myapp_error.log StandardError=append:/path/to/myapp/myapp_error.log [Install] WantedBy=multi-user.target
append:表示以追加模式写入日志,避免每次启动覆盖原有内容;若需要覆盖则用file:替换append:- 必须使用绝对路径,同时确保
nobody用户对日志文件所在目录有写入权限
修改完成后执行以下命令生效:
sudo systemctl daemon-reload sudo systemctl restart myapp
方法二:通过shell执行并处理重定向
如果偏好传统shell重定向方式,需要让systemd调用bash执行命令,修改ExecStart如下:
ExecStart=/bin/bash -c '/usr/bin/node /path/to/myapp/myapp.js > /path/to/myapp/myapp_error.log 2>&1'
- 务必指定node的绝对路径(可通过
which node命令查询),避免环境变量导致的路径问题 - 同样要保证日志目录对
nobody用户有写入权限
修改后执行重载配置和重启命令:
sudo systemctl daemon-reload sudo systemctl restart myapp
补充:直接查看systemd日志
如果不需要写入文件,可直接用journalctl查看服务日志:
# 实时查看最新日志 journalctl -u myapp -f # 查看所有历史日志 journalctl -u myapp
内容的提问来源于stack exchange,提问作者MTK
相关产品推荐
相关产品推荐

