定时任务内调用app.logger.info()方法会被划入到上下文日志,而不是应用日志的bug
在此输入你需要反馈的 Bug 具体信息(Bug in Detail):
1,我在定时任务task()方法内调用了app.logger.info()函数
2,预期:生成应用级别的日志,进入 exports.logger = { formatter(meta) { }} 的 formatter函数进行格式化日志
3,实际:生成上下文级别的日志,进入 exports.logger = { contextFormatter(meta) { }} 的 contextFormatter函数进行格式化日志
可复现问题的仓库地址(Reproduction Repo)
` // schedule/test.js module.exports = (app) => { return { schedule: { type: 'worker', immediate: true }, async task (ctx) { app.logger.info('应用日志'); } } }
// config/config.default.js
exports.logger = {
formatter(meta) {
const logInfo = {
type: 'application'
}
return JSON.stringify(logInfo);
},
contextFormatter(meta) {
const logInfo = {
type: 'context'
}
return JSON.stringify(logInfo);
}
}
`
Node 版本号:
20.19.4
Eggjs 版本号:
^3.30.1
相关插件名称与版本号(PlugIn and Name):
egg-scripts, ^3.1.0
操作平台与版本号(Platform and Version):
windows 11
因为每个 schedule task 现在都是会在一个 ctx 下执行,所以 logger 都会自动判断到当前处于 ctx 下,会按照 contextFormatter 来打印。
因为每个 schedule task 现在都是会在一个 ctx 下执行,所以 logger 都会自动判断到当前处于 ctx 下,会按照 contextFormatter 来打印。
app属性是Application实例,按理来说调用app.logger.info()应该是应用级别日志的,如果我想打印应用级别日志,有什么解决办法吗
而且还有应该算是一个比较严重的bug,生产模式运行时,schedule task 调用了ctx.service.xxxservice.js , xxxservice.js 内通过const { Service } = require('egg');创建了Service,const {app,ctx} = this;的app挂载的对象时有时没有
能否提供一个可复现的 repo?这样我可以更快地定位到问题
能否提供一个可复现的 repo?这样我可以更快地定位到问题
我已经知道原因了,因为我的定时任务是只在一个Worker上执行的,所以在定时任务调用的函数中挂载app属性时,只有一个APP Worker生效。