= logging: Example That Sets Up Different Logging Levels
:author: Joel Tosi
:productName: WildFly
:productNameFull: WildFly Application Server
:jbossHomeName: WILDFLY_HOME
:productVersion: 12
:buildRequirements: Java 8.0 (Java SDK 1.8) or later and Maven 3.3.1 or later
include::../shared-doc/attributes.adoc[]

:level: Intermediate
:technologies: Logging
:source: {githubRepoUrl}

[abstract]
The `logging` quickstart demonstrates how to configure different logging levels in {productName}. It also includes an asynchronous logging example.

:standalone-server-type: default
:archiveType: war
:includes-cli-scripts:

== What is it?

The `logging` quickstart demonstrates how to set up and log different levels of information in {productNameFull}. An example of asynchronous logging is also included in the configuration examples.

This quickstart contains just one class file and one JSP file. When you access the application, it fires off the logging information.

To better visualize how the logging configuration works, you first deploy and access the application before configuring the logs and view the resulting log files. Then you configure the logs, redeploy and access the application, and look at the log files again to see the differences.

//*************************************************
// Add System Requirements
//*************************************************
// == System Requirements
include::../shared-doc/system-requirements.adoc[leveloffset=+1]

//*************************************************
// Add Use of JBoss Home Name
//*************************************************
// == Use of {jbossHomeName}
include::../shared-doc/use-of-jboss-home-name.adoc[leveloffset=+1]

//*************************************************
// Back up the server configuration files
//*************************************************
// == Back Up the {productName} Standalone Server Configuration
include::../shared-doc/back-up-server-standalone-configuration.adoc[leveloffset=+1]

//*************************************************
// Start the server with the default profile
//*************************************************
// == Start the {productName} Standalone Server
include::../shared-doc/start-the-standalone-server.adoc[leveloffset=+1]

//*************************************************
// Build and deploy the quickstart WAR
//*************************************************
// == Build and Deploy the Quickstart
include::../shared-doc/build-and-deploy-the-quickstart.adoc[leveloffset=+1]

[[access_the_application]]
== Access the Application

The application is running at the following URL: http://localhost:8080/{artifactId}/.

You will see the following message in the server console:

[source,options="nowrap"]
----
FATAL [org.jboss.as.quickstarts.logging.LoggingExample] (default task-1) THIS IS A FATAL MESSAGE
ERROR [org.jboss.as.quickstarts.logging.LoggingExample] (default task-1) THIS IS AN ERROR MESSAGE
WARN  [org.jboss.as.quickstarts.logging.LoggingExample] (default task-1) THIS IS A WARNING MESSAGE
INFO  [org.jboss.as.quickstarts.logging.LoggingExample] (default task-1) THIS IS AN INFO MESSAGE
ERROR [org.jboss.as.quickstarts.logging.LoggingExample] (default task-1) THIS IS AN ERROR MESSAGE
FATAL [org.jboss.as.quickstarts.logging.LoggingExample] (default task-1) THIS IS A FATAL MESSAGE
INFO  [org.jboss.as.quickstarts.logging.LoggingExample] (default task-1) THIS IS AN INFO MESSAGE
WARN  [org.jboss.as.quickstarts.logging.LoggingExample] (default task-1) THIS IS A WARNING MESSAGE
----

== Check the Server Logs

The log files are located in the `__{jbossHomeName}__/standalone/log` log directory. At this point you should see the following log files.

* `server.log` - This is the standard log produced by the application server. By default, it contains all the server log messages, including the server startup messages.
* `gc.log.0.current` - This garbage collection log is produced only if garbage collection is enabled on the server. It contains garbage collection activity that can be used for diagnostic purposes. This log can be ignored as it is not used in this quickstart.


== Configure the Server

Now you have deployed the quickstart with the default configuration, you run a management CLI script to configure the logging subsystem and review the differences in the resulting log files.

. Before you begin, make sure you do the following:

* xref:back_up_standalone_server_configuration[Back up the {productName} standalone server configuration] as described above.
* xref:start_the_eap_standalone_server[Start the {productName} server with the standalone default profile] as described above.


