cui-logging
CUI logging standards with CuiLogger, LogRecord patterns, and DSL-style LogMessages classes
SKILL.mdmarketplace/bundles/pm-dev-java-cui/skills/cui-logging
GitHubCUI Logging Skill
REFERENCE MODE: This skill provides reference material. Load specific standards on-demand based on current task.
CUI-specific logging standards for projects using the CUI logging framework (cui-java-tools). This skill covers CuiLogger usage, LogRecord patterns, and DSL-style LogMessages classes.
Enforcement
Execution mode: Reference library; load standards progressively based on current logging task.
Prohibited actions:
- Do not use SLF4J or Log4j directly; all logging must use CuiLogger
- Do not use string literals for INFO/WARN/ERROR/FATAL; must use LogRecord constants
- Do not load all standards at once; load progressively based on current task
Constraints:
- Exception parameter must always come first in logging calls
- DEBUG/TRACE levels use direct logger (no LogRecord required)
- INFO and above must use LogRecord from a DSL-style LogMessages class
- All LogRecord usage must be covered by LogAsserts in tests
Prerequisites
This skill requires CUI library dependencies:
de.cuioss:cui-java-tools(CuiLogger, LogRecord)
Workflow
Step 1: Load Core Logging Standards
CRITICAL: Load these standards for any logging-related work.
Read: standards/logging-standards.md
This provides the foundational rules:
- MUST use
CuiLogger(SLF4J/Log4j FORBIDDEN) - MUST use
LogRecordfor INFO/WARN/ERROR/FATAL levels - Exception parameter MUST come first in all logging calls
Step 2: Load Additional Standards (As Needed)
DSL Constants Pattern (load when creating LogMessages classes):
Read: standards/dsl-constants.md
Use when: Implementing DSL-style LogMessages classes with nested static classes and @UtilityClass pattern.
LogMessages Documentation (load when documenting):
Read: standards/logmessages-documentation.md
Use when: Writing AsciiDoc documentation for LogMessages classes.
Logging Maintenance (load for migration/refactoring):
Read: standards/logging-maintenance-reference.md
Use when: Large-scale logger migration, LogRecord implementation, or maintenance work.
Key Rules Summary
CuiLogger Usage
// CORRECT
private static final CuiLogger LOGGER = new CuiLogger(MyClass.class);
// FORBIDDEN - Never use SLF4J or Log4j directly
private static final Logger LOGGER = LoggerFactory.getLogger(MyClass.class);
LogRecord for Structured Messages
// CORRECT - Use LogRecord for INFO and above
LOGGER.info(INFO.USER_LOGIN, username);
LOGGER.warn(WARN.RATE_LIMIT, resourceName);
LOGGER.error(exception, ERROR.OPERATION_FAILED);
// DEBUG/TRACE - Direct logging allowed (no LogRecord needed)
LOGGER.debug("Debug message: %s", value);
Exception Handling
// CORRECT - Exception FIRST
LOGGER.error(exception, ERROR.OPERATION_FAILED);
// WRONG - Exception position
LOGGER.error(ERROR.OPERATION_FAILED, exception);
Related Skills
pm-dev-java:java-core- General Java patterns (no CUI dependencies)pm-dev-java-cui:cui-testing- CUI test utilities including JUL testing with LogAsserts
Standards Reference
| Standard | Purpose |
|---|---|
| logging-standards.md | Core CuiLogger, LogRecord rules, and compliance verification |
| dsl-constants.md | DSL-style constant organization |
| logmessages-documentation.md | AsciiDoc documentation patterns |
| logging-maintenance-reference.md | Migration and maintenance |
Review Rules
The review rules of the java-cui domain — what a code review looks for in changed code that logs through the CUI logging framework. The block follows the harvestable block contract — see review-rubric.md § 10 "Harvestable review-rule blocks" for its rules, which are not restated here.
- A logging call that passes the exception after the message or
LogRecordinstead of first, so the exception is consumed as a format argument and its stack trace is never logged. - An INFO, WARN, ERROR or FATAL call that logs a string literal instead of a
LogRecordfrom a LogMessages class, so the message carries no identifier and cannot be asserted in a test or looked up in the documentation. - A
CuiLoggermessage that uses an SLF4J-style{}placeholder instead of%s, so the argument is never substituted and the logged line shows the literal braces. - Two
LogRecordconstants in one LogMessages class that share an identifier number, so the identifier no longer names exactly one message and a log search returns both. - A
LogRecordthe change adds or edits with noLogAssertscheck in a test, so a changed message text, level or identifier ships without any test turning red.