from __future__ import print_function
import logging
from io import IOBase
from sys import stdout
from platform import python_version_tuple
if python_version_tuple( ) [ 0 ] == '3' :
from IO import StringIO
else :
try :
from cStringIO import StringIO
except ImportError :
from StringIO import StringIO
# Some other file, like __init__.py
logging .basicConfig ( format= '%(asctime)s %(name)-12s %(levelname)-8s %(message)s' , level= 'INFO' )
handler = logging .root .handlers .pop ( )
assert logging .root .handlers == [ ] , "root logging handlers aren't empty"
handler.stream .close ( )
handler.stream = stdout
logging .root .addHandler ( handler)
# Some other file, like __init__.py
log = logging .getLogger ( __name__)
stderr_stream = logging .StreamHandler ( StringIO ( ) )
log.addHandler ( stderr_stream)
log.setLevel ( logging .ERROR )
print ( 'log.level =' , { logging .INFO : 'INFO' ,
logging .ERROR : 'ERROR' } [ log.level ] )
stdout_stream = logging .StreamHandler ( StringIO ( ) )
log.addHandler ( stdout_stream)
log.setLevel ( logging .INFO )
print ( 'log.level =' , { logging .INFO : 'INFO' ,
logging .ERROR : 'ERROR' } [ log.level ] )
log.info ( 'hello' )
log.error ( 'world' )
print ( 'stderr_stream =' , stderr_stream.stream .getvalue ( ) )
print ( 'stdout_stream =' , stdout_stream.stream .getvalue ( ) )
ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IGxvZ2dpbmcKCmZyb20gaW8gaW1wb3J0IElPQmFzZQpmcm9tIHN5cyBpbXBvcnQgc3Rkb3V0CmZyb20gcGxhdGZvcm0gaW1wb3J0IHB5dGhvbl92ZXJzaW9uX3R1cGxlCgppZiBweXRob25fdmVyc2lvbl90dXBsZSgpWzBdID09ICczJzoKICAgIGZyb20gSU8gaW1wb3J0IFN0cmluZ0lPCmVsc2U6CiAgICB0cnk6CiAgICAgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KCiMgU29tZSBvdGhlciBmaWxlLCBsaWtlIF9faW5pdF9fLnB5CmxvZ2dpbmcuYmFzaWNDb25maWcoZm9ybWF0PSclKGFzY3RpbWUpcyAlKG5hbWUpLTEycyAlKGxldmVsbmFtZSktOHMgJShtZXNzYWdlKXMnLCBsZXZlbD0nSU5GTycpCmhhbmRsZXIgPSBsb2dnaW5nLnJvb3QuaGFuZGxlcnMucG9wKCkKYXNzZXJ0IGxvZ2dpbmcucm9vdC5oYW5kbGVycyA9PSBbXSwgInJvb3QgbG9nZ2luZyBoYW5kbGVycyBhcmVuJ3QgZW1wdHkiCmhhbmRsZXIuc3RyZWFtLmNsb3NlKCkKaGFuZGxlci5zdHJlYW0gPSBzdGRvdXQKbG9nZ2luZy5yb290LmFkZEhhbmRsZXIoaGFuZGxlcikKIyBTb21lIG90aGVyIGZpbGUsIGxpa2UgX19pbml0X18ucHkKCmxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQpzdGRlcnJfc3RyZWFtID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKFN0cmluZ0lPKCkpCmxvZy5hZGRIYW5kbGVyKHN0ZGVycl9zdHJlYW0pCmxvZy5zZXRMZXZlbChsb2dnaW5nLkVSUk9SKQpwcmludCgnbG9nLmxldmVsID0nLCB7bG9nZ2luZy5JTkZPOiAnSU5GTycsCiAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLkVSUk9SOiAnRVJST1InfVtsb2cubGV2ZWxdKQoKc3Rkb3V0X3N0cmVhbSA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihTdHJpbmdJTygpKQpsb2cuYWRkSGFuZGxlcihzdGRvdXRfc3RyZWFtKQpsb2cuc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQpwcmludCgnbG9nLmxldmVsID0nLCB7bG9nZ2luZy5JTkZPOiAnSU5GTycsCiAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLkVSUk9SOiAnRVJST1InfVtsb2cubGV2ZWxdKQoKbG9nLmluZm8oJ2hlbGxvJykKbG9nLmVycm9yKCd3b3JsZCcpCnByaW50KCdzdGRlcnJfc3RyZWFtID0nLCBzdGRlcnJfc3RyZWFtLnN0cmVhbS5nZXR2YWx1ZSgpKQpwcmludCgnc3Rkb3V0X3N0cmVhbSA9Jywgc3Rkb3V0X3N0cmVhbS5zdHJlYW0uZ2V0dmFsdWUoKSk=