. Review the `configure-logging.cli` file in the root of this quickstart directory. This script configures the logging subsytem in the server configuration file. It configures the periodic rotating file handlers and the async handlers, creates the logger for our quickstart class and sets the level to TRACE, and assigns the async handlers for our quickstart class.
. Open a new terminal, navigate to the root directory of this quickstart, and run the following command, replacing `__{jbossHomeName}__` with the path to your server:
+
[source,subs="+quotes,attributes+",options="nowrap"]
----
$ __{jbossHomeName}__/bin/jboss-cli.sh --connect --file=configure-logging.cli
----
+
NOTE: For Windows, use the `__{jbossHomeName}__\bin\jboss-cli.bat` script.

+
You should see the following result when you run the script:
+
[source,options="nowrap"]
----
The batch executed successfully
----

== Review the Modified Server Configuration

After stopping the server, open the `__{jbossHomeName}__/standalone/configuration/standalone.xml` file and review the changes.

The following XML was added to the `logging` subsystem.

[source,xml,options="nowrap"]
----
<async-handler name="TRACE_QS_ASYNC">
    <level name="TRACE"/>
    <queue-length value="1024"/>
    <overflow-action value="block"/>
    <subhandlers>
        <handler name="FILE_QS_TRACE"/>
    </subhandlers>
</async-handler>
<async-handler name="DEBUG_QS_ASYNC">
    <level name="DEBUG"/>
    <queue-length value="1024"/>
    <overflow-action value="block"/>
    <subhandlers>
        <handler name="FILE_QS_DEBUG"/>
    </subhandlers>
</async-handler>
<async-handler name="INFO_QS_ASYNC">
    <level name="INFO"/>
    <queue-length value="1024"/>
    <overflow-action value="block"/>
    <subhandlers>
        <handler name="FILE_QS_INFO"/>
    </subhandlers>
</async-handler>
<async-handler name="WARN_QS_ASYNC">
    <level name="WARN"/>
    <queue-length value="1024"/>
    <overflow-action value="block"/>
    <subhandlers>
        <handler name="FILE_QS_WARN"/>
    </subhandlers>
</async-handler>
<async-handler name="ERROR_QS_ASYNC">
    <level name="ERROR"/>
    <queue-length value="1024"/>
    <overflow-action value="block"/>
    <subhandlers>
        <handler name="FILE_QS_ERROR"/>
    </subhandlers>
</async-handler>
<async-handler name="FATAL_QS_ASYNC">
    <level name="FATAL"/>
    <queue-length value="1024"/>
    <overflow-action value="block"/>
    <subhandlers>
        <handler name="FILE_QS_FATAL"/>
    </subhandlers>
</async-handler>
...
<periodic-rotating-file-handler name="FILE_QS_TRACE">
    <file relative-to="jboss.server.log.dir" path="quickstart.trace.log"/>
    <suffix value=".yyyy.MM.dd"/>
</periodic-rotating-file-handler>
<periodic-rotating-file-handler name="FILE_QS_DEBUG">
    <file relative-to="jboss.server.log.dir" path="quickstart.debug.log"/>
    <suffix value=".yyyy.MM.dd"/>
</periodic-rotating-file-handler>
<periodic-rotating-file-handler name="FILE_QS_INFO">
    <file relative-to="jboss.server.log.dir" path="quickstart.info.log"/>
    <suffix value=".yyyy.MM.dd"/>
</periodic-rotating-file-handler>
<periodic-rotating-file-handler name="FILE_QS_WARN">
    <file relative-to="jboss.server.log.dir" path="quickstart.warn.log"/>
    <suffix value=".yyyy.MM.dd"/>
</periodic-rotating-file-handler>
<periodic-rotating-file-handler name="FILE_QS_ERROR">
    <file relative-to="jboss.server.log.dir" path="quickstart.error.log"/>
    <suffix value=".yyyy.MM.dd"/>
</periodic-rotating-file-handler>
<periodic-rotating-file-handler name="FILE_QS_FATAL">
    <file relative-to="jboss.server.log.dir" path="quickstart.fatal.log"/>
    <suffix value=".yyyy.MM.dd"/>
</periodic-rotating-file-handler>
...
<logger category="org.jboss.as.quickstarts.logging">
    <level name="TRACE"/>
    <handlers>
        <handler name="TRACE_QS_ASYNC"/>
        <handler name="DEBUG_QS_ASYNC"/>
        <handler name="INFO_QS_ASYNC"/>
        <handler name="WARN_QS_ASYNC"/>
        <handler name="ERROR_QS_ASYNC"/>
        <handler name="FATAL_QS_ASYNC"/>
    </handlers>
