Skip to main content

Beautiful & Simple Python Logger with Multi-threaded Multi-line Dynamic Logging Support

Project description

LogMagix-Yuge

Beautiful & Simple Python Logger with Multi-threaded Multi-line Dynamic Logging Support

🚀 Quick Start

from logmagix import Logger, LogLevel

# Choose your logging style (1 = ColorLogger, 2 = SimpleLogger)
log = Logger(
    style=1,  # Default colorful style
    prefix="MyApp",
    github_repository="https://github.com/sexfrance/logmagix",
    level=LogLevel.DEBUG,
    log_file="logs/app.log"  # Optional log file
)

# Basic logging
log.info("Hello World!")
log.success("Operation completed!")
log.warning("Something might be wrong")
log.error("An error occurred")
log.critical("Fatal error", exit_code=1)

🔥 Features

  • Multi-threaded Multi-line Dynamic Logging - NEW in v3.0! Display multiple threads' progress simultaneously
  • Log messages for various levels: success, warning, failure, debug, critical, info, and more
  • Color customization using ANSI escape sequences
  • Time-stamped log messages for better tracking
  • Built-in animated loader for visually appealing loading spinners
  • Thread-safe operations with automatic slot management
  • Auto-expand slots and queue waiting for overflow handling
  • Graceful fallback for non-TTY environments
  • Log saving to file with optional log file paths
  • Customizable log and loader prefixes
  • ASCII art display for personalized greetings, system info, and branding
  • Simple and flexible API with multiple ways to use the Loader class
  • Customizable text alignment for the Home ASCII art display

⚙️ Installation

To install the package locally, clone the repository and run:

pip install .

You can also install it via pip from PyPI:

pip install logmagix-yuge

🔧 Usage

Importing the Package

from logmagix import Logger, Loader, Home

Logging

Initialize the Logger class to log messages with different levels:

log = Logger()

# Success message
log.success("Operation completed successfully!")

# Failure message
log.failure("Something went wrong!")

# Warning message
log.warning("This is a warning!")

# Informational message
log.info("Informational log message")

# Debug message
log.debug("Debugging log message")

# Critical message (also terminates the program with optional exit code)
log.critical("Critical failure encountered", exit_code=1)

Log Levels

LogMagix provides several logging levels to help categorize the severity and type of log messages. You can configure the minimum log level to display based on your requirements:

  • DEBUG: For detailed debug messages.
  • INFO: For informational messages.
  • WARNING: For warning messages.
  • SUCCESS: For successful operations.
  • FAILURE: For non-critical errors.
  • CRITICAL: For critical errors; may terminate the program.

You can set the minimum logging level on initialization by passing a LogLevel value to the Logger constructor. For example:

from logmagix import Logger, LogLevel

log = Logger(level=LogLevel.WARNING)

With this setting, only WARNING, SUCCESS, FAILURE, and CRITICAL messages will display.

🎨 Logging Styles

LogMagix offers two distinct logging styles:

Style 1: ColorLogger (Default)

log = Logger(style=1)  # or just Logger()

Features colorful, detailed output with customizable prefixes and ANSI color formatting.

Style 2: SimpleLogger

log = Logger(style=2)

Provides a minimalist, clean output format with basic color coding.

Style Comparison

# Style 1 (ColorLogger)
log1 = Logger(prefix="ColorLogger")
log1.success("Operation successful!")
# Output: [ColorLogger] [12:34:56] [Success] -> Operation successful!

# Style 2 (SimpleLogger)
log2 = Logger(style=2, prefix="SimpleLogger")
log2.success("Operation successful!")
# Output: 12:34:56 » SUCCESS ➔ Operation successful!

Log File Saving

You can specify a log file path to save logs to a file for further review or debugging. The logger will automatically strip ANSI color codes from messages saved to the log file for readability. Log files are appended with each new logging session.

log = Logger(log_file="logs/app.log")
log.success("This message will also be saved to app.log")

To view logs saved to the file, open the specified path and review the recorded entries, which include timestamped log messages for tracking system state over time.

