Would it also be useful to have the number set all-visible? It seems like if we added a new line prefixed with visibility map, it ought to include all-visible and all-frozen then. Something like this: visibility map: %u pages set all-visible, %u pages set all-frozen.
I find it more confusing to say "up to X may have been removed from the table." It's unclear what that means -- especially since we already have "pages removed" in another part of the log message.
Yeah, on looking at it again, that does seem to make things worse.
We actually could call visibilitymap_count() at the beginning of the vacuum and then log the difference between that and the results of calling it after finishing the vacuum. We currently call it after truncating the table anyway. That won't tell you how many pages were set all-frozen by this vacuum, as pages could have been unfrozen by DML that occurred after the page was vacuumed. It might be useful in addition to the line about the visibility map.
This is somewhat in conflict with Robert and Peter's points about how autovacuum logging should be about what this vacuum did. But, we do have lines that talk about the before and after values:
new relfrozenxid: 748, which is 3 XIDs ahead of previous value
So, we could do something like: visibility map before: %u pages all-visible, %u pages all-frozen visibility map after: %u pages all-visible, %u pages all-frozen or visibility map after: %u pages all-visible (%u more than before), %u pages all-frozen (%u more than before)
I still prefer adding how many pages were set all-frozen by this vacuum, though.
I also like the idea of showing how many pages were set all-frozen by this vacuum (which meets Robert's requirement for figuring out if a vacuum operation did anything useful). The values for pages marked all visible and all frozen can fluctuate for a number of reasons, even, as you point out, from concurrent activity during the vacuum. This is different from relfrozenxid which is a kind of high water mark. So I think the output styles can reasonably be different.
visibility map: %u pages all-visible (%u marked by this operation), %u pages all-frozen (%u marked by this operation)