</logger>
----

== Test the New Logging Configuration

. Make sure you xref:start_the_eap_standalone_server[start the {productName} server with the standalone default profile] as described above.
. xref:build_and_deploy_the_quickstart[Build and deploy the quickstart].
. xref:access_the_application[Access the application].

== Recheck the Server Logs

The log files are located in the `__{jbossHomeName}__/standalone/log` log directory. You should now see the 6 additional log files that are produced by this quickstart. They are listed below in hierarchical order from the largest file containing the most messages to the smallest file containing the least messages.

** `quickstart.trace.log`
** `quickstart.debug.log`
** `quickstart.info.log`
** `quickstart.warn.log`
** `quickstart.error.log`
** `quickstart.fatal.log`

The following describes what happens when you access this quickstart:

. The application class file fires off logs of the various types (INFO, DEBUG, TRACE, WARN, ERROR, FATAL). Each log message goes to a different file, as defined in the `standalone.xml` file. Also notice in the `standalone.xml` that the application package defines its own log level.
. The class file demonstrates the usage of _log guards_. _Log guards_ are a development best practice. Simply put, instead of just writing out logs, we wrap the log writes in a check for that log level being enabled. While this may seem like overhead, that boolean check is more efficient than relying on the underlying framework to do the check at write time.
. Finally, the class file logs various levels, each to its own file as configured in `standalone.xml`. Note that log levels are hierarchical. When set, all log levels above the specified level are logged as well.
. Common uses of the 6 log levels are outlined below. You should use the level that makes the most sense in your environment.
+
[source,options="nowrap"]
----
FATAL - Used to track critical system failures.  When this log message is written, it is writing application error that has caused service to cease.  This is the most narrow logging.
ERROR - Used to track application errors that may cause one request to fail (not a service ceasement).
WARN - This is setting is used in most production environments.  At this level, all *WARN*, *ERROR*, and *FATAL* messages are written.  Use this level message  as a predictive measure for possible forthcoming issues.
INFO - Usually only used in a development environment.  This provides any information - state transition, object values, etc
DEBUG - Turned on in any environment when a problem is occuring.  The information captured may be throughput, communication, object values, etc.
TRACE - Turned on in any environment where you are trying to follow an execution path, for optimization or debugging.  This is the most broad logging level and all messages are written.
----

. To view log file differences for different logging levels, change the level for the "org.jboss.as.quickstarts.logging" logger
from TRACE to DEBUG, INFO, WARN, ERROR, or FATAL, then access the application.

//*************************************************
// Undeploy the quickstart archive
//*************************************************
// == Undeploy the Quickstart
include::../shared-doc/undeploy-the-quickstart.adoc[leveloffset=+1]


//************************************************************
// Restore the {productName} Standalone Server Configuration
//************************************************************
// == Restore the {productName} Standalone Server Configuration
:restoreScriptName: remove-logging.cli
include::../shared-doc/restore-standalone-server-configuration.adoc[leveloffset=+1]

// Additional information about this script
This script removes the log and file handlers from the `logging` subsystem in the server configuration. You should see the following result when you run the script:

[source,options="nowrap"]
----
The batch executed successfully
----

//******************************************************
// Restore the standalone server configuration manually
//******************************************************
// == Restore the {productName} Standalone Server Configuration Manually
include::../shared-doc/restore-standalone-server-configuration-manual.adoc[leveloffset=+2]


//*************************************************
// Add JBoss Developer Studio instructions
//*************************************************
// == Run the Quickstart in Red Hat JBoss Developer Studio or Eclipse
include::../shared-doc/run-the-quickstart-in-jboss-developer-studio.adoc[leveloffset=+1]

// Additional JBoss Developer Studio instructions
* Make sure you configure {productName} server logging as described above under xref:configure_the_server[Configure the Server]. Stop the server at the end of that step.
* Make sure you xref:remove_the_logging_configuration[Remove the Logging Configuration] when you have completed testing this quickstart.

//*************************************************
// Add info to debug the application
//*************************************************
// == Debug the Application
include::../shared-doc/debug-the-application.adoc[leveloffset=+1]