🚀 Multi-threaded Multi-line Dynamic Logging (NEW in v3.0!)

The MultiLineLoader class allows you to display multiple threads' progress simultaneously, with each thread occupying its own line. Perfect for parallel task execution!

Basic Usage

from logmagix import MultiLineLoader
import threading
import time

# Method 1: Context Manager (Recommended)
with MultiLineLoader(slots=5, prefix="MyApp") as loader:
    def worker(task_name):
        handle = loader.reserve(task_name)
        handle.update("Initializing...")
        time.sleep(1)
        handle.update("Processing...")
        time.sleep(1)
        handle.done("Completed!")

    threads = []
    for i in range(5):
        t = threading.Thread(target=worker, args=(f"Task-{i+1}",))
        threads.append(t)
        t.start()

    for t in threads:
        t.join()

# Method 2: Manual Control
loader = MultiLineLoader(slots=3, auto_collapse=True).start()
handle = loader.reserve("Download")
handle.update("Downloading file...")
time.sleep(2)
handle.done("Download complete!")
loader.stop()

Features

  • Thread-Safe: All operations are protected with RLock and Condition
  • Dynamic Rendering: Real-time updates with ANSI cursor control
  • Auto-Expand: Automatically adds slots up to 80% of terminal height
  • Queue Waiting: Threads wait for free slots when all are occupied
  • Status Icons: ✓ (success), ✗ (failure), ⚠ (warning)
  • Auto-Collapse: Optional automatic collapse when all tasks complete
  • Graceful Fallback: Automatically switches to sequential logging in non-TTY environments

Handle Methods

handle = loader.reserve("TaskName")

# Update progress
handle.update("Processing step 1...")

# Mark as completed (green ✓)
handle.done("Task completed successfully!")

# Mark as failed (red ✗)
handle.fail("Task failed!")

# Mark with warning (yellow ⚠)
handle.warn("Task completed with warnings")

Configuration Options

loader = MultiLineLoader(
    slots=5,                    # Initial number of slots
    prefix="MyApp",             # Prefix for all lines
    refresh_rate=0.1,           # Refresh interval in seconds
    auto_collapse=False,        # Auto-collapse when all tasks complete
    auto_expand=True,           # Auto-expand slots when needed
    max_height_ratio=0.8,       # Max slots as ratio of terminal height
    logger=None                 # Optional Logger instance
)

🔄 Loading Animation

The Loader class now supports custom prefixes and can be used in two ways:

from logmagix import Loader
import time

# Method 1: Context Manager
with Loader(
    prefix="MyApp",
    desc="Processing...",
    end="Completed!",
    timeout=0.1
):
    time.sleep(2)  # Your task here

# Method 2: Manual Control
loader = Loader(
    prefix="MyApp",
    desc="Loading...",
    end="Done!",
    timeout=0.05
).start()
time.sleep(2)  # Your task here
loader.stop()

Custom Log and Loader Prefix

Both the Logger and Loader classes allow for customizing the prefix shown before each message:

Logger Prefix:

log = Logger(prefix=".myapp/logs")
log.success("This message has a custom log prefix!")

Loader Prefix:

loader = Loader(prefix=".myapp/loader", desc="Loading with a custom loader prefix...")
loader.start()
time.sleep(5)  # Simulate a task
loader.stop()

ASCII Art and Greeting (New Home Class)

The Home class lets you display customized ASCII art text along with system information, such as a welcome message, username, or credits.

Using the Home Class:

home_screen = Home(
    text="LogMagix",
    align="center",
    adinfo1="discord.cyberious.xyz",
    adinfo2="v1.0",
    credits="Developed by sexfrance",
    clear = False, # To clear the console, default is True
)

home_screen.display()

This will display the ASCII art version of "LogMagix" in the center of the terminal, along with optional adinfo1 and adinfo2 texts at the bottom. The terminal width is automatically detected to align the text properly.

Full Example

Here’s an example showing both logging, loader, and the new Home class functionality:

from logmagix import Logger, Home, Loader, LogLevel
import time
import uuid

