egg icon indicating copy to clipboard operation
egg copied to clipboard

定时任务内调用app.logger.info()方法会被划入到上下文日志,而不是应用日志的bug

Open JeffreyCheungGit opened this issue 3 months ago • 5 comments

在此输入你需要反馈的 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

JeffreyCheungGit avatar Oct 11 '25 09:10 JeffreyCheungGit

因为每个 schedule task 现在都是会在一个 ctx 下执行,所以 logger 都会自动判断到当前处于 ctx 下,会按照 contextFormatter 来打印。

fengmk2 avatar Oct 12 '25 03:10 fengmk2

因为每个 schedule task 现在都是会在一个 ctx 下执行,所以 logger 都会自动判断到当前处于 ctx 下,会按照 contextFormatter 来打印。

app属性是Application实例,按理来说调用app.logger.info()应该是应用级别日志的,如果我想打印应用级别日志,有什么解决办法吗

JeffreyCheungGit avatar Oct 13 '25 07:10 JeffreyCheungGit

而且还有应该算是一个比较严重的bug,生产模式运行时,schedule task 调用了ctx.service.xxxservice.js , xxxservice.js 内通过const { Service } = require('egg');创建了Service,const {app,ctx} = this;的app挂载的对象时有时没有

JeffreyCheungGit avatar Oct 14 '25 08:10 JeffreyCheungGit

能否提供一个可复现的 repo?这样我可以更快地定位到问题

fengmk2 avatar Oct 14 '25 08:10 fengmk2

能否提供一个可复现的 repo?这样我可以更快地定位到问题

我已经知道原因了,因为我的定时任务是只在一个Worker上执行的,所以在定时任务调用的函数中挂载app属性时,只有一个APP Worker生效。

JeffreyCheungGit avatar Oct 14 '25 09:10 JeffreyCheungGit