Error Logging Utility and Controllers

If you're looking for a mechanism that will allow you to save errors from within a constructor, you will have to enqueue them, and then later flush the queue. You might consider an abstract class that will define the behavior you need, along the lines of:

public abstract class LoggingController
{
    public List<Error_Log__c> errors { get; private set; }
    public LoggingController() { errors = new List<Error_Log__c>(); }
    public void logErrors()
    {
        try
        {
            insert errors;
        }
        catch (DmlException d)
        {
            ApexPages.addMessages(d);
        }
    }
}

Then your actual controller/extension will just extend this class.

public with sharing class MyController extends LoggingController
{
    public LoggingController()
    {
        super();
        try
        {
            // doStuff
        }
        catch (QueryException e)
        {
            errors.add(new Error_Log__c(/*data*/));
        }
    }
}

And the key to the magic is, your page can then log the errors as an action.

<apex:page controller="MyController" action="{!logErrors}">
    <!--markup-->
</apex:page>

If you are going to do this, do capture all the available information from the exception including the stacktrace via getStackTraceString.

I also suggest that you should only add this sort of logic sparingly for code that you expect to go wrong: otherwise you are adding a lot of clutter to your code and that clutter in itself can cause or hide defects. The platform's default behaviour of showing the error on a white screen is pretty effective at alerting users who you can then contact you via a public support email/number. Logging the error into an error log table hides the error for the end user and perhaps leaves them confused as to what is happening. And if many (perhaps unimportant) errors are logged your willpower to identify the important ones and address them may run out.

Unfortunately as you probably know you can't log and then re-throw the error to also alert the end user because the transaction will be automatically rolled back so discarding your log. (But as Adrian and Girbot point out in the comments below you can use ApexPages.addMessages.)