# Test ColorLogger (Style 1 - Default)
log1 = Logger(
    prefix="ColorLogger",
    github_repository="https://github.com/sexfrance/LogMagix",
    level=LogLevel.DEBUG,
    log_file="logs/color.log"
)

start_time = time.time()
log1.success("We are running style 1!")
log1.warning("Watch out, something might happen!")
log1.failure("Critical error occurred!")
log1.info("System is working properly")
log1.debug(f"The system uuid is {uuid.getnode()}")
log1.message("Dad", f"How are you? I'm gonna come soon!", start=start_time, end=time.time())
log1.question("How old are you? ")

# Test SimpleLogger (Style 2)
log2 = Logger(
    style=2,
    prefix="SimpleLogger",
    level=LogLevel.INFO,
    log_file="logs/simple.log"
)

start_time = time.time()
log2.success("We are running style 2 !")
log2.info("System is working properly")
log2.error("Critical error occurred!")
log2.warning("Watch out, something might happen!")
log2.message("System is working properly")
log2.debug(f"The system uuid is {uuid.getnode()}")
log2.question("How old are you? ")

# Test loader with custom prefix and context manager
print("\nTesting Loader:")
with Loader(prefix="custom/loader/prefix", desc="Processing data..."):
    time.sleep(2)  # Simulate task

# Use loader with custom prefix and start/stop methods
loader = Loader(prefix="custom/loader/prefix", desc="Saving files...", end="Done !", timeout=0.05).start()
time.sleep(2)  # Simulate task
loader.stop()


# Display home screen
home_screen = Home(
    text="LogMagix",
    align="center",
    adinfo1="Test Suite",
    adinfo2="v1.0.0",
    credits="Testing Framework",
    clear=True
)
home_screen.display()

# Test critical error (commented out as it exits the program)
log1.critical("Critical error occurred!")

Customization in Home Class

  • text: The text to be displayed in ASCII art.
  • align: Align the ASCII art text to "left", "center", or "right" in the terminal.
  • adinfo1 and adinfo2: Additional information displayed below the ASCII art.
  • credits: Optional credits or user information.

📹 Preview

Preview

❗ Requirements

LogMagix requires:

  • colorama for cross-platform color support in the terminal.
  • pystyle for creating the colored text effects.

To install dependencies, run:

pip install colorama pystyle

©️ License

LogMagix is licensed under the MIT License. See the LICENSE file for more details.

🖥️ Contributing

Contributions are welcome! Feel free to fork the repository, make changes, and submit a pull request.

👤 Author

LogMagix is developed and maintained by sexfrance.

PyPI - Downloads

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

logmagix_yuge-3.0.0.tar.gz (21.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

logmagix_yuge-3.0.0-py3-none-any.whl (16.7 kB view details)

Uploaded Python 3

File details

Details for the file logmagix_yuge-3.0.0.tar.gz.

File metadata

  • Download URL: logmagix_yuge-3.0.0.tar.gz
  • Upload date:
  • Size: 21.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.11

File hashes

Hashes for logmagix_yuge-3.0.0.tar.gz
Algorithm Hash digest
SHA256 103b8a28a9344ced647ac85bf324a3ea4c3e318470cba32ab75a1cb8931a7600
MD5 24cc30e0e17c1f22d07d1281bc136341
BLAKE2b-256 a36f0d1318af3bab9f416beb7b9bf568e5308bb9a885f0a98ebde298403231f2

See more details on using hashes here.

File details

Details for the file logmagix_yuge-3.0.0-py3-none-any.whl.

File metadata

  • Download URL: logmagix_yuge-3.0.0-py3-none-any.whl
  • Upload date:
  • Size: 16.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.11

File hashes

Hashes for logmagix_yuge-3.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 102e3d402707681177c0035d211a1cc11da29d93bd8b6ae71a1711368cab2c2d
MD5 0eb2247cd6a13f58aed119488c9733b7
BLAKE2b-256 05996297892a4604f651a6e164e5d83304f337ed8e9d707657e8da6500e35e2f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page