Logback Logging

CAS does also support Logback as an alternative logging engine. At a high level, the Logback architecture is similar to that of Log4j where you have Logger, Appender and Layout components typically defined inside a logback.xml file.

Refer to the Logback documentation to learn more.

Configuration

Support is enabled by including the following dependency in the WAR overlay:

1
2
3
4
5
<dependency>
    <groupId>org.apereo.cas</groupId>
    <artifactId>cas-server-support-logback</artifactId>
    <version>${cas.version}</version>
</dependency>
1
implementation "org.apereo.cas:cas-server-support-logback:${project.'cas.version'}"
1
2
3
4
5
6
7
8
9
dependencyManagement {
    imports {
        mavenBom "org.apereo.cas:cas-server-support-bom:${project.'cas.version'}"
    }
}

dependencies {
    implementation "org.apereo.cas:cas-server-support-logback"
}
1
2
3
4
5
6
7
8
9
10
dependencies {
    /*
        The following platform references are included automatically and are listed for reference only.

        implementation enforcedPlatform("org.apereo.cas:cas-server-support-bom:${project.'cas.version'}")
        implementation platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
        
    */
    implementation "org.apereo.cas:cas-server-support-logback"
}

You must also make sure the following modules and dependencies are excluded from the WAR overlay:

1
2
3
4
5
6
7
8
9
10
configurations.all {
    exclude(group: "org.apache.logging.log4j", module: "log4j-api")
    exclude(group: "org.apache.logging.log4j", module: "log4j-jakarta-web")
    exclude(group: "org.apache.logging.log4j", module: "log4j-web")
    exclude(group: "org.apache.logging.log4j", module: "log4j-jcl")
    exclude(group: "org.apache.logging.log4j", module: "log4j-slf4j-impl")
    exclude(group: "org.apache.logging.log4j", module: "log4j-slf4j2-impl")
    
    exclude(group: "org.apereo.cas", module: "cas-server-core-logging")
}

A sample logback.xml file follows:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%white(%d{yyyy-MM-dd HH:mm:ss}) %highlight(%-5level) %cyan(%logger{15}) - %msg%n</Pattern>
        </layout>
    </appender>
    <logger name="org.apereo.cas" level="info" additivity="false">
        <appender-ref ref="console" />
    </logger>
    <root level="info">
        <appender-ref ref="console" />
    </root>
</configuration>
:warning: Be Careful

Sanitizing log data to remove sensitive ticket ids such as ticket-granting tickets or proxy-granting tickets is not handled by CAS when Logback is used. While this may be worked out in future releases, you should be extra careful to cleanse log data prior to sharing it with external systems such as Splunk or Syslog, etc.

The following settings and properties are available from the CAS configuration catalog:

logging.charset.consoleCharset to use for console output.
no default
Third party

Charset to use for console output.

Type
Charset
Default
none
logging.charset.fileCharset to use for file output.
no default
Third party

Charset to use for file output.

Type
Charset
Default
none
logging.configLocation of the logging configuration file.
no default
Third party

Location of the logging configuration file. For instance, `classpath:logback.xml` for Logback.

Type
String
Default
none
Defined by
LoggingApplicationListener
logging.console.enabledWhether to enable console-based logging.
no default
Third party

Whether to enable console-based logging.

Type
Boolean
Default
none
Defined by
LoggingApplicationListener
logging.exception-conversion-wordConversion word used when logging exceptions.
%wEx
Third party

Conversion word used when logging exceptions.

Type
String
Default
%wEx
Defined by
LoggingApplicationListener
logging.fileLog file name (for instance, `myapp.log`).
no default
Third partyDeprecated

Log file name (for instance, `myapp.log`). Names can be an exact location or relative to the current directory.

Type
String
Default
none
Deprecation
ERROR, replaced by logging.file.name
logging.file.clean-history-on-start
no default
Third partyDeprecated
Type
Boolean
Default
none
Deprecation
ERROR, replaced by logging.logback.rollingpolicy.clean-history-on-start
logging.file.max-history
no default
Third partyDeprecated
Type
Integer
Default
none
Deprecation
ERROR, replaced by logging.logback.rollingpolicy.max-history
logging.file.max-size
no default
Third partyDeprecated
Type
DataSize
Default
none
Deprecation
ERROR, replaced by logging.logback.rollingpolicy.max-file-size
logging.file.nameLog file name (for instance, `myapp.log`).
no default
Third party

