I have made good experiences with a three tier support system using a support ticket software (in my case a proprietary system). This is a setup for medium companies but could be scaled up or down quite easily.
The first support tier takes all the customer calls via a single phone number. If they can help directly they do so, if not, they enter a support ticket. The tickets can be distributed to other persons or other teams. First tier members either keep the ticket they entered to solve the problem later, or they give it to the second tier.
The second tier consists of people with better training in the software they support and can answer harder questions. Most of them are specialized in different aspects of the software or a subject-specific domain. The second tier gets the "hard" tickets. If they need assistance of a developer, they forward the ticket to the third tier.
The third tier consists of one or more developers who are on support duty. They try to solve all the tickets that require development skills. Calls to the customer are either managed solely by the first or second tier (like getting log files from the customer), or by the first or second tier calling the customer with the developer at their side. If it can't be avoided that the developer has to call the customer directly, the "support developer phone" is used. This way, the developer does not show his own number, but the support number. This can be set up easily with most telephone systems. It is recommended to place the developer with the support team during his support duty to minimize communication overhead. It also minimizes the urge to do project work instead of solving all those support tickets.
Having a support duty developer frees all other developers from taking outside calls so they can focus on their work. Rotating the support duty every few weeks lets all developers get in touch with the real world which is always a good experience. I have seen three different approaches to this: Rotating every week lets the developer get back to his work fast, but his dedication to the task is low. It is easy to let a difficult ticket lie in the support system until the next developer start. Rotating every four or even six months lets you become an expert in solving tickets and you will probably know all bugs and usability problems by their first name. But support duty can be stressful so this is not recommended. Doing support duty for one or two months is a good timeframe because it is long enough to get you involved but short enough to see the light at the end of the tunnel.
The ticketing system makes it easy to maintain a history of the customers call and what the different tiers have already tried to do or what they have told the customers. It can also be used to prioritize tasks, schedule tickets, etc.
I can only recommended to establish remote connections with the customers using RDP, PCAnywhere, NTR or any other remoting software. Some customers may not want it due to security reasons, but most will accept it. This way you can check log files or the software by yourself without having to guide the customer through the darker alleys of your products. This saves both sides time. You know what you are doing and the customer does not have to crawl through log files for you.