My logic goes like this...
I figure the net annual fee to be the net combination of annual perks (like a free hotel night) valued at my cash/points cost otherwise, plus the incremental benefit from the spend I'll make on the card for the year, compared to the $ of fee.
Then, if the card is not easily "churned", I keep it if the net annual fee is positive.
For example, the Marriott card offers a cat 1-5 cert each year. For me, that's worth about $85. Let's say I also put $5000 of Marriott stays on the card, compared to another card earning 2% cash back. If I value Marriott points at 1 cent each, my benefit from spend for a year is $250 - $100 = $150.
So, $85 + $150 > $85 annual fee, and thus I keep it.
If it is easily churned or the net benefit is negative, I cancel.
Easy, right?