Log file name (for instance, `myapp.log`). Names can be an exact location or relative to the current directory.

Type
String
Default
none
Defined by
LoggingApplicationListener
logging.file.pathLocation of the log file.
no default
Third party

Location of the log file. For instance, `/var/log`.

Type
String
Default
none
Defined by
LoggingApplicationListener
logging.file.total-size-cap
no default
Third partyDeprecated
Type
DataSize
Default
none
Deprecation
ERROR, replaced by logging.logback.rollingpolicy.total-size-cap
logging.groupLog groups to quickly change multiple loggers at the same time.
no default
Third party

Log groups to quickly change multiple loggers at the same time. For instance, `logging.group.db=org.hibernate,org.springframework.jdbc`.

Type
Map<String,List<String>>
Default
none
Defined by
LoggingApplicationListener
logging.include-application-groupWhether to include the application group in the logs.
true
Third party

Whether to include the application group in the logs.

Type
Boolean
Default
true
Defined by
LoggingApplicationListener
logging.include-application-nameWhether to include the application name in the logs.
true
Third party

Whether to include the application name in the logs.

Type
Boolean
Default
true
Defined by
LoggingApplicationListener
logging.levelLog levels severity mapping.
no default
Third party

Log levels severity mapping. For instance, `logging.level.org.springframework=DEBUG`.

Type
Map<String,String>
Default
none
Defined by
LoggingApplicationListener
logging.log4j2.config.overrideOverriding configuration files used to create a composite configuration.
no default
Third party

Overriding configuration files used to create a composite configuration. Can be prefixed with 'optional:' to only load the override if it exists.

Type
List<String>
Default
none
logging.log4j2.rollingpolicy.cronCron expression used when the strategy is 'cron'.
0 0 0 * * ?
Third party

Cron expression used when the strategy is 'cron'.

