Skip to content

Instantly share code, notes, and snippets.

@jaketame
Created April 28, 2017 13:05
Show Gist options
  • Save jaketame/3ed43d1c52e9abccd742b1792c449079 to your computer and use it in GitHub Desktop.
Save jaketame/3ed43d1c52e9abccd742b1792c449079 to your computer and use it in GitHub Desktop.
Python subprocess logging to logger from stdout/stderr
#!/usr/local/bin/python3
import logging, select, subprocess
LOG_FILE = "test.log"
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO,filename=LOG_FILE,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
def logging_call(popenargs, **kwargs):
process = subprocess.Popen(popenargs, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
def check_io():
while True:
output = process.stdout.readline().decode()
if output:
logger.log(logging.INFO, output)
else:
break
# keep checking stdout/stderr until the child exits
while process.poll() is None:
check_io()
def main():
logging_call(["ls", "-l"])
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
logging.warning("Stopping...")
@ddelange
Copy link

ddelange commented Aug 13, 2023

Hi 👋

I've done a rewrite from scratch:

  • Using py 3.7+ text kwarg so it works on Windows special chars as well
  • Using two threads in order to handle stdout and stderr separately i.e. logging.INFO and logging.ERROR

https://gist.github.com/ddelange/6517e3267fb74eeee804e3b1490b1c1d

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment