Skip to content

Custom Colors ​

Logly provides a comprehensive color system supporting named colors, raw ANSI codes, 256-color values, RGB/hex colors, compound styles, background colors, and Rich-style markup tags.

Color Formats Supported ​

Named Colors ​

Standard ANSI color names:

python
from logly import logger

logger.level("AUDIT", no=35, color="red")
logger.level("METRIC", no=15, color="cyan")
logger.level("TRACE", no=5, color="dim")
logger.add("stderr", level="TRACE", colorize=True)
logger.log("AUDIT", "red audit message")
logger.log("METRIC", "cyan metric message")

Available named colors:

  • black, red, green, yellow, blue, magenta, cyan, white
  • bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white

Bright/High-Intensity Colors ​

Use bright variants for higher-contrast output:

python
from logly import logger

logger.level("TRACE", no=5, color="bright_black")
logger.level("DEBUG", no=10, color="bright_blue")
logger.level("INFO", no=20, color="bright_green")
logger.level("NOTICE", no=25, color="bright_cyan")
logger.level("SUCCESS", no=30, color="bright_green")
logger.level("WARNING", no=40, color="bright_yellow")
logger.level("ERROR", no=50, color="bright_red")
logger.level("FAIL", no=55, color="bright_magenta")
logger.level("CRITICAL", no=60, color="bright_white")
logger.add("stderr", level="TRACE", colorize=True)
logger.trace("dim trace")
logger.debug("bright blue debug")
logger.info("bright green info")
logger.error("bright red error")

Text Styles ​

Apply formatting styles to text:

python
from logly import logger

logger.level("TRACE", no=5, color="dim")
logger.level("DEBUG", no=10, color="bold")
logger.level("WARNING", no=40, color="underline")
logger.level("ERROR", no=50, color="italic")
logger.add("stderr", level="TRACE", colorize=True)
logger.trace("dimmed text")
logger.debug("bold text")
logger.warning("underlined text")
logger.error("italic text")

Available styles:

  • dim, bold, italic, underline, blink, reverse, strike

Compound Styles (Underscore-Separated) ​

Combine foreground color with style using underscore syntax:

python
from logly import logger

logger.level("TRACE", no=5, color="dim_cyan")
logger.level("DEBUG", no=10, color="bold_blue")
logger.level("INFO", no=20, color="bold_green")
logger.level("NOTICE", no=25, color="italic_cyan")
logger.level("SUCCESS", no=30, color="bold_green")
logger.level("WARNING", no=40, color="bold_yellow")
logger.level("ERROR", no=50, color="bold_red")
logger.level("FAIL", no=55, color="bold_magenta")
logger.level("CRITICAL", no=60, color="bold_white")
logger.add("stderr", level="TRACE", colorize=True)
logger.trace("dim cyan trace")
logger.debug("bold blue debug")
logger.error("bold red error")
logger.critical("bold white critical")

Compound Styles (Space-Separated) ​

Use space-separated tokens for more flexibility:

python
from logly import logger

logger.level("TRACE", no=5, color="dim cyan")
logger.level("DEBUG", no=10, color="bold blue")
logger.level("INFO", no=20, color="italic green")
logger.level("WARNING", no=40, color="underline yellow")
logger.level("ERROR", no=50, color="bold red")
logger.add("stderr", level="TRACE", colorize=True)
logger.trace("dim cyan trace")
logger.warning("underline yellow warning")

Background Colors ​

Add background colors with bg_ or on_ prefix:

python
from logly import logger

logger.level("INFO", no=20, color="bg_blue")
logger.level("WARNING", no=40, color="on_yellow")
logger.level("ERROR", no=50, color="bg_red")
logger.add("stderr", level="TRACE", colorize=True)
logger.info("blue background")
logger.warning("yellow background")
logger.error("red background")

Background color prefixes:

  • bg_red, bg_green, bg_blue, etc.
  • on_red, on_green, on_blue, etc.
  • bg_bright_red, on_bright_cyan, etc.

Compound Styles with Background ​

Combine foreground, style, and background:

python
from logly import logger

