Captain_Meow_Meow
Captain_Meow_Meow

Reputation: 2531

Python logging, how to write info to 2 separate

I'm trying log to different StringIOs. I would've expected that each logger would write to each StringIO that was instantiated and given to. But that's not working, only the first StringIO stores the logged info. Any suggestions on what I'm missing?

    import logging
    from StringIO import StringIO
    formatter = logging.Formatter('%(asctime)s %(name)-3s %(levelname)-4s %(message)s')

    log_stream1 = StringIO()
    log1 = logging.getLogger('a')
    log1.setLevel(logging.DEBUG)
    stream_handler1 = logging.StreamHandler(log_stream1)
    stream_handler1.setLevel(logging.INFO)
    stream_handler1.setFormatter(formatter)
    log1.addHandler(stream_handler1)

    log_stream2 = StringIO()
    log2 = logging.getLogger('b')
    log2.setLevel(logging.DEBUG)
    stream_handler2 = logging.StreamHandler(log_stream2)
    stream_handler2.setLevel(logging.INFO)
    stream_handler2.setFormatter(formatter)
    log2.addHandler(stream_handler1)

    log1.info('log1')
    log2.info('log2')

output:

    In [6]: log_stream1.getvalue()
    Out[6]: '2017-06-08 10:05:12,468 a   INFO log1\n2017-06-08 10:05:12,468 b   INFO log2\n'

    In [7]: log_stream2.getvalue()
    Out[7]: ''

Upvotes: 1

Views: 88

Answers (2)

Szabolcs Dombi
Szabolcs Dombi

Reputation: 5783

Change

log2.addHandler(stream_handler1)

To

log2.addHandler(stream_handler2)

Entire code:

import logging
from StringIO import StringIO
formatter = logging.Formatter('%(asctime)s %(name)-3s %(levelname)-4s %(message)s')

log_stream1 = StringIO()
log1 = logging.getLogger('a')
log1.setLevel(logging.DEBUG)
stream_handler1 = logging.StreamHandler(log_stream1)
stream_handler1.setLevel(logging.INFO)
stream_handler1.setFormatter(formatter)
log1.addHandler(stream_handler1)

log_stream2 = StringIO()
log2 = logging.getLogger('b')
log2.setLevel(logging.DEBUG)
stream_handler2 = logging.StreamHandler(log_stream2)
stream_handler2.setLevel(logging.INFO)
stream_handler2.setFormatter(formatter)
log2.addHandler(stream_handler2)

log1.info('log1')
log2.info('log2')

Upvotes: 1

jhinghaus
jhinghaus

Reputation: 855

You wrote log2.addHandler(stream_handler1). You should write log2.addHandler(stream_handler2).

Upvotes: 0

Related Questions