//  ========================================================================
//  Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd.
//  ========================================================================
//  All rights reserved. This program and the accompanying materials
//  are made available under the terms of the Eclipse Public License v1.0
//  and Apache License v2.0 which accompanies this distribution.
//
//      The Eclipse Public License is available at
//      http://www.eclipse.org/legal/epl-v10.html
//
//      The Apache License v2.0 is available at
//      http://www.opensource.org/licenses/apache2.0.php
//
//  You may elect to redistribute this code under either of these licenses.
//  ========================================================================

[[default-logging-with-stderrlog]]
=== Default Logging with Jetty's StdErrLog

[[stderrlog-configuration]]
==== StdErrLog Configuration

If you do nothing to configure a separate logging framework, Jetty will default to using an internal `org.eclipse.jetty.util.log.StdErrLog` implementation.
This will output all logging events to STDERR (aka `System.err`).

Simply use Jetty and `StdErrLog` based logging is output.

Included in the Jetty distribution is a logging module that is capable of performing simple capturing of all STDOUT and STDERR output to a file that is rotated daily.

To enable on this feature via the command line:

[source,bash]
----
[my-base]$ java -jar /opt/jetty/start.jar --module=logging
----

You can also include the `--module=logging` command in your `${jetty.base}/start.ini`.

[source,bash]
----
[my-base]$ java -jar /opt/jetty/start.jar --add-to-start=logging
----

The default configuration for logging output will create a file `${jetty.logs}/yyyy_mm_dd.stderrout.log` which allows configuration of the output directory by setting the `jetty.logs` property.

For more advanced logging configurations, please consider use of a separate logging library.

[[stderr-properties]]
==== The jetty-logging.properties File
The recommended way to configure `StdErrLog` is to create a `${jetty.home}/resources/jetty-logging.properties` file, specify the log implementation to `StdErrLog` and then setup logging levels.

[source,properties]
----
# Configure Jetty for StdErrLog Logging
org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StrErrLog
# Overall Logging Level is INFO
org.eclipse.jetty.LEVEL=INFO
# Detail Logging for WebSocket
org.eclipse.jetty.websocket.LEVEL=DEBUG
----

There are a number of properties that can be defined in the configuration that will affect the behavior of `StdErrLog`.

`<name>.LEVEL=<level>`::
  Sets the logging level for all loggers within the `name` specified to the level, which can be (in increasing order of restriction) `ALL`, `DEBUG`, `INFO`, `WARN`, `OFF`.
  The name (or hierarchy) can be a specific fully qualified class or a package namespace.
  For example, `org.eclipse.jetty.http.LEVEL=DEBUG` is a package namespace approach to turn all loggers in the Jetty HTTP package to DEBUG level, and  `org.eclipse.jetty.io.ChanelEndPoint.LEVEL=ALL` turns on all logging events for the specific class, including `DEBUG`, `INFO`, `WARN` (and even special internally ignored exception classes).
  If more than one system property specifies a logging level, the most specific one applies.
`<name>.SOURCE=<boolean>`::
  Named Logger specific, attempts to print the Java source file name and line number from where the logging event originated.
  Name must be a fully qualified class name (this configurable does not support package name hierarchy).
  Default is false.
  Be aware that this is a slow operation and has an impact on performance.
`<name>.STACKS=<boolean>`::
  Named Logger specific, controls the display of stacktraces.
  Name must be a fully qualified class name (this configurable does not support package name hierarchy).
  Default is true.
`org.eclipse.jetty.util.log.stderr.SOURCE=<boolean>`::
  Special Global Configuration.
  Attempts to print the Java source file name and line number from where the logging event originated.
  Default is false.
`org.eclipse.jetty.util.log.stderr.LONG=<boolean>`::
  Special Global Configuration.
  When true, outputs logging events to `STDERR` using long form, fully qualified class names.
  When false, uses abbreviated package names.
  Default is false.
+
  * Example when set to false:
+
[source, screen, subs="{sub-order}"]
....
2014-06-03 14:36:16.013:INFO:oejs.Server:main: jetty-9.2.0.v20140526
2014-06-03 14:36:16.028:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:/opt/jetty/demo-base/webapps/] at interval 1
2014-06-03 14:36:16.051:INFO:oejsh.ContextHandler:main: Started o.e.j.s.h.MovedContextHandler@7d256e50{/oldContextPath,null,AVAILABLE}
2014-06-03 14:36:17.880:INFO:oejs.ServerConnector:main: Started ServerConnector@34f2d11a{HTTP/1.1}{0.0.0.0:8080}
2014-06-03 14:36:17.888:INFO:oejs.Server:main: Started @257ms
....
+
  * Example when set to true:
+
[source, screen, subs="{sub-order}"]
....
2014-06-03 14:38:19.019:INFO:org.eclipse.jetty.server.Server:main: jetty-9.2.0.v20140526
2014-06-03 14:38:19.032:INFO:org.eclipse.jetty.deploy.providers.ScanningAppProvider:main: Deployment monitor [file:/opt/jetty/demo-base/webapps/] at interval 1
2014-06-03 14:38:19.054:INFO:org.eclipse.jetty.server.handler.ContextHandler:main: Started o.e.j.s.h.MovedContextHandler@246d8660{/oldContextPath,null,AVAILABLE}
2014-06-03 14:38:20.715:INFO:org.eclipse.jetty.server.ServerConnector:main: Started ServerConnector@59f625be{HTTP/1.1}{0.0.0.0:8080}
2014-06-03 14:38:20.723:INFO:org.eclipse.jetty.server.Server:main: Started @243ms
....

[[deprecated-parameters]]
==== Deprecated Parameters

These parameters existed in prior versions of Jetty, and are no longer supported.
They are included here for historical (and search engine) reasons.

`org.eclipse.jetty.util.log.DEBUG`::
  Formerly used to enable DEBUG level logging on any logger used within Jetty (not just Jetty's own logger).
  * Replaced with using the logger implementation specific configuration and level filtering.
`org.eclipse.jetty.util.log.stderr.DEBUG`::
  Formerly used to enable DEBUG level logging on the internal Jetty `StdErrLog` implementation.
  * Replaced with level specific equivalent.
    Example: `org.eclipse.jetty.LEVEL=DEBUG`
`DEBUG`::
  Ancient debugging flag that turned on all debugging, even non-logging debugging.
  * Jetty no longer uses because many third party libraries employ this overly simple property name, which would generate far too much console output.
