π 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.β
Top comments (0)
Some comments may only be visible to logged-in visitors. Sign in to view all comments. Some comments have been hidden by the post's author - find out more