About the issue you reported on the function
getNcuts(), we looked at it and I can confirm that we have a bug in the number of Benders cuts reported by the function
getNcuts() (the issue is there with all CPLEX APIs).
The Benders algorithm implemented in CPLEX consists of two main phases.
In the first phase, we solve the continuous relaxation of the (reformulated) problem,
by applying the so-called Benders cut loop.
In the second phase, we apply a branch-and-cut starting from the formulation that we
have at the end of the first phase (which already contains some Benders cuts).
In CPLEX 12.10, the log displays information also for the first phase (the Benders cut loop), so the two phases should be clearly visible.
If you are interested in more details on the Benders implementation in CPLEX, you can find a quite detailed description of the algorithm here: http://www.optimization-online.org/DB_HTML/2019/12/7506.html
In the log, the "Benders cuts applied" information which is reported in the end gives that total number of Benders cuts that were applied, considering both phases described above. However, due to a bug in the cut counting, from the APIs, the function
getNcuts() only returns the number of Benders cuts applied in the second phase.
Note that this issue only affects the counting of the Benders cuts but it has no impact on the behavior of the algorithm. Also note that, with "applied cuts", we mean the cuts that were added to the problem and that were kept in the problem, so cuts that were temporarily added and removed afterwards are not counted.
About your other question on the distinction between number of optimality and number of feasibility cuts, currently there is no way for the user to have separate information about optimality and feasibility Benders cuts.