Python Simple Logging System Example

Build a small Python logging system that writes messages with timestamps and levels like INFO and ERROR. This example helps beginners understand how to record program activity in a simple, practical way.

If you want a quick working version first, use this:

from datetime import datetime


def log_message(level, message, filename="app.log"):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    line = f"[{timestamp}] {level}: {message}\n"

    with open(filename, "a", encoding="utf-8") as file:
        file.write(line)


log_message("INFO", "Program started")
log_message("ERROR", "Something went wrong")
print("Messages written to app.log")

This version appends log messages to a file so old messages are not erased.

What this example does

This script creates a very simple logging system.

It:

  • Creates a reusable function for writing log messages
  • Adds a timestamp to each message
  • Stores logs in a text file
  • Uses simple log levels such as INFO and ERROR

Here is the full example again:

from datetime import datetime


def log_message(level, message, filename="app.log"):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    line = f"[{timestamp}] {level}: {message}\n"

    with open(filename, "a", encoding="utf-8") as file:
        file.write(line)


log_message("INFO", "Program started")
log_message("INFO", "Loading user data")
log_message("ERROR", "Could not connect to server")

print("Messages written to app.log")

How it works

  • datetime.now() gets the current date and time
  • strftime("%Y-%m-%d %H:%M:%S") turns that date and time into readable text
  • The formatted log line is stored in line
  • open(filename, "a", encoding="utf-8") opens the file in append mode
  • file.write(line) adds the message to the file

If you are new to writing files, see how to write to a file in Python and how to append to a file in Python.

Why logging is useful

Logging helps you keep a record of what your program did.

This is useful because it:

  • Helps you see what your program did
  • Makes debugging easier
  • Lets you keep a record of errors
  • Is more useful than print() when you want saved output

For example, print() only shows text in the terminal while the program is running. A log file stays on your computer, so you can check it later.

Core parts of the script

These are the most important parts of the example:

  • datetime.now() gets the current date and time
  • strftime() formats the timestamp as readable text
  • open(filename, "a") opens the file in append mode
  • The log function keeps the code organized and reusable

The logging function

from datetime import datetime


def log_message(level, message, filename="app.log"):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    line = f"[{timestamp}] {level}: {message}\n"

    with open(filename, "a", encoding="utf-8") as file:
        file.write(line)

Key lines:

  • level is a label such as INFO or ERROR
  • message is the text you want to save
  • filename="app.log" gives the function a default log file name
  • \n adds a newline so each log entry appears on its own line

If you want to understand open() better, see Python open() function explained.

Step-by-step build order

A good way to build this script is:

  1. Import datetime
  2. Create a function that accepts a level and message
  3. Build the log line as a string
  4. Open the log file in append mode
  5. Write the line to the file
  6. Call the function with different message types

Here is the same process as code:

from datetime import datetime


def log_message(level, message, filename="app.log"):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    line = f"[{timestamp}] {level}: {message}\n"

    with open(filename, "a", encoding="utf-8") as file:
        file.write(line)


log_message("INFO", "Program started")
log_message("ERROR", "File not found")

This keeps the script simple and easy to reuse in other small programs.

Expected output in the log file

Lines are saved in app.log.

Each line includes:

  • Date
  • Time
  • Level
  • Message

Example:

[2026-04-22 10:30:15] INFO: Program started
[2026-04-22 10:30:16] ERROR: Something went wrong

To run the script:

python script.py

To check the log file on macOS or Linux:

cat app.log

To check the log file on Windows Command Prompt:

type app.log

To see the full path of the log file:

python -c "from pathlib import Path; print(Path('app.log').resolve())"

Easy ways to improve this example

Once the basic version works, you can extend it.

Easy improvements include:

  • Add more log levels such as WARNING or DEBUG
  • Print the message to the screen and save it to the file
  • Use a different file name for each day
  • Wrap risky code in try-except and log errors

Here is a slightly improved version that prints and logs at the same time:

from datetime import datetime


def log_message(level, message, filename="app.log"):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    line = f"[{timestamp}] {level}: {message}"

    print(line)

    with open(filename, "a", encoding="utf-8") as file:
        file.write(line + "\n")


log_message("INFO", "User opened the program")
log_message("WARNING", "Input was empty")
log_message("ERROR", "Could not save file")

If you want to handle errors while logging program problems, see how to handle exceptions in Python and the Python error handling example script.

Common mistakes

These are common reasons beginners think the script is not working:

  • Opening the file in write mode instead of append mode, which erases old logs
  • Forgetting the newline character so all logs appear on one line
  • Using a file path that does not exist
  • Misspelling the filename and checking the wrong file
  • Expecting logging to work without calling the function

Example of a common mistake

This version uses write mode:

with open("app.log", "w", encoding="utf-8") as file:
    file.write("This will replace the old file contents.\n")

Mode "w" creates a new file or overwrites an existing file.

If you want to keep old log entries, use "a" instead:

with open("app.log", "a", encoding="utf-8") as file:
    file.write("This will be added to the end of the file.\n")

For a broader introduction to files, see Python file handling basics: read and write.

FAQ

What is the difference between logging and print()?

print() shows output on the screen. Logging saves messages so you can review them later.

Why use append mode when opening the file?

Append mode adds new messages to the end of the file instead of deleting old ones.

Can I log errors only?

Yes. You can call the function only when an error happens, but logging normal steps can also help with debugging.

Do I need the logging module for this example?

No. This page shows a simple beginner-friendly version. The standard logging module is more powerful but more advanced.

See also

Try extending this script in one of your own projects by logging user actions, important steps, or errors.