logger.level("INFO", no=20, color="bold green on black")
logger.level("WARNING", no=40, color="bold yellow on blue")
logger.level("ERROR", no=50, color="bold red on white")
logger.add("stderr", level="TRACE", colorize=True)
logger.info("bold green on black")
logger.warning("bold yellow on blue")
logger.error("bold red on white")

Also works with on_ and bg_ as single tokens:

python
logger.level("INFO", no=20, color="bold green on_black")
logger.level("WARNING", no=40, color="bold yellow on_blue")

Raw ANSI SGR Codes ​

Pass raw SGR codes directly:

python
from logly import logger

logger.level("RAW_GREEN", no=27, color="1;32")
logger.level("RAW_RED", no=28, color="31")
logger.level("RAW_BOLD", no=29, color="1")
logger.add("stderr", level="TRACE", colorize=True)
logger.log("RAW_GREEN", "raw ANSI green")
logger.log("RAW_RED", "raw ANSI red")
logger.log("RAW_BOLD", "raw ANSI bold")

256-Color ​

Use 256-color palette values:

python
from logly import logger

logger.level("COLOR_208", no=33, color="color(208)")
logger.level("COLOR_196", no=34, color="color(196)")
logger.level("COLOR_82", no=35, color="color(82)")
logger.add("stderr", level="TRACE", colorize=True)
logger.log("COLOR_208", "orange (color 208)")
logger.log("COLOR_196", "bright red (color 196)")
logger.log("COLOR_82", "bright green (color 82)")

RGB Colors ​

Use RGB triplets for exact color control:

python
from logly import logger

logger.level("ORANGE", no=33, color="rgb(255, 128, 0)")
logger.level("PURPLE", no=34, color="rgb(128, 0, 255)")
logger.level("TEAL", no=35, color="rgb(0, 255, 255)")
logger.add("stderr", level="TRACE", colorize=True)
logger.log("ORANGE", "exact orange RGB")
logger.log("PURPLE", "exact purple RGB")
logger.log("TEAL", "exact teal RGB")

Hex Colors ​

Use hex color codes:

python
from logly import logger

logger.level("CORAL", no=33, color="#ff7f50")
logger.level("LAVENDER", no=34, color="#e6e6fa")
logger.level("GOLD", no=35, color="#ffd700")
logger.add("stderr", level="TRACE", colorize=True)
logger.log("CORAL", "coral hex color")
logger.log("LAVENDER", "lavender hex color")
logger.log("GOLD", "gold hex color")

Background RGB and Hex ​

Apply background colors using RGB or hex:

python
from logly import logger

logger.level("INFO", no=20, color="bg_rgb(0, 0, 128)")
logger.level("WARNING", no=40, color="bg#ffff00")
logger.level("ERROR", no=50, color="on_rgb(255, 0, 0)")
logger.add("stderr", level="TRACE", colorize=True)
logger.info("navy background")
logger.warning("yellow background")
logger.error("red background")

Background 256-Color ​

Use 256-color palette for backgrounds:

python
from logly import logger

logger.level("INFO", no=20, color="bg_color(196)")
logger.level("WARNING", no=40, color="bgcolor(226)")
logger.add("stderr", level="TRACE", colorize=True)
logger.info("red background (256-color)")
logger.warning("yellow background (256-color)")

Color Disabling ​

Global Color Disable ​

Disable colors globally for a sink:

python
from logly import logger

sink_id = logger.add(
    "no-color.log",
    format="{level} | {message}",
    colorize=False,  # explicitly disable colors
)
logger.error("No ANSI codes in output")
logger.complete()
logger.remove(sink_id)

Per-Sink Color Control ​

Different sinks can have different color settings:

python
from logly import logger

# Console gets colors
logger.add("stderr", colorize=True)

# File gets no colors
logger.add("app.log", colorize=False)

# Another file gets colors
logger.add("colored.log", colorize=True)

logger.error("This message goes to all three sinks")
logger.complete()

Auto-Detection ​

When colorize=None (default), colors auto-detect based on sink type:

python
from logly import logger

# Auto-detect: stderr/stdout get colors if TTY, files don't
logger.add("stderr")  # colorize=None (auto)
logger.add("app.log")  # colorize=None (auto, off for files)

