Do you log the hits by a custom code in the custom web parts? If so, it could be the issue which you have mentioned - that it goes twice through the code of web parts.
If you do not use special web part properties, you could use the User control web part for your controls instead of registering them as new web parts (Adding custom code to the Portal engine page
). Then it uses the standard ASP.NET life cycle.
Otherwise, you could add a condition to your web part before you log the hit so that it would fire the method only once.