Python, logging print statements while having them print to stdout

后端 未结 5 1171
暖寄归人
暖寄归人 2020-12-28 11:33

I have a long python script that uses print statements often, I was wondering if it was possible to add some code that would log all of the print statements into a text file

相关标签:
5条回答
  • 2020-12-28 11:56

    hm... is it hard to implement your own print() function and decorator that will log anything that is passed to your print function?

    def logger(func):
        def inner(*args, **kwargs):
            log(*args, **kwargs)  # your logging logic
            return func(*args, **kwargs)
        return inner
    
    @logger
    def lprint(string_to_print):
        print(string_to_print)   
    
    0 讨论(0)
  • 2020-12-28 11:58

    If you use the built in logging module you can configure your loggers with as many outputs as you need: to file, to databases, to emails, etc. However it sounds like you're mixing print for two different uses: logging (recording program flow for later inspection) and prompts. The real work will be to split out those two uses of 'print' into different functions so you get what you need in each place.

    A lot of people replace python's generic sys.stdout and sys.stderr to automatically do stuff to text which is being sent to the console. The real console output always lives in sys.__stdout__ and sys.__stderr__ (so you don't need to worry about somehow 'losing' it) but if you stick any object with the same methods as a file into the variables sys.stdout and sys.stderr you can do whatever you like with the output process.

    0 讨论(0)
  • 2020-12-28 12:05

    You can add this to your script:

    import sys
    sys.stdout = open('logfile', 'w')
    

    This will make the print statements write to logfile.

    If you want the option of printing to stdout and a file, you can try this:

    class Tee(object):
        def __init__(self, *files):
            self.files = files
        def write(self, obj):
            for f in self.files:
                f.write(obj)
    
    f = open('logfile', 'w')
    backup = sys.stdout
    sys.stdout = Tee(sys.stdout, f)
    
    print "hello world"  # this should appear in stdout and in file
    

    To revert to just printing to console, just restore the "backup"

    sys.stdout = backup
    
    0 讨论(0)
  • 2020-12-28 12:08

    Here is a program that does what you describe:

    #! /usr/bin/python3
    
    class Tee:
        def write(self, *args, **kwargs):
            self.out1.write(*args, **kwargs)
            self.out2.write(*args, **kwargs)
        def __init__(self, out1, out2):
            self.out1 = out1
            self.out2 = out2
    
    import sys
    sys.stdout = Tee(open("/tmp/log.txt", "w"), sys.stdout)
    
    print("hello")
    
    0 讨论(0)
  • 2020-12-28 12:10

    When trying the best answer accepted on python 3.7 I had the following exception:

        Exception ignored in: <__main__.Logger object at 0x7f04083760f0>
        AttributeError: 'Logger' object has no attribute 'flush'
    

    I added the following function to make it work:

        def flush(self):
            pass
    
    0 讨论(0)
提交回复
热议问题