📌 Quick Info

  • Topic: Using Python's logging module instead of print()
  • Target Audience: Beginners who debug with print statements
  • Goal: Learn a proper tool that scales

1. Introduction

"For my first few weeks of Python, every bug got solved the same way: add a print statement, run the code, read the output, delete the print. It worked — until it didn't. Then I learned about logging."

2. The Problem with print()

def divide(a, b): print("Starting divide") print(f"a = {a}, b = {b}") result = a / b print(f"Result: {result}") return result 

Problems:

  • You have to delete it later — or leave messy output in production
  • No timestamps, no severity levels, no file output
  • You can't turn it off without editing code
  • Every debug session becomes a cleanup job

3. The Solution (Logging)

import logging logging.basicConfig(level=logging.INFO) def divide(a, b): logging.info("Starting divide") logging.debug(f"a = {a}, b = {b}") result = a / b logging.info(f"Result: {result}") return result 

Output:

INFO:root:Starting divide INFO:root:Result: 5.0 

Notice the debug line didn’t print- because the level is set to INFO. Debug messages are hidden by default.

4. The Five Log Levels

Level When to use
DEBUG Detailed info for diagnosing problem.
INFO Confirmation that things are working.
WARNING Something unexpected, but not breaking.
ERROR Something failed.
CRITICAL The Program cannot continue.

Set the level once, and all messages below it are hidden.

5. Real Example (Logging to a file)

import logging logging.basicConfig( filename="app.log", level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" ) logging.info("App started") logging.warning("Low disk space") logging.error("Could not connect to database") 

What’s in app.log:

2026-10-10 14:32:01,234 - INFO - App started 2026-10-10 14:32:01,235 - WARNING - Low disk space 2026-10-10 14:32:01,236 - ERROR - Could not connect to database 

Now you have timestamps, levels, and a permanent record.

6. Try/Except + Logging

The most useful combination:

import logging logging.basicConfig(level=logging.INFO) try: result = 10 / 0 except ZeroDivisionError: logging.exception("Division failed") 

logging.exception() automatically includes the full traceback. No more losing the error message.

7. What I learned

  • print() is for output. logging is for diagnostics. They're different tools.
  • Log levels let you control verbosity without changing code
  • logging.basicConfig() sets the format, level, and destination
  • logging.exception() captures tracebacks automatically
  • Log to a file for anything you want to keep

8. Common Beginner Mistakes

Mistake 1: Forgetting to set the level
Without level=logging.INFO, only warnings and above show up.

Mistake 2: Using print() and logging together
Pick one. Mixing them makes output hard to parse.

Mistake 3: Logging sensitive data
Never log passwords, tokens, or personal data — even at DEBUG level.

Mistake 4: Not using f-strings carefully

logging.debug(f"User: {user}") logging.debug("User: %s", user) 

9. Conclusion

"print() gets you through your first week. logging gets you through the next year. The switch takes 10 minutes, and you'll never go back.”