blob: e78e27de98e10121aa029aed286696872fc7db3c [file] [log] [blame]
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Centralized Logging using Logback</title><link rel="stylesheet" type="text/css" href="css/docbook.css"><meta name="generator" content="DocBook XSL Stylesheets V1.79.1"><meta name="keywords" content="jetty, servlet, servlet-api, cometd, http, websocket, eclipse, maven, java, server, software"><link rel="home" href="index.html" title="Jetty"><link rel="up" href="configuring-logging.html" title="Chapter&nbsp;11.&nbsp;Jetty Logging"><link rel="prev" href="configuring-logging-modules.html" title="Jetty Logging Integrations (SLF4J, Log4j, Logback, JCL, JUL)"><link rel="next" href="jetty-dump-tool.html" title="Jetty Dump Tool"><link xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times" rel="shortcut icon" href="images/favicon.ico"><link rel="stylesheet" href="css/highlighter/foundation.css"><script src="js/highlight.pack.js"></script><script>
hljs.initHighlightingOnLoad();
</script><link type="text/css" rel="stylesheet" href="css/font-awesome/font-awesome.min.css"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times"><tr><td style="width: 25%"><a href="http://www.eclipse.org/jetty"><img src="images/jetty-header-logo.png" alt="Jetty Logo"></a><br><span style="font-size: small">
Version: 9.4.30.v20200611</span></td><td style="width: 50%"></td></tr></table><div xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times" class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Centralized Logging using Logback</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="configuring-logging-modules.html"><i class="fa fa-chevron-left" aria-hidden="true"></i> Previous</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;11.&nbsp;Jetty Logging<br><a accesskey="p" href="index.html"><i class="fa fa-home" aria-hidden="true"></i> Home</a></th><td width="20%" align="right">&nbsp;<a accesskey="n" href="jetty-dump-tool.html">Next <i class="fa fa-chevron-right" aria-hidden="true"></i></a></td></tr></table><hr></div><div xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times" class="jetty-callout"><h5 class="callout"><a href="http://www.webtide.com/">Contact the core Jetty developers at
<span class="website">www.webtide.com</span></a></h5><p>
private support for your internal/customer projects ... custom extensions and distributions ... versioned snapshots for indefinite support ...
scalability guidance for your apps and Ajax/Comet projects ... development services for sponsored feature development
</p></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="example-logging-logback-centralized"></a>Centralized Logging using Logback</h2></div></div></div><p>The term <span class="emphasis"><em>Centralized Logging</em></span> refers to a forced logging configuration for the Jetty Server and all web applications that are deployed on the server.
It routes all logging events from the web applications to a single configuration on the Server side.</p><p>The example below shows how to accomplish this with Jetty and Slf4j, using <code class="literal">Logback</code> to manage the final writing of logs to disk.</p><div class="blockquote"><blockquote class="blockquote"><div xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times" class="important" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title"><i class="fa fa-plus" aria-hidden="true"></i> Important</h3><p>This mechanism forces all webapps to use the server&#8217;s configuration for logging, something that isn&#8217;t 100% appropriate for all webapps.
An example would be having Jenkins-CI deployed as an webapp, if you force its logging configuration to the server side, you lose the ability on <a class="link" href="http://jenkins-ci.org/" target="_top">Jenkins-CI</a> to see the logs from the various builds (as now those logs are actually going to the main server log).</p></div></blockquote></div><p>This configuration is essentially the multiple logger configuration with added configuration to the deployers to force a <code class="literal">WebAppClassLoader</code> change to use the server classpath over the webapps classpath for the logger specific classes.</p><p>The technique used by this configuration is to provide an <a class="link" href="http://www.eclipse.org/jetty/javadoc/9.4.30.v20200611org/eclipse/jetty/deploy/AppLifeCycle.Binding.html" target="_top">AppLifeCycle.Binding</a> against the <a class="link" href="http://www.eclipse.org/jetty/javadoc/9.4.30.v20200611/org/eclipse/jetty/deploy/AppLifeCycle.html" target="_top">`"deploying"`node</a> that modifies the
<a class="link" href="http://www.eclipse.org/jetty/javadoc/9.4.30.v20200611/org/eclipse/jetty/webapp/WebAppContext.html#getSystemClasspathPattern()" target="_top">WebAppContext.getSystemClasspathPattern().add(String)</a> for the common logging classes.
See <a class="link" href="https://github.com/jetty-project/jetty-webapp-logging/blob/master/jetty-webapp-logging/src/main/java/org/eclipse/jetty/webapp/logging/CentralizedWebAppLoggingBinding.java" target="_top">org.eclipse.jetty.logging.CentralizedWebAppLoggingBinding</a> for actual implementation.</p><p>A convenient replacement <code class="literal">logging</code> module has been created to bootstrap your <code class="literal">${jetty.base}</code> directory for capturing all Jetty server logging from multiple logging frameworks into a single logging output file managed by Logback.</p><div class="screenexample"><pre class="screen">[mybase]$ curl -O https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-webapp-logging/9.4.27/jetty-webapp-logging-9.4.27-config.jar
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 3402 100 3402 0 0 15823 0 --:--:-- --:--:-- --:--:-- 15750
[mybase]$ jar -xf jetty-webapp-logging-9.4.27-config.jar
[mybase]$ java -jar /opt/jetty-hom/start.jar --create-startd --add-to-start=centralized-webapp-logging
ALERT: There are enabled module(s) with licenses.
The following 2 module(s):
+ contains software not provided by the Eclipse Foundation!
+ contains software not covered by the Eclipse Public License!
+ has not been audited for compliance with its license
Module: logback-impl
+ Logback: the reliable, generic, fast and flexible logging framework.
+ Copyright (C) 1999-2012, QOS.ch. All rights reserved.
+ This program and the accompanying materials are dual-licensed under
+ either:
+ the terms of the Eclipse Public License v1.0
+ as published by the Eclipse Foundation:
+ http://www.eclipse.org/legal/epl-v10.html
+ or (per the licensee's choosing) under
+ the terms of the GNU Lesser General Public License version 2.1
+ as published by the Free Software Foundation:
+ http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
Module: slf4j-api
+ SLF4J is distributed under the MIT License.
+ Copyright (c) 2004-2013 QOS.ch
+ All rights reserved.
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Proceed (y/N)? y
INFO : slf4j-api transitively enabled
INFO : log4j-over-slf4j transitively enabled
INFO : jcl-slf4j transitively enabled
INFO : logback-impl transitively enabled
INFO : jul-slf4j transitively enabled
INFO : slf4j-logback transitively enabled
INFO : centralized-webapp-logging initialized in ${jetty.base}/start.d/centralized-webapp-logging.ini
INFO : logging-logback transitively enabled
INFO : resources transitively enabled
MKDIR : ${jetty.base}/lib/slf4j
DOWNLD: https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar to ${jetty.base}/lib/slf4j/slf4j-api-1.7.25.jar
MKDIR : ${jetty.base}/lib/logging
DOWNLD: https://repo1.maven.org/maven2/org/slf4j/log4j-over-slf4j/1.7.25/log4j-over-slf4j-1.7.25.jar to ${jetty.base}/lib/logging/log4j-over-slf4j-1.7.25.jar
DOWNLD: https://repo1.maven.org/maven2/org/slf4j/jcl-over-slf4j/1.7.25/jcl-over-slf4j-1.7.25.jar to ${jetty.base}/lib/slf4j/jcl-over-slf4j-1.7.25.jar
MKDIR : ${jetty.base}/lib/logback
DOWNLD: https://repo1.maven.org/maven2/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar to ${jetty.base}/lib/logback/logback-core-1.2.3.jar
DOWNLD: https://repo1.maven.org/maven2/org/slf4j/jul-to-slf4j/1.7.25/jul-to-slf4j-1.7.25.jar to ${jetty.base}/lib/slf4j/jul-to-slf4j-1.7.25.jar
COPY : ${jetty.home}/modules/jul-slf4j/etc/java-util-logging.properties to ${jetty.base}/etc/java-util-logging.properties
DOWNLD: https://repo1.maven.org/maven2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar to ${jetty.base}/lib/logback/logback-classic-1.2.3.jar
MKDIR : ${jetty.base}/logs
DOWNLD: https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-webapp-logging/9.4.27/jetty-webapp-logging-9.4.27.jar to ${jetty.base}/lib/logging/jetty-webapp-logging-9.4.27.jar
INFO : Base directory was modified
$</pre></div><p>This replacement <code class="literal">centralized-webapp-logging.mod</code> performs a number of tasks.</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><code class="literal">mybase</code> is a <code class="literal">${jetty.base}</code> directory.</li><li class="listitem">The jetty-distribution is unpacked (and untouched) into <code class="literal">/opt/jetty-dist/</code> and becomes the <code class="literal">${jetty.home}</code> directory for this demonstration.</li><li class="listitem">The <code class="literal">curl</code> command downloads the replacement config overlay for the <code class="literal">${jetty.base}/modules/</code> directory to use.</li><li class="listitem"><p class="simpara">The <code class="literal">start.jar --add-to-start=centralized-webapp-logging</code> command performs a number of steps to make the centralized-webapp-logging module available to the <code class="literal">${jetty.base}</code> configuration.</p><div class="orderedlist"><ol class="orderedlist" type="a"><li class="listitem">A new <code class="literal">${jetty.base}/start.d/centralized-webapp-logging.ini</code> configuration was created.</li><li class="listitem">Required <code class="literal">${jetty.base}</code> directories are created: <code class="literal">${jetty.base}/logs</code> and <code class="literal">${jetty.base}/resources</code>.</li><li class="listitem"><p class="simpara">Required logging libraries are downloaded (if not present already) to the <code class="literal">${jetty.base}/lib/logging/</code> directory:</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><code class="literal">slf4j-api.jar</code> - API jar for Slf4j (used by most of the rest of the jars)</li><li class="listitem"><code class="literal">log4j-over-slf4j.jar</code> - Slf4j jar that captures all log4j emitted logging events</li><li class="listitem"><code class="literal">jul-to-slf4j.jar</code> - Slf4j jar that captures all java.util.logging events</li><li class="listitem"><code class="literal">jcl-over-slf4j.jar</code> - Slf4j jar that captures all commons-logging events</li><li class="listitem"><code class="literal">logback-classic.jar</code> - the Slf4j adapter jar that routes all of the captured logging events to logback itself.</li><li class="listitem"><code class="literal">logback-core.jar</code> - the logback implementation jar, that handles all of the filtering and output of the logging events.</li></ul></div></li><li class="listitem"><p class="simpara">Required webapp-logging library is downloaded (if not present already) to the <code class="literal">${jetty.base}/lib/webapp-logging/</code> directory:</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><code class="literal">jetty-webapp-logging.jar</code> - the Jetty side deployment manger app-lifecycle bindings for modifying the <code class="literal">WebAppClassloaders</code> of deployed webapps.</li></ul></div></li></ol></div></li></ol></div><p>At this point the Jetty <code class="literal">mybase</code> is configured so that the jetty server itself will log using slf4j, and all other logging events from other Jetty Server components (such as database drivers, security layers, jsp, mail, and other 3rd party server components) are routed to logback for filtering and output.</p><p>All webapps deployed via the <code class="literal">DeploymentManager</code> have their <code class="literal">WebAppClassLoader</code> modified to use server side classes and configuration for all logging implementations.</p><p>The server classpath can be verified by using the <code class="literal">start.jar --list-config</code> command.</p><p>In essence, Jetty is now configured to emit its own logging events to slf4j, and various slf4j bridge jars are acting on behalf of <code class="literal">log4j</code>, <code class="literal">java.util.logging</code>, and <code class="literal">commons-logging</code>, routing all of the logging events to <code class="literal">logback</code>
(a slf4j implementation) for routing (to console, file, etc&#8230;&#8203;).</p></div><script type="text/javascript">
SyntaxHighlighter.all()
</script><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="configuring-logging-modules.html"><i class="fa fa-chevron-left" aria-hidden="true"></i> Previous</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="configuring-logging.html"><i class="fa fa-chevron-up" aria-hidden="true"></i> Top</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="jetty-dump-tool.html">Next <i class="fa fa-chevron-right" aria-hidden="true"></i></a></td></tr><tr><td width="40%" align="left" valign="top">Jetty Logging Integrations (SLF4J, Log4j, Logback, JCL, JUL)&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html"><i class="fa fa-home" aria-hidden="true"></i> Home</a></td><td width="40%" align="right" valign="top">&nbsp;Jetty Dump Tool</td></tr></table></div><p xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times"><div class="jetty-callout">
See an error or something missing?
<span class="callout"><a href="http://github.com/eclipse/jetty.project">Contribute to this documentation at
<span class="website"><i class="fa fa-github" aria-hidden="true"></i> Github!</span></a></span><span style="float: right"><i>(Generated: 2020-06-11)</i></span></div></p></body></html>