Rich-Style Markup in Format Strings ​

Use <tag> syntax in format strings for inline coloring:

python
from logly import logger

sink_id = logger.add(
    "stderr",
    format="<green>{time:HH:mm:ss}</green> | <level>{level:<8}</level> | <cyan>{message}</cyan>",
    colorize=True,
)
logger.info("<bold>Important</bold> message with <green>colors</green>")
logger.complete()
logger.remove(sink_id)

Supported Rich-style tags:

  • Colors: <red>, <green>, <blue>, <yellow>, <cyan>, <magenta>, <white>, <black>
  • Bright: <bright_red>, <bright_green>, <bright_blue>, etc.
  • Styles: <bold>, <dim>, <italic>, <underline>, <strike>, <reverse>, <blink>
  • Background: <bg_red>, <bg_green>, <bg_blue>, etc.

Stripping Tags When Colors Disabled ​

When colorize=False, Rich-style tags are automatically stripped:

python
from logly import logger

sink_id = logger.add(
    "plain.log",
    format="<green>{time:HH:mm:ss}</green> | <level>{level:<8}</level>",
    colorize=False,  # tags stripped, no ANSI codes
)
logger.info("<bold>This renders as plain text</bold>")
logger.complete()
logger.remove(sink_id)

Highlight and Underline ​

Highlight Text ​

Use reverse style for highlight effect:

python
from logly import logger

logger.level("HIGHLIGHT", no=35, color="reverse")
logger.add("stderr", level="TRACE", colorize=True)
logger.log("HIGHLIGHT", "highlighted text")

Or combine with colors:

python
from logly import logger

logger.level("HIGHLIGHT", no=35, color="bold reverse")
logger.add("stderr", level="TRACE", colorize=True)
logger.log("HIGHLIGHT", "bold highlighted text")

Underline Text ​

Use the underline style:

python
from logly import logger

logger.level("UNDERLINE", no=35, color="underline")
logger.add("stderr", level="TRACE", colorize=True)
logger.log("UNDERLINE", "underlined text")

Combine underline with colors:

python
from logly import logger

logger.level("UNDERLINE", no=35, color="underline red")
logger.add("stderr", level="TRACE", colorize=True)
logger.log("UNDERLINE", "underlined red text")

Using Rich-Style Tags ​

Use <underline> and <reverse> tags in format strings:

python
from logly import logger

sink_id = logger.add(
    "stderr",
    format="<underline>{level}</underline> | {message}",
    colorize=True,
)
logger.info("Underlined level name")
logger.complete()
logger.remove(sink_id)

Complete Color Example ​

python
from logly import logger

# Configure all built-in levels with custom colors
logger.level("TRACE", no=5, color="dim cyan")
logger.level("DEBUG", no=10, color="blue")
logger.level("INFO", no=20, color="green")
logger.level("NOTICE", no=25, color="cyan")
logger.level("SUCCESS", no=30, color="bold green")
logger.level("WARNING", no=40, color="bold yellow")
logger.level("ERROR", no=50, color="bold red")
logger.level("FAIL", no=55, color="bold magenta")
logger.level("CRITICAL", no=60, color="bold red on white")
logger.level("FATAL", no=70, color="bold red on black")

# Register custom levels with colors
logger.level("AUDIT", no=35, color="rgb(255, 128, 0)")
logger.level("METRIC", no=15, color="color(208)")
logger.level("SECURITY", no=45, color="bold red")
logger.level("HIGHLIGHT", no=36, color="reverse")

# Add console sink with colors
logger.add("stderr", level="TRACE", colorize=True)

# Test all levels
logger.trace("trace message")
logger.debug("debug message")
logger.info("info message")
logger.notice("notice message")
logger.success("success message")
logger.log("AUDIT", "audit message")
logger.log("METRIC", "metric message")
logger.warning("warning message")
logger.error("error message")
logger.fail("fail message")
logger.log("SECURITY", "security message")
logger.log("HIGHLIGHT", "highlighted message")
logger.critical("critical message")
logger.fatal("fatal message")

logger.complete()

Released under the MIT License.