@@ -5,6 +5,7 @@ import { graceful as gracefulExit, type Options as gracefulExitOptions } from 'g
55import { BaseAppWorker , BaseAppUtils } from '../../base/app.js' ;
66import { terminate } from '../../../terminate.js' ;
77import type { MessageBody } from '../../../messenger.js' ;
8+ import { ipcLogger , formatIpcMessage , internalIpcLogEnabled } from '../../../ipc_logger.js' ;
89
910export class AppProcessWorker extends BaseAppWorker < ClusterProcessWorker > {
1011 get id ( ) {
@@ -24,6 +25,7 @@ export class AppProcessWorker extends BaseAppWorker<ClusterProcessWorker> {
2425 }
2526
2627 send ( message : MessageBody ) {
28+ ipcLogger . info ( formatIpcMessage ( `master->app#${ this . workerId } ` , message ) ) ;
2729 sendmessage ( this . instance , message ) ;
2830 }
2931
@@ -43,6 +45,7 @@ export class AppProcessWorker extends BaseAppWorker<ClusterProcessWorker> {
4345
4446 static send ( message : MessageBody ) {
4547 message . senderWorkerId = String ( process . pid ) ;
48+ ipcLogger . info ( formatIpcMessage ( `app#${ process . pid } ->master` , message ) ) ;
4649 process . send ! ( message ) ;
4750 }
4851
@@ -78,16 +81,37 @@ export class AppProcessUtils extends BaseAppUtils {
7881 const appWorker = new AppProcessWorker ( worker ) ;
7982 this . emit ( 'worker_forked' , appWorker ) ;
8083 appWorker . disableRefork = true ;
81- worker . on ( 'message' , msg => {
84+ worker . on ( 'message' , ( msg , handle ) => {
8285 if ( typeof msg === 'string' ) {
8386 msg = {
8487 action : msg ,
8588 data : msg ,
8689 } ;
8790 }
8891 msg . from = 'app' ;
92+ ipcLogger . info ( formatIpcMessage (
93+ `master<-app#${ worker . process . pid } ` ,
94+ msg ,
95+ handle ,
96+ ) ) ;
8997 this . messenger . send ( msg ) ;
9098 } ) ;
99+
100+ // cluster internal NODE_CLUSTER messages (listening / online / queryServer / accepted (fd ack) / close / ...)
101+ // Must hook on `worker.process` (ChildProcess) — `cluster.Worker` doesn't forward `internalMessage`.
102+ // Note: `internalMessage` is not a documented Node.js event but has been stable across major versions.
103+ // Opt-in via EGG_CLUSTER_IPC_LOG because this is very verbose under load.
104+ if ( internalIpcLogEnabled ) {
105+ worker . process . on ( 'internalMessage' , ( msg : { cmd ?: string ; act ?: string ; ack ?: number } , handle : unknown ) => {
106+ if ( ! msg || msg . cmd !== 'NODE_CLUSTER' ) return ;
107+ const label = msg . act ? `cluster:${ msg . act } ` : `cluster:ack#${ msg . ack ?? '?' } ` ;
108+ ipcLogger . info ( formatIpcMessage (
109+ `master<-app#${ worker . process . pid } ` ,
110+ { action : label , data : msg } ,
111+ handle ,
112+ ) ) ;
113+ } ) ;
114+ }
91115 this . log ( '[master] app_worker#%s:%s start, state: %s, current workers: %j' ,
92116 appWorker . id , appWorker . workerId , appWorker . state ,
93117 Object . keys ( cluster . workers ! ) ) ;
0 commit comments