Prior to this commit extra data that we wanted to pass in to sentry from the python loggin client would have to look like this:     logger.info("This is message %d of %d", 1, 1, extra={'data':{'my extra data':'This is whatever I want it to be'}})
Prior to this commit extra data that we wanted to pass in to sentry from the python loggin client would have to look like this:
    logger.info("This is message %d of %d", 1, 1, extra={'data':{'my extra data':'This is whatever I want it to be'}})

This is because python's logging system will take whatever the contents of 'extra' are and attach each item to the record like this:
        if extra is not None:
            for key in extra:
                if (key in ["message", "asctime"]) or (key in rv.__dict__):
                    raise KeyError("Attempt to overwrite %r in LogRecord" % key)
                rv.__dict__[key] = extra[key]

Then raven, when it gets to handle the message, looks only for record.extra. Therefore in order to get the extra data in one needed
to use a dictionary in a dictionary.

This change makes raven use any extra data on the record so that the above message can become:
    logger.info("This is message %d of %d", 1, 1, extra={'my extra data':'This is whatever I want it to be'})

It also has the added benefit of including other data that is on the record object but not normally passed to sentry. This includes the following:

thread: -1216764224
threadName: MainThread
processName: MainProcess
filename: log_test.py
lineno: 44
created: 1328891489.6684151
levelname: 'ERROR'

nikolas/raven-python,jmp0xf/raven-python,johansteffner/raven-python,jbarbuto/raven-python,inspirehep/raven-python,smarkets/raven-python,lepture/raven-python,akalipetis/raven-python,arthurlogilab/raven-python,Photonomie/raven-python,nikolas/raven-python,lepture/raven-python,lepture/raven-python,inspirehep/raven-python,Photonomie/raven-python,Photonomie/raven-python,Goldmund-Wyldebeast-Wunderliebe/raven-python,dbravender/raven-python,inspirehep/raven-python,beniwohli/apm-agent-python,smarkets/raven-python,akheron/raven-python,nikolas/raven-python,ronaldevers/raven-python,ticosax/opbeat_python,ewdurbin/raven-python,johansteffner/raven-python,hzy/raven-python,ronaldevers/raven-python,danriti/raven-python,beniwohli/apm-agent-python,someonehan/raven-python,akalipetis/raven-python,dirtycoder/opbeat_python,percipient/raven-python,patrys/opbeat_python,ewdurbin/raven-python,patrys/opbeat_python,ewdurbin/raven-python,Goldmund-Wyldebeast-Wunderliebe/raven-python,jbarbuto/raven-python,jmagnusson/raven-python,dbravender/raven-python,openlabs/raven,jmp0xf/raven-python,akheron/raven-python,johansteffner/raven-python,arthurlogilab/raven-python,akheron/raven-python,icereval/raven-python,daikeren/opbeat_python,jbarbuto/raven-python,tarkatronic/opbeat_python,dirtycoder/opbeat_python,arthurlogilab/raven-python,smarkets/raven-python,ronaldevers/raven-python,alex/raven,getsentry/raven-python,inspirehep/raven-python,nikolas/raven-python,lopter/raven-python-old,daikeren/opbeat_python,patrys/opbeat_python,hzy/raven-python,tarkatronic/opbeat_python,tarkatronic/opbeat_python,hzy/raven-python,beniwohli/apm-agent-python,percipient/raven-python,Goldmund-Wyldebeast-Wunderliebe/raven-python,arthurlogilab/raven-python,someonehan/raven-python,recht/raven-python,patrys/opbeat_python,icereval/raven-python,ticosax/opbeat_python,recht/raven-python,jmp0xf/raven-python,akalipetis/raven-python,jmagnusson/raven-python,dbravender/raven-python,ticosax/opbeat_python,jbarbuto/raven-python,smarkets/raven-python,getsentry/raven-python,daikeren/opbeat_python,dirtycoder/opbeat_python,recht/raven-python,someonehan/raven-python,collective/mr.poe,jmagnusson/raven-python,danriti/raven-python,beniwohli/apm-agent-python,percipient/raven-python,getsentry/raven-python,Goldmund-Wyldebeast-Wunderliebe/raven-python,danriti/raven-python,icereval/raven-python,icereval/raven-python