Console output (ColoredFormatter):
- Level name is now wrapped in [LEVEL] and left-padded via _format_level.
- Timestamp and root-label segments are individually bracket-wrapped, keeping
plain-output layout consistent with coloured output.
- Separator between fields is colourised (colour code derived from level theme)
so the table structure remains readable.
- New include_milliseconds init flag controls whether a fractional-second suffix
is appended to the timestamp; _format_time respects it.
- _display_logger_name unchanged; _split_logger_name still decomposes dotted names
into root / detail parts.
File logging (AzLogsLogger):
- file_handlers dict introduced to cache one RotatingFileHandler per top-level
root module, preventing duplicate handlers when multiple sub-modules log to
the same file (_get_file_handler / _get_log_file / _root_module_name).
- File handler formatter upgraded from a bare logging.Formatter to ColoredFormatter
(colours off, milliseconds on, datefmt hard-coded to
'%Y-%m-%d %H:%M:%S') so file output carries the same column structure as
the console formatter.
- reset_loggers method properly removes and closes all handlers (StreamHandler
and RotatingFileHandler) from every configured logger before clearing
self.loggers and self.file_handlers, allowing _get_logger to be called again
with fresh settings.
- set_file_logging now delegates to reset_loggers instead of simply clearing
the loggers dict.
- Increment log_system version from 1.5.0 to 1.5.1 in all module docstrings
- Add # ruff: noqa: T201 to log_funcs.py and logger.py to suppress
ruff T201 (favored print() usage) warning in logging utility modules
- Bump version to 1.5.0 in config.py, log_funcs.py, and logger.py
- Add USE_COLORS = True to core/log_system/config.py
- Import USE_COLORS in log_funcs.py and pass it to the logger context as
use_colors, honouring AZLOGS_USE_COLORS env var when set
- Change logging stacklevel from 3 to 4 in all log helper functions
(create_module_logger, log_debug, log_info, log_warn, log_error) to
correctly attribute the caller location in stack output.
- Reduce level_field_width from 9 to 5 (e.g. ERROR→5 chars) and set
source_field_width to 0 so source column auto-sizes to its content.
- Add MESSAGE color (cyan) for log message highlighting in colored output.
- Extract four helper methods from ColoredFormatter.format:
_display_logger_name — strips the 'azlogs.' namespace prefix
_display_level_name — normalises WARNING → WARN for compact display
_format_time — builds HH:MM:SS.mmm timestamps
_color_level — applies bold+color to the level token
- Simplify format() to assemble [HH:MM:SS.mmm] LVL (logger:line): message
with the new helpers applied inline.
- Switch __init__.py to use create_module_logger(); remove inline logging.getLogger calls
- Rewrite log_funcs.py: introduce module-name normalization (_normalize_module_name/_normalize_module_path/_resolve_module_name), ModuleLogger class, and global log-level switching (set_global_level replaces per-module set_module_level)
- Enhance logger.py: show [name:lineno] in console prefix, sanitize log file names for safe filesystem paths, wrap RotatingFileHandler setup with OSError handling to fall back to console-only logging, pass stacklevel through log() and propagate kwargs to exception()
- Update web/log_system/logger.js: dispatch to level-specific console methods (debug/info/warn/error) via CONSOLE_METHODS map; replace truncated t/m/l/a localStorage schema with serializeLogEntry/deserializeLogEntry (backward-compatible with short keys); load saved logs on construction via loadLogs()
Bump logging version to 1.4.1 and improve module name detection by adding _find_project_root in log_funcs to locate the repository root (searches for a .git directory) and use its basename when LOG_MODULE_NAME is not set, with a fallback to the previous behavior. Also update the same version string in logger.py. Additionally, comment out two noisy debug log lines in core/scanner.py to reduce verbose output when directories are missing or after scanning.
Refactor AzLogsLogger instance methods (debug/info/warn/error/exception) and the module-level helper functions to call the central logger.log(...) with the appropriate LogLevel, and ensure exception() passes exc_info=True. Also add a standard library logger in core/log_system/log_funcs.py and emit an error if importing the custom logger fails to aid diagnosis.
Introduce a new logging subsystem under core/log_system (logger.py, config.py, log_funcs.py) implementing AzLogs (LogLevel enum, colored console output, optional file rotation) and a lightweight wrapper (log_debug/info/warn/error/exception) with safe fallback when AzLogs is unavailable. Integrate these log functions across many core modules (downloader, linker, matcher, scanner, workflow_analyzer, workflow_updater, sources and related files) and export logger and helper log functions from core.__init__. Replace several direct logging calls in linker with the new log_* helpers and update core.__init__ exports. Also include small code style and robustness tweaks (path/filename normalization, JSON/file handling, minor refactors and formatting fixes) to improve matching and model-list/popular lookups.