Type
String
Default
0 0 0 * * ?
Defined by
LoggingApplicationListener
logging.log4j2.rollingpolicy.file-name-patternPattern for rolled-over log file names.
${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
Third party

Pattern for rolled-over log file names.

Type
String
Default
${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
Defined by
LoggingApplicationListener
logging.log4j2.rollingpolicy.max-file-sizeMaximum log file size.
10MB
Third party

Maximum log file size.

Type
DataSize
Default
10MB
Defined by
LoggingApplicationListener
logging.log4j2.rollingpolicy.max-historyMaximum number of archive log files to keep.
7
Third party

Maximum number of archive log files to keep.

Type
Integer
Default
7
Defined by
LoggingApplicationListener
logging.log4j2.rollingpolicy.strategyRolling policy strategy.
size
Third party

Rolling policy strategy.

Type
RollingPolicyStrategy
Default
size
Defined by
LoggingApplicationListener
logging.log4j2.rollingpolicy.time-intervalTime based triggering interval when the strategy is 'time' or 'size-and-time'.
1
Third party

Time based triggering interval when the strategy is 'time' or 'size-and-time'.

Type
Integer
Default
1
Defined by
LoggingApplicationListener
logging.log4j2.rollingpolicy.time-modulateWhether to align the next rollover time to occur at the top of the interval when the strategy is time based.
false
Third party

Whether to align the next rollover time to occur at the top of the interval when the strategy is time based.

Type
Boolean
Default
false
Defined by
LoggingApplicationListener
logging.logback.rollingpolicy.clean-history-on-startWhether to clean the archive log files on startup.
false
Third party

Whether to clean the archive log files on startup.

Type
Boolean
Default
false
Defined by
LoggingApplicationListener
logging.logback.rollingpolicy.file-name-patternPattern for rolled-over log file names.
${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
Third party

Pattern for rolled-over log file names.

Type
String
Default
${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
Defined by
LoggingApplicationListener
logging.logback.rollingpolicy.max-file-sizeMaximum log file size.
10MB
Third party

Maximum log file size.

Type
DataSize
Default
10MB
Defined by
LoggingApplicationListener
logging.logback.rollingpolicy.max-historyMaximum number of archive log files to keep.
7
Third party

Maximum number of archive log files to keep.

Type
Integer
Default
7
Defined by
LoggingApplicationListener
logging.logback.rollingpolicy.total-size-capTotal size of log backups to be kept.
0B
Third party

Total size of log backups to be kept.

Type
DataSize
Default
0B
Defined by
LoggingApplicationListener
logging.pathLocation of the log file.
no default
Third partyDeprecated

Location of the log file. For instance, `/var/log`.

Type
String
Default
none
Deprecation
ERROR, replaced by logging.file.path
logging.pattern.consoleAppender pattern for output to the console.
no default
Third party

Appender pattern for output to the console. Its default value varies according to the logging system.

Type
String
Default
none
Defined by
LoggingApplicationListener
logging.pattern.correlationAppender pattern for log correlation.
no default
Third party

Appender pattern for log correlation. Its default value varies according to the logging system.

Type
String
Default
none
Defined by
LoggingApplicationListener
logging.pattern.dateformatAppender pattern for log date format.
yyyy-MM-dd'T'HH:mm:ss.SSSXXX
Third party

Appender pattern for log date format.

Type
String
Default
yyyy-MM-dd'T'HH:mm:ss.SSSXXX
Defined by
LoggingApplicationListener
logging.pattern.fileAppender pattern for output to a file.
no default
Third party

Appender pattern for output to a file. Its default value varies according to the logging system.

Type
String
Default
none
Defined by
LoggingApplicationListener
logging.pattern.levelAppender pattern for log level.
%5p
Third party

Appender pattern for log level.

Type
String
Default
%5p
Defined by
LoggingApplicationListener
logging.pattern.rolling-file-name
no default
Third partyDeprecated
Type
String
Default
none
Deprecation
ERROR, replaced by logging.logback.rollingpolicy.file-name-pattern
logging.register-shutdown-hookRegister a shutdown hook for the logging system when it is initialized.
true
Third party

Register a shutdown hook for the logging system when it is initialized. Disabled automatically when deployed as a war file.

Type
Boolean
Default
true
Defined by
LoggingApplicationListener
logging.structured.ecs.service.environmentStructured ECS service environment.
no default
Third party

Structured ECS service environment.

Type
String
Default
none
logging.structured.ecs.service.nameStructured ECS service name (defaults to 'spring.application.name').
no default
Third party

Structured ECS service name (defaults to 'spring.application.name').

Type
String
Default
none
logging.structured.ecs.service.node-nameStructured ECS service node name.
no default
Third party

Structured ECS service node name.

Type
String
Default
none
logging.structured.ecs.service.versionStructured ECS service version (defaults to 'spring.application.version').
no default
Third party

Structured ECS service version (defaults to 'spring.application.version').

Type
String
Default
none
logging.structured.format.consoleStructured logging format for output to the console.
no default
Third party

Structured logging format for output to the console. Must be either a format id or a fully qualified class name.

Type
String
Default
none
logging.structured.format.fileStructured logging format for output to a file.
no default
Third party

Structured logging format for output to a file. Must be either a format id or a fully qualified class name.

Type
String
Default
none
logging.structured.gelf.hostStructured GELF host (defaults to 'spring.application.name').
no default
Third party

Structured GELF host (defaults to 'spring.application.name').

Type
String
Default
none
logging.structured.gelf.service.versionStructured GELF service version (defaults to 'spring.application.version').
no default
Third party

Structured GELF service version (defaults to 'spring.application.version').

Type
String
Default
none
logging.structured.json.addAdditional members that should be added to structured logging JSON
no default
Third party

Additional members that should be added to structured logging JSON

Type
Map<String,String>
Default
none
logging.structured.json.context.includeWhether context data should be included in the JSON.
no default
Third party

Whether context data should be included in the JSON.

Type
Boolean
Default
none
logging.structured.json.context.prefixThe prefix to use when inserting context data.
no default
Third party

The prefix to use when inserting context data.

Type
String
Default
none
logging.structured.json.customizerFully qualified class names of StructuredLoggingJsonMembersCustomizer implementations
no default
Third party

Fully qualified class names of StructuredLoggingJsonMembersCustomizer implementations

Type
Set<Class<? extends StructuredLoggingJsonMembersCustomizer<?>>>
Default
none
logging.structured.json.excludeMember paths that should be excluded from structured logging JSON
no default
Third party

Member paths that should be excluded from structured logging JSON

Type
Set<String>
Default
none
logging.structured.json.includeMember paths that should be included in structured logging JSON
no default
Third party

Member paths that should be included in structured logging JSON

Type
Set<String>
Default
none
logging.structured.json.renameMapping between member paths and an alternative name that should be used in structured logging JSON
no default
Third party

Mapping between member paths and an alternative name that should be used in structured logging JSON

Type
Map<String,String>
Default
none
logging.structured.json.stacktrace.include-common-framesWhether common frames should be included.
no default
Third party

Whether common frames should be included.

Type
Boolean
Default
none
logging.structured.json.stacktrace.include-hashesWhether stack trace hashes should be included.
no default
Third party

Whether stack trace hashes should be included.

Type
Boolean
Default
none
logging.structured.json.stacktrace.max-lengthMaximum length to print.
no default
Third party

Maximum length to print.

Type
Integer
Default
none
logging.structured.json.stacktrace.max-throwable-depthMaximum throwable depth to print.
no default
Third party

Maximum throwable depth to print.

Type
Integer
Default
none
logging.structured.json.stacktrace.printerName of the printer to use.
no default
Third party

Name of the printer to use. Can be 'standard', 'logging-system', or the fully-qualified class name of a StackTracePrinter. When not specified 'logging-system' or 'standard' will be used depending if other properties are set.

Type
String
Default
none
logging.structured.json.stacktrace.rootRoot ordering (root first or root last).
no default
Third party

Root ordering (root first or root last).

Type
StructuredLoggingJsonProperties.StackTrace.Root
Default
none
logging.threshold.consoleLog level threshold for console output.
TRACE
Third party

Log level threshold for console output.

Type
String
Default
TRACE
logging.threshold.fileLog level threshold for file output.
TRACE
Third party

Log level threshold for file output.

Type
String
Default
TRACE

Required settings may be needed to activate or affect the feature; review them even when they have a default. Optional settings only need to be set to change a default or to turn on the behavior they control. Third party settings belong to libraries such as Spring Boot that CAS builds on; their own documentation may have more detail.

Notes on configuration

Configuration Metadata

The collection of configuration properties listed in this section are automatically generated from the CAS source and components that contain the actual field definitions, types, descriptions, modules, etc. This metadata may not always be 100% accurate, or could be lacking details and sufficient explanations.

Be Selective

This section is meant as a guide only. Do NOT copy/paste the entire collection of settings into your CAS configuration; rather pick only the properties that you need. Do NOT enable settings unless you are certain of their purpose and do NOT copy settings into your configuration only to keep them as reference. All these ideas lead to upgrade headaches, maintenance nightmares and premature aging.

YAGNI

Note that for nearly ALL use cases, declaring and configuring properties listed here is sufficient. You should NOT have to explicitly massage a CAS XML/Java/etc configuration file to design an authentication handler, create attribute release policies, etc. CAS at runtime will auto-configure all required changes for you. If you are unsure about the meaning of a given CAS setting, do NOT turn it on without hesitation. Review the codebase or better yet, ask questions to clarify the intended behavior.

Naming Convention

Property names can be specified in very relaxed terms. For instance cas.someProperty, cas.some-property, cas.some_property are all valid names. While all forms are accepted by CAS, there are certain components (in CAS and other frameworks used) whose activation at runtime is conditional on a property value, where this property is required to have been specified in CAS configuration using kebab case. This is both true for properties that are owned by CAS as well as those that might be presented to the system via an external library or framework such as Spring Boot, etc.

:information_source: Note

When possible, properties should be stored in lower-case kebab format, such as cas.property-name=value. The only possible exception to this rule is when naming actuator endpoints; The name of the actuator endpoints (i.e. ssoSessions) MUST remain in camelCase mode.

Settings and properties that are controlled by the CAS platform directly always begin with the prefix cas. All other settings are controlled and provided to CAS via other underlying frameworks and may have their own schemas and syntax. BE CAREFUL with the distinction. Unrecognized properties are rejected by CAS and/or frameworks upon which CAS depends. This means if you somehow misspell a property definition or fail to adhere to the dot-notation syntax and such, your setting is entirely refused by CAS and likely the feature it controls will never be activated in the way you intend.

Validation

Configuration properties are automatically validated on CAS startup to report issues with configuration binding, especially if defined CAS settings cannot be recognized or validated by the configuration schema. Additional validation processes are also handled via Configuration Metadata and property migrations applied automatically on startup by Spring Boot and family.

Indexed Settings

CAS settings able to accept multiple values are typically documented with an index, such as cas.some.setting[0]=value. The index [0] is meant to be incremented by the adopter to allow for distinct multiple configuration blocks.