[eggjs/egg]日志切割任务报错

2025-11-20 562 views
9

日志切割任务报错:

2019-03-16 00:00:01,003 ERROR 66 nodejs.TypeError [ERR_INVALID_ARG_TYPE]: [egg-schedule] /app/node_modules/egg-logrotator/app/schedule/rotate_by_file.js execute error
. The "path" argument must be of type string. Received type undefined
    at assertPath (path.js:39:11)
    at Object.join (path.js:1155:7)
    at DayRotator.getRotateFiles (/app/node_modules/egg-logrotator/app/lib/day_rotator.js:39:24)
    at DayRotator.rotate (/app/node_modules/egg-logrotator/app/lib/rotator.js:22:30)
    at task (/app/node_modules/egg-logrotator/app/schedule/rotate_by_file.js:17:21)
    at Messenger.app.messenger.on.data (/app/node_modules/egg-schedule/app.js:71:5)
    at Messenger.emit (events.js:182:13)
    at Messenger.EventEmitter.emit (domain.js:442:20)
    at Messenger._onMessage (/app/node_modules/egg/lib/core/messenger.js:116:12)
    at process.emit (events.js:187:15)
    at process.EventEmitter.emit (domain.js:442:20)
    at emit (internal/child_process.js:812:12)
    at process._tickCallback (internal/process/next_tick.js:63:19)

pid: 66
hostname: xx-8494785676-np5w8

启动日志中logger配置:

2019-02-21 18:20:30,350 INFO 60 [egg:logger] init all loggers with options: {"dir":"/root/logs/xx-server","encoding":"utf8","env":"prod","level":"INFO","consol
eLevel":"INFO","disableConsoleAfterReady":false,"outputJSON":false,"buffer":true,"appLogName":"xx-server-web.log","coreLogName":"egg-web.log","agentLogName":"e
gg-agent.log","errorLogName":"common-error.log","coreLogger":{},"allowDebugAtProd":false,"type":"application"}

格式化后:

{
  agentLogName: "egg-agent.log"
  allowDebugAtProd: false
  appLogName: "xx-server-web.log"
  buffer: true
  consoleLevel: "INFO"
  coreLogName: "egg-web.log"
  coreLogger: {}
  dir: "/root/logs/xx-server"
  disableConsoleAfterReady: false
  encoding: "utf8"
  env: "prod"
  errorLogName: "common-error.log"
  level: "INFO"
  outputJSON: false
  type: "application"
}
  1. 在docker容器中执行,第一次同时几个服务都出现此问题
  1. 日志能正常按默认方式切割
  • Node Version: v10.13.0
  • Egg Version: 2.14.0
  • Plugin Name: egg-logrotator
  • Plugin Version: 3.0.4
  • Platform: Linux(docker容器内)

回答

7

贴下你的 logrotator 的配置看看。

cc @denghongcai

1

logrotator的配置未做任何更改,就是v3.0.4的默认配置

{
  // for rotate_by_hour
  filesRotateByHour: null,
  hourDelimiter: '-',
  // for rotate_by_size
  filesRotateBySize: null,
  maxFileSize: 50 * 1024 * 1024,
  maxFiles: 10,
  rotateDuration: 60000,
  // for clean_log
  maxDays: 31,
}
9

看报错是 at DayRotator.getRotateFiles (/app/node_modules/egg-logrotator/app/lib/day_rotator.js:39:24)

贴下你 run/application_config.json 里面最终 dump 出来的 logrotator 配置看看

2
"logrotator": {
      "filesRotateByHour": null,
      "hourDelimiter": "-",
      "filesRotateBySize": null,
      "maxFileSize": 52428800,
      "maxFiles": 10,
      "rotateDuration": 60000,
      "maxDays": 31
    }
7

试试插件升级到 3.0.7 看看

7

hey, please retry after reinstall dependencies and please never lock it.

$ # reinstall deps and never lock it.
$ rm -rf node_modules yarn.lock package-lock.json
$ npm i --no-package-lock
8

好的,感谢及时回复,升级插件后再看一下

5

@denghongcai 升级到3.0.7版本后,还是在set agent log时报错了,配置项还是之前贴出来的配置

2019-03-19 00:00:01,009 ERROR 54 nodejs.TypeError [ERR_INVALID_ARG_TYPE]: [egg-schedule] /app/node_modules/egg-logrotator/app/schedule/rotate_by_file.js execute error. The "path" argument must be of type string. Received type undefined
    at assertPath (path.js:39:11)
    at Object.join (path.js:1155:7)
    at DayRotator.getRotateFiles (/app/node_modules/egg-logrotator/app/lib/day_rotator.js:35:24)
    at DayRotator.rotate (/app/node_modules/egg-logrotator/app/lib/rotator.js:22:30)
    at task (/app/node_modules/egg-logrotator/app/schedule/rotate_by_file.js:17:21)
    at Messenger.app.messenger.on.data (/app/node_modules/egg-schedule/app.js:71:5)
    at Messenger.emit (events.js:182:13)
    at Messenger.EventEmitter.emit (domain.js:442:20)
    at Messenger._onMessage (/app/node_modules/egg/lib/core/messenger.js:116:12)
    at process.emit (events.js:187:15)
    at process.EventEmitter.emit (domain.js:442:20)
    at emit (internal/child_process.js:812:12)
    at process._tickCallback (internal/process/next_tick.js:63:19)

pid: 54
hostname: xx-b5fb57f7b-gt7rg
4

不好意思,项目名称用xx替换了

"config": {
    "logrotator": {
      "filesRotateByHour": null,
      "hourDelimiter": "-",
      "filesRotateBySize": null,
      "maxFileSize": 52428800,
      "maxFiles": 10,
      "rotateDuration": 60000,
      "maxDays": 31
    },
    "logger": {
      "dir": "/root/logs/xx-server",
      "encoding": "utf8",
      "env": "prod",
      "level": "INFO",
      "consoleLevel": "INFO",
      "disableConsoleAfterReady": false,
      "outputJSON": false,
      "buffer": true,
      "appLogName": "xx-server-web.log",
      "coreLogName": "egg-web.log",
      "agentLogName": "egg-agent.log",
      "errorLogName": "common-error.log",
      "coreLogger": {},
      "allowDebugAtProd": false,
      "type": "application"
    }
},
"plugins": {
    "logrotator": {
      "enable": true,
      "package": "egg-logrotator",
      "name": "logrotator",
      "dependencies": [
        "schedule"
      ],
      "optionalDependencies": [],
      "env": [],
      "from": "/app/node_modules/egg/config/plugin.js",
      "path": "/app/node_modules/egg-logrotator",
      "version": "3.0.7"
    },
}
3

报错就是上面的那句 path.join 一个参数为空了,你可以 console 调试下看看。

4

@atian25 感觉是egg-apollojs插件schedule里这块代码出问题了,这里Object.assign用得有问题,一旦updateConfig里有logger的配置,那么内存中的config.logger完全会被覆盖

const appInfo = this.app.config.appInfo;
const updateConfig = require(path.join(this.app.config.baseDir, 'config/config.default.js'))(appInfo);
Object.assign(this.app.config, updateConfig);
this.app.coreLogger.info(`apollo 更新完成${new Date()}`);
5

。。。。

这段代码肯定有问题。。。怎么能手动再 require 一次然后全覆盖呢。。。 明显对 Egg 的 Config 加载机制不了解啊。

egg-apollojs 这个插件不是我们维护的,你去找作者吧。

9

@atian25 已经确认了是egg-apollojs那个插件的问题,issue可以close了,接下来准备把那个插件修改一下感谢帮助解决问题