Я нашел решение. Если кто-то также столкнулся с этой проблемой, он может попробовать это -
Вы должны инициализировать 'user_output' и 'user_error'.
Из документации MCE -
user_error => \&user_error, ## Default undef
user_output => \&user_output, ## Default undef
# MCE will forward data to user_error/user_output,
# when defined, for the following methods.
# MCE->sendto(\*STDERR, "sent to user_error\n");
# MCE->printf(\*STDERR, "%s\n", "sent to user_error");
# MCE->print(\*STDERR, "sent to user_error\n");
# MCE->say(\*STDERR, "sent to user_error");
# MCE->sendto(\*STDOUT, "sent to user_output\n");
# MCE->printf("%s\n", "sent to user_output");
# MCE->print("sent to user_output\n");
# MCE->say("sent to user_output");
Так что в моем случае -
sub initialize_mce {
my $mce = MCE->new(
max_workers => 5,
input_data => \@input_data,
on_post_exit => \&on_post_exit,
user_begin => \&user_begin,
user_end => \&user_end,
user_func => \&run_function,
user_output => sub {
$logger->info($_[0]); # Log4perl Obj
},
user_error => sub {
$logger->error($_[0]); # Log4perl Obj
}
);
}
А в других функциях вам просто нужно «напечатать» в STDOUT / STDERR
Например .-
sub user_begin { ## Called once at the beginning
my ($self, $e) = @_;
$mce->print("Process Id : ".$$." start");
# OR to log error
$mce->print(\*STDERR, "Exception/Error Found");
}
Я не уверен, что это единственный способ, или есть какой-то другой эффективный способ, но пока он выполняет свою работу.