I still haven't found "The Proper Way
TM", so I'd certainly also like to hear what other people do
But what I try to do is...
- commit relatively often to subversion,
at least when you've implemented a new feature or fixed a bug. I don't like committing non-working builds, but I do it if I need to go somewhere where I might work on the code.
- come up with a safely grep-able style for your commit messages, so version history can be extracted. Haven't settled on anything, but you'll probably want a way to identify at least bugfix and added feature. Helps if you use one line per item, and depend on wordwrap (ie, don't split manually).
- document every relevant change in your commit messages. "Fixed whitespace" isn't relevant, "factored foo() into bar() and baz()" could be.
Also, what kind of changelog you want to build obviously depends on the target audience. An end-user won't care if there's been some code interface changes, but a (programmer) user of a component surely will.