Troubleshooting: where's my upgrade section of an install log

When folks start using upgrades with the Windows Installer the question 'where's my upgrade log?' quickly follows. Here are some initial details to upgrade logging

Q: Where is my upgrade log?
A: The upgrade logging is added to the log of the enclosing product install.

Q: Where in my product install log is my upgrade section?
A: Search for

...
MSI (s) <process data> <time>: Doing action: RemoveExistingProducts
Action <time>: RemoveExistingProducts. Removing applications
Action start <time>: RemoveExistingProducts.
...
Action ended <time>: RemoveExistingProducts. Return value <action return code>.
...

Q: Hey, I passed asked for verbose logging in the install log but the nested install is not verbose. What’s up with that?
A: Sorry. The upgrade functionality is dependent on the nested install infrastructure and nested installs provide limited support to communicate between parent and child installs.

Q: How do I distinguish how the property values were set during the upgrade?
A: Search for Property(N), where the (N) stands for nest.

Q: How can I confirm the product that was upgraded?
A: Search for a line that starts with “RemoveExistingProducts: Application:” such as

...
RemoveExistingProducts: Application: {0AC95D97-1B75-4AC7-B061-F21E379FF809}, Command line: UPGRADINGPRODUCTCODE={DD4CEE59-5192-4CE1-8AFA-1CFA8EB37209} REMOVE=ALL
...

In this example, the old product code is {0AC95D97-1B75-4AC7-B061-F21E379FF809} and the new product code is {DD4CEE59-5192-4CE1-8AFA-1CFA8EB37209}

Q: How can tell what was uninstalled?
A: Search for the string “InstallValidate. Validating install” inside the nested section of the log. Immediately after that there is a listing of the Feature and Component states for the product. Here are some examples

...
MSI (s) <process data> <time>: Feature: <feature name 1>; Installed: Absent; Request: Null; Action: Null
MSI (s) <process data> <time>: Feature: <feature name 2>; Installed: Local; Request: Absent; Action: Absent
...
MSI (s) <process data> <time>: Component: <component name 1>; Installed: Local; Request: Absent; Action: Absent
MSI (s) <process data> <time>: Component: <component name 2>; Installed: Absent; Request: Null; Action: Null
...

Q: How can tell if my custom actions were run?
A: Search for the custom action name within the nested section of the log. If it did not run, the name will be preceded by “Skipping action:”. If it did run, the name will be preceded by “Doing action:”. Here’s a couple of examples…

...
MSI (s) (10:C0) [09:48:43:539]: Skipping action: <Custom Action 1> (condition is false)
MSI (s) (10:C0) [09:48:43:539]: Doing action: <Custom Action 2>
...

Q: How can tell why my custom actions were run or not run?
A: First open the package in your favorite MSI editor, such as Orca from the MSI SDK. Second find the custom action of interest in the sequence table interest. Third, examine the condition column entry. Forth, examine the Property(N) listing for the property values. Fifth, when you do the math on the condition with the values from the log you should get the false if the action did not run or true if the action did run.