| // ======================================================================== |
| // 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. |
| // ======================================================================== |
| |
| [[example-logging-java-util-logging]] |
| === Example: Logging with Java's java.util.logging via Slf4j |
| |
| It is possible to have the Jetty Server logging configured so that `java.util.logging` controls the output of logging events produced by Jetty. |
| |
| This example demonstrates how to configuring Jetty for logging to `java.util.logging` via http://slf4j.org/manual.html[Slf4j] and the http://slf4j.org/manual.html#swapping[Slf4j binding layer for java.util.logging]. |
| If you want to use the built-in native `JavaUtilLog` implementation, see #example-logging-java-util-logging-native . |
| |
| A convenient replacement `logging` module has been created to bootstrap your `${jetty.base}` directory for logging with `java.util.logging`. |
| |
| [source, screen, subs="{sub-order}"] |
| .... |
| [mybase]$ mkdir modules |
| [mybase]$ cd modules |
| |
| [modules]$ curl -O https://raw.githubusercontent.com/jetty-project/logging-modules/master/java.util.logging-slf4j/logging.mod |
| % Total % Received % Xferd Average Speed Time Time Time Current |
| Dload Upload Total Spent Left Speed |
| 100 826 100 826 0 0 2468 0 --:--:-- --:--:-- --:--:-- 2473 |
| [modules]$ cd .. |
| |
| [mybase]$ java -jar /opt/jetty-dist/start.jar --add-to-start=logging |
| INFO: logging initialised in ${jetty.base}/start.ini (appended) |
| MKDIR: ${jetty.base}/logs |
| DOWNLOAD: http://central.maven.org/maven2/org/slf4j/slf4j-jdk14/1.6.6/slf4j-jdk14-1.6.6.jar to lib/logging/slf4j-jdk14-1.6.6.jar |
| DOWNLOAD: http://central.maven.org/maven2/org/slf4j/slf4j-api/1.6.6/slf4j-api-1.6.6.jar to lib/logging/slf4j-api-1.6.6.jar |
| DOWNLOAD: https://raw.githubusercontent.com/jetty-project/logging-modules/master/java.util.logging-slf4j/jetty-logging.xml to etc/jetty-logging.xml |
| DOWNLOAD: https://raw.githubusercontent.com/jetty-project/logging-modules/master/java.util.logging-slf4j/logging.properties to resources/logging.properties |
| DOWNLOAD: https://raw.githubusercontent.com/jetty-project/logging-modules/master/java.util.logging-slf4j/jetty-logging.properties to resources/jetty-logging.properties |
| INFO: resources initialised transitively |
| INFO: resources enabled in ${jetty.base}/start.ini |
| |
| [mybase]$ java -jar /opt/jetty-dist/start.jar |
| .... |
| |
| The replacement `logging.mod` performs a number of tasks. |
| |
| . `mybase` is a `${jetty.base}` directory |
| . The jetty-distribution is unpacked (and untouched) into `/opt/jetty-dist/` and becomes the `${jetty.home}` directory for this demonstration. |
| . The `curl` command downloads the replacement `logging.mod` and puts it into the `${jetty.base}/modules/` directory for use by `mybase` only. |
| . The `start.jar --add-to-start=logging` command performs a number of steps to make the logging module available to the `${jetty.base}` configuration. |
| .. The `--module=logging` command is added to the `${jetty.base}/start.ini` configuration. |
| .. Required `${jetty.base}` directories are created: `${jetty.base}/logs` and `${jetty.base}/resources`. |
| .. Required libraries are downloaded (if not present already): slf4j-api, and slf4j-jdk14. |
| * The libraries are put in the `${jetty.base}/lib/logging/` directory. |
| .. Required configuration files are downloaded (if not present already): `jetty-logging.properties`, and `logging.properties`. |
| * The configuration files are put in the `${jetty.base}/resources/` directory. |
| .. Required `java.util.logging` initialization commands are downloaded (if not present already): `jetty-logging.xml`. |
| * The xml file is put in the `${jetty.base}/etc/` directory. |
| |
| At this point the Jetty `mybase` is configured so that the Jetty server itself will log using `java.util.logging`, using the `java.util.logging` configuration found in `mybase/resources/logging.properties`. |
| |
| The server classpath can be verified by using the `start.jar --list-config` command. |
| |
| In essence, Jetty is now configured to emit its own logging events to slf4j, and slf4j itself is using the static log binder found in `slf4j-jdk14.jar`, making all Jetty + Slf4j + `java.util.logging` events emitted by the Jetty server go to `java.util.logging` for routing (to console, file, etc...). |
| |
| If there any custom `java.util.logging` handlers to be used, put the implementation jar in the `${jetty.base}/lib/logging/` directory and reference them in the `${jetty.base}/resources/logging.properties` file. |
| |
| ____ |
| [NOTE] |
| `java.util.logging` is configured via the `${jetty.base}/resources/logging.properties` file during a valid startup of Jetty. |
| |
| This means that if there is any startup errors that occur before `java.util.logging` is configured, they will likely be lost and/or not routed through your configuration. |
| |
| Other logging frameworks are more reliable in that they always initialize and configure on first use, unlike `java.util.logging`. |
| |
| * While it is possible to configure `java.util.logging` sooner, even at JVM startup, the example demonstrated here does not show this technique. |
| For more information consult the official `java.util.logging.LogManager` javadoc http://docs.oracle.com/javase/7/docs/api/java/util/logging/LogManager.html[documentation from Oracle]. |
| ____ |