blob: a7feb982b922b8c7fb43cdd9f7161f61ed217020 [file] [log] [blame]
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Example: Centralized Logging with Logback</title><link rel="stylesheet" type="text/css" href="css/docbook.css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.76.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 : The Definitive Reference"><link rel="up" href="configuring-logging.html" title="Chapter&nbsp;20.&nbsp;Jetty Logging"><link rel="prev" href="example-slf4j-multiple-loggers.html" title="Example: Capturing Multiple Logging Frameworks with Slf4j"><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"><script type="text/javascript" src="js/shCore.js"></script><script type="text/javascript" src="js/shBrushJava.js"></script><script type="text/javascript" src="js/shBrushXml.js"></script><script type="text/javascript" src="js/shBrushBash.js"></script><script type="text/javascript" src="js/shBrushJScript.js"></script><script type="text/javascript" src="js/shBrushSql.js"></script><script type="text/javascript" src="js/shBrushProperties.js"></script><script type="text/javascript" src="js/shBrushPlain.js"></script><link type="text/css" rel="stylesheet" href="css/shCore.css"><link type="text/css" rel="stylesheet" href="css/shThemeEclipse.css"><link type="text/css" rel="stylesheet" href="css/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.3.0.v20150612</span></td><td style="width: 50%"><script type="text/javascript"> (function() {
var cx = '016459005284625897022:obd4lsai2ds';
var gcse = document.createElement('script');
gcse.type = 'text/javascript';
gcse.async = true;
gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
'//www.google.com/cse/cse.js?cx=' + cx;
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(gcse, s);
})();
</script><gcse:search></gcse:search></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">Example: Centralized Logging with Logback</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="example-slf4j-multiple-loggers.html"><i class="icon-chevron-left"></i> Previous</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;20.&nbsp;Jetty Logging<br><a accesskey="p" href="index.html"><i class="icon-home"></i> Home</a></th><td width="20%" align="right">&nbsp;<a accesskey="n" href="jetty-dump-tool.html">Next <i class="icon-chevron-right"></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 from 1 day to full product delivery
</p></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="example-logging-logback-centralized"></a>Example: Centralized Logging with 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 Logback to manage the final writing of logs to disk.</p><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="icon-plus-sign-alt"></i> Important</h3><p>This mechanism forces all webapps to use the server's configuration
for logging, something that isn't 100% appropriate for all webapps.</p><p>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><p>This configuration is essentially the multiple logger configuration
with added configuration to the deployers to force a WebAppClassLoader
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://download.eclipse.org/jetty/stable-9/apidocsorg/eclipse/jetty/deploy/AppLifeCycle.Binding.html" target="_top">AppLifeCycle.Binding</a>
against the <a class="link" href="http://download.eclipse.org/jetty/stable-9/apidocs/org/eclipse/jetty/deploy/AppLifeCycle.html" target="_top"><code class="literal">"deploying"</code>
node</a> that modifies the <a class="link" href="http://download.eclipse.org/jetty/stable-9/apidocs/org/eclipse/jetty/webapp/WebAppContext.html#addSystemClass(java.lang.String)" target="_top">WebAppContext.addSystemClass(String)</a>
for the common logging classes. (See <a class="link" href="https://github.com/jetty-project/jetty-webapp-logging/blob/master/src/main/java/org/eclipse/jetty/webapp/logging/CentralizedWebAppLoggingBinding.java" target="_top">org.eclipse.jetty.logging.CentralizedWebAppLoggingBinding</a>
for actual implementation)</p><div class="simplesect"><div class="titlepage"><div><div><h3 class="title"><a name="d0e15903"></a>Quick Setup of Centralized Logging using Jetty 9.2.1+</h3></div></div></div><p>A convenient replacement <code class="literal">logging</code> module has been
created to bootstrap your <code class="filename">${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]$ mkdir modules
[mybase]$ cd modules
[modules]$ <span class="bold"><strong>curl -O https://raw.githubusercontent.com/jetty-project/logging-modules/master/capture-all/logging.mod</strong></span>
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1416 100 1416 0 0 4241 0 --:--:-- --:--:-- --:--:-- 4252
[master]$ <span class="bold"><strong>curl -O https://raw.githubusercontent.com/jetty-project/logging-modules/master/centralized/webapp-logging.mod</strong></span>
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 660 100 660 0 0 2032 0 --:--:-- --:--:-- --:--:-- 2037
[modules]$ cd ..
[mybase]$ <span class="bold"><strong>java -jar /opt/jetty-dist/start.jar --add-to-start=logging,webapp-logging</strong></span>
INFO: logging initialised in ${jetty.base}/start.ini (appended)
MKDIR: ${jetty.base}/logs
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: http://central.maven.org/maven2/org/slf4j/log4j-over-slf4j/1.6.6/log4j-over-slf4j-1.6.6.jar to lib/logging/log4j-over-slf4j-1.6.6.jar
DOWNLOAD: http://central.maven.org/maven2/org/slf4j/jul-to-slf4j/1.6.6/jul-to-slf4j-1.6.6.jar to lib/logging/jul-to-slf4j-1.6.6.jar
DOWNLOAD: http://central.maven.org/maven2/org/slf4j/jcl-over-slf4j/1.6.6/jcl-over-slf4j-1.6.6.jar to lib/logging/jcl-over-slf4j-1.6.6.jar
DOWNLOAD: http://central.maven.org/maven2/ch/qos/logback/logback-core/1.0.7/logback-core-1.0.7.jar to lib/logging/logback-core-1.0.7.jar
DOWNLOAD: http://central.maven.org/maven2/ch/qos/logback/logback-classic/1.0.7/logback-classic-1.0.7.jar to lib/logging/logback-classic-1.0.7.jar
DOWNLOAD: https://raw.githubusercontent.com/jetty-project/logging-modules/master/capture-all/logback.xml to resources/logback.xml
DOWNLOAD: https://raw.githubusercontent.com/jetty-project/logging-modules/master/capture-all/jetty-logging.properties to resources/jetty-logging.properties
DOWNLOAD: https://raw.githubusercontent.com/jetty-project/logging-modules/master/capture-all/jetty-logging.xml to etc/jetty-logging.xml
INFO: resources initialised transitively
INFO: resources enabled in ${jetty.base}/start.ini
INFO: webapp-logging initialised in ${jetty.base}/start.ini (appended)
DOWNLOAD: http://central.maven.org/maven2/org/eclipse/jetty/jetty-webapp-logging/9.0.0/jetty-webapp-logging-9.0.0.jar to lib/webapp-logging/jetty-webapp-logging-9.0.0.jar
DOWNLOAD: https://raw.githubusercontent.com/jetty-project/jetty-webapp-logging/master/src/main/config/etc/jetty-webapp-logging.xml to etc/jetty-webapp-logging.xml
DOWNLOAD: https://raw.githubusercontent.com/jetty-project/jetty-webapp-logging/master/src/main/config/etc/jetty-mdc-handler.xml to etc/jetty-mdc-handler.xml
INFO: deploy initialised transitively
INFO: deploy enabled in ${jetty.base}/start.ini
INFO: logging initialised transitively
INFO: resources initialised transitively
INFO: resources enabled in ${jetty.base}/start.ini
[mybase]$ <span class="bold"><strong>java -jar /opt/jetty-dist/start.jar</strong></span>
</pre></div></div><div class="simplesect"><div class="titlepage"><div><div><h3 class="title"><a name="d0e15928"></a>That's cool and all, but tell me what that just did.</h3></div></div></div><p>The replacement <code class="filename">logging.mod</code> performs a number
of tasks.</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p><code class="filename">mybase</code> is a
<code class="filename">${jetty.base}</code> directory</p></li><li class="listitem"><p>The jetty-distribution is unpacked (and untouched) into
<code class="filename">/opt/jetty-dist/ </code>and becomes the
<code class="filename">${jetty.home}</code> directory for this
demonstration.</p></li><li class="listitem"><p>The <span class="command"><strong>curl</strong></span> command downloads the replacement
<code class="filename">logging.mod</code> and puts it into the
<code class="filename">${jetty.base}/modules/</code> directory for use by
mybase only.</p></li><li class="listitem"><p>The <span class="command"><strong>start.jar
--add-to-start=logging,webapp-logging</strong></span> command performs a
number of steps to make the logging module available to the
<code class="filename">${jetty.base}</code> configuration.</p><div class="orderedlist"><ol class="orderedlist" type="a"><li class="listitem"><p>Several entries are added to the
<code class="filename">${jetty.base}/start.ini</code> configuration</p><div class="orderedlist"><ol class="orderedlist" type="i"><li class="listitem"><p><span class="command"><strong>--module=logging</strong></span> is added to enable
the logging module</p></li><li class="listitem"><p><span class="command"><strong>--module=webapp-logging</strong></span> is added to
enable the webapp-logging module</p></li></ol></div></li><li class="listitem"><p>Required <code class="filename">${jetty.base}</code> directories are
created: <code class="filename">${jetty.base}/logs</code> and
<code class="filename">${jetty.base}/resources</code></p></li><li class="listitem"><p>Required logging libraries are downloaded (if not present
already):</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>slf4j-api.jar - API jar for Slf4j (used by most of the
rest of the jars)</p></li><li class="listitem"><p>log4j-over-slf4j.jar - Slf4j jar that captures all log4j
emitted logging events</p></li><li class="listitem"><p>jul-to-slf4j.jar - Slf4j jar that captures all
java.util.logging events</p></li><li class="listitem"><p>jcl-over-slf4j.jar - Slf4j jar that captures all
commons-logging events</p></li><li class="listitem"><p>logback-classic.jar - the Slf4j adapter jar that routes
all of the captured logging events to logback itself.</p></li><li class="listitem"><p>logback-core.jar - the logback implementation jar, that
handles all of the filtering and output of the logging
events.</p></li></ul></div><p>These libraries are put in the
<code class="filename">${jetty.base}/lib/logging/</code> directory.</p></li><li class="listitem"><p>Required webapp-logging library are downloaded (if not
present already):</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>jetty-webapp-logging.jar - the jetty side deployment
manger app-lifecycle bindings for modifying the
WebAppClassloaders of deployed webapps.</p></li></ul></div><p>This library is put in the
<code class="filename">${jetty.base}/lib/webapp-logging/</code>
directory.</p></li><li class="listitem"><p>Required configuration files are downloaded (if not present
already): <code class="filename">jetty-logging.properties</code>, and
<code class="filename">logback.xml</code></p><p>The configuration files are put in the
<code class="filename">${jetty.base}/resources/</code> directory.</p></li><li class="listitem"><p>Required initialization commands are downloaded (if not
present already): <code class="filename">jetty-logging.xml</code>,
<code class="filename">jetty-webapp-logging.xml</code>, and
<code class="filename">jetty-mdc-handler.xml</code></p><p>These xml files are put in the
<code class="filename">${jetty.base}/etc/</code> directory.</p></li></ol></div></li><li class="listitem"><p>At this point you have your <code class="filename">mybase</code>
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 DeploymentManager have their
WebAppClassLoader modified to use server side classes and
configuration for all logging implementations.</p></li></ol></div><p>You can verify the server classpath by using the <span class="command"><strong>start.jar
--list-config</strong></span> 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 log4j,
java.util.logging, and commons-logging, routing all of the logging events
to logback (a slf4j adapter) for routing (to console, file, etc...)</p></div></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="example-slf4j-multiple-loggers.html"><i class="icon-chevron-left"></i> Previous</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="configuring-logging.html"><i class="icon-chevron-up"></i> Top</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="jetty-dump-tool.html">Next <i class="icon-chevron-right"></i></a></td></tr><tr><td width="40%" align="left" valign="top">Example: Capturing Multiple Logging Frameworks with Slf4j&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html"><i class="icon-home"></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/jetty-project/jetty-documentation">Contribute to this documentation at
<span class="website"><i class="icon-github"></i> Github!</span></a></span><span style="float: right"><i>(Generated: 2015-06-15T13:18:26-05:00)</i></span></div></p><script 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" type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-1149868-7']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script></body></html>