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:
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,whitebright_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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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
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()