This is an automated email from the ASF dual-hosted git repository. pkarwasz pushed a commit to branch asf-staging in repository https://gitbox.apache.org/repos/asf/logging-log4j-jakarta.git
commit b4b65a8609e31a84ac6c130eaf2d22b2f26c5ca5 Author: Piotr P. Karwasz <[email protected]> AuthorDate: Thu Nov 16 15:12:00 2023 +0100 Stage first site snapshot --- .htaccess | 2 + 3.x/index.html | 1759 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ latest | 1 + 3 files changed, 1762 insertions(+) diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..f7ebeb6 --- /dev/null +++ b/.htaccess @@ -0,0 +1,2 @@ +RewriteEngine On +RewriteRule "^$" "/log4j/jakarta/latest/" [R] diff --git a/3.x/index.html b/3.x/index.html new file mode 100644 index 0000000..3e581e2 --- /dev/null +++ b/3.x/index.html @@ -0,0 +1,1759 @@ +<!DOCTYPE html> +<html lang="en"> +<head> +<meta charset="UTF-8"> +<meta http-equiv="X-UA-Compatible" content="IE=edge"> +<meta name="viewport" content="width=device-width, initial-scale=1.0"> +<meta name="generator" content="Asciidoctor 2.0.18"> +<title>Log4j Jakarta</title> +<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"> +<style> +/*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */ +/* Uncomment the following line when using as a custom stylesheet */ +/* @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"; */ +html{font-family:sans-serif;-webkit-text-size-adjust:100%} +a{background:none} +a:focus{outline:thin dotted} +a:active,a:hover{outline:0} +h1{font-size:2em;margin:.67em 0} +b,strong{font-weight:bold} +abbr{font-size:.9em} +abbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none} +dfn{font-style:italic} +hr{height:0} +mark{background:#ff0;color:#000} +code,kbd,pre,samp{font-family:monospace;font-size:1em} +pre{white-space:pre-wrap} +q{quotes:"\201C" "\201D" "\2018" "\2019"} +small{font-size:80%} +sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} +sup{top:-.5em} +sub{bottom:-.25em} +img{border:0} +svg:not(:root){overflow:hidden} +figure{margin:0} +audio,video{display:inline-block} +audio:not([controls]){display:none;height:0} +fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em} +legend{border:0;padding:0} +button,input,select,textarea{font-family:inherit;font-size:100%;margin:0} +button,input{line-height:normal} +button,select{text-transform:none} +button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer} +button[disabled],html input[disabled]{cursor:default} +input[type=checkbox],input[type=radio]{padding:0} +button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0} +textarea{overflow:auto;vertical-align:top} +table{border-collapse:collapse;border-spacing:0} +*,::before,::after{box-sizing:border-box} +html,body{font-size:100%} +body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;line-height:1;position:relative;cursor:auto;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased} +a:hover{cursor:pointer} +img,object,embed{max-width:100%;height:auto} +object,embed{height:100%} +img{-ms-interpolation-mode:bicubic} +.left{float:left!important} +.right{float:right!important} +.text-left{text-align:left!important} +.text-right{text-align:right!important} +.text-center{text-align:center!important} +.text-justify{text-align:justify!important} +.hide{display:none} +img,object,svg{display:inline-block;vertical-align:middle} +textarea{height:auto;min-height:50px} +select{width:100%} +.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em} +div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0} +a{color:#2156a5;text-decoration:underline;line-height:inherit} +a:hover,a:focus{color:#1d4b8f} +a img{border:0} +p{line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility} +p aside{font-size:.875em;line-height:1.35;font-style:italic} +h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em} +h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0} +h1{font-size:2.125em} +h2{font-size:1.6875em} +h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em} +h4,h5{font-size:1.125em} +h6{font-size:1em} +hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em} +em,i{font-style:italic;line-height:inherit} +strong,b{font-weight:bold;line-height:inherit} +small{font-size:60%;line-height:inherit} +code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)} +ul,ol,dl{line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit} +ul,ol{margin-left:1.5em} +ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0} +ul.circle{list-style-type:circle} +ul.disc{list-style-type:disc} +ul.square{list-style-type:square} +ul.circle ul:not([class]),ul.disc ul:not([class]),ul.square ul:not([class]){list-style:inherit} +ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0} +dl dt{margin-bottom:.3125em;font-weight:bold} +dl dd{margin-bottom:1.25em} +blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd} +blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)} +@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2} +h1{font-size:2.75em} +h2{font-size:2.3125em} +h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em} +h4{font-size:1.4375em}} +table{background:#fff;margin-bottom:1.25em;border:1px solid #dedede;word-wrap:normal} +table thead,table tfoot{background:#f7f8f7} +table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left} +table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)} +table tr.even,table tr.alt{background:#f8f8f7} +table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6} +h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em} +h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400} +.center{margin-left:auto;margin-right:auto} +.stretch{width:100%} +.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table} +.clearfix::after,.float-group::after{clear:both} +:not(pre).nobreak{word-wrap:normal} +:not(pre).nowrap{white-space:nowrap} +:not(pre).pre-wrap{white-space:pre-wrap} +:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed} +pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed} +pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit} +pre>code{display:block} +pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal} +em em{font-style:normal} +strong strong{font-weight:400} +.keyseq{color:rgba(51,51,51,.8)} +kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap} +.keyseq kbd:first-child{margin-left:0} +.keyseq kbd:last-child{margin-right:0} +.menuseq,.menuref{color:#000} +.menuseq b:not(.caret),.menuref{font-weight:inherit} +.menuseq{word-spacing:-.02em} +.menuseq b.caret{font-size:1.25em;line-height:.8} +.menuseq i.caret{font-weight:bold;text-align:center;width:.45em} +b.button::before,b.button::after{position:relative;top:-1px;font-weight:400} +b.button::before{content:"[";padding:0 3px 0 2px} +b.button::after{content:"]";padding:0 2px 0 3px} +p a>code:hover{color:rgba(0,0,0,.9)} +#header,#content,#footnotes,#footer{width:100%;margin:0 auto;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em} +#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table} +#header::after,#content::after,#footnotes::after,#footer::after{clear:both} +#content{margin-top:1.25em} +#content::before{content:none} +#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0} +#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf} +#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px} +#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap} +#header .details span:first-child{margin-left:-.125em} +#header .details span.email a{color:rgba(0,0,0,.85)} +#header .details br{display:none} +#header .details br+span::before{content:"\00a0\2013\00a0"} +#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)} +#header .details br+span#revremark::before{content:"\00a0|\00a0"} +#header #revnumber{text-transform:capitalize} +#header #revnumber::after{content:"\00a0"} +#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem} +#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em} +#toc>ul{margin-left:.125em} +#toc ul.sectlevel0>li>a{font-style:italic} +#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0} +#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none} +#toc li{line-height:1.3334;margin-top:.3334em} +#toc a{text-decoration:none} +#toc a:active{text-decoration:underline} +#toctitle{color:#7a2518;font-size:1.2em} +@media screen and (min-width:768px){#toctitle{font-size:1.375em} +body.toc2{padding-left:15em;padding-right:0} +#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto} +#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em} +#toc.toc2>ul{font-size:.9em;margin-bottom:0} +#toc.toc2 ul ul{margin-left:0;padding-left:1em} +#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em} +body.toc2.toc-right{padding-left:0;padding-right:15em} +body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}} +@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0} +#toc.toc2{width:20em} +#toc.toc2 #toctitle{font-size:1.375em} +#toc.toc2>ul{font-size:.95em} +#toc.toc2 ul ul{padding-left:1.25em} +body.toc2.toc-right{padding-left:0;padding-right:20em}} +#content #toc{border:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px} +#content #toc>:first-child{margin-top:0} +#content #toc>:last-child{margin-bottom:0} +#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em} +#footer-text{color:hsla(0,0%,100%,.8);line-height:1.44} +#content{margin-bottom:.625em} +.sect1{padding-bottom:.625em} +@media screen and (min-width:768px){#content{margin-bottom:1.25em} +.sect1{padding-bottom:1.25em}} +.sect1:last-child{padding-bottom:0} +.sect1+.sect1{border-top:1px solid #e7e7e9} +#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400} +#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em} +#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible} +#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none} +#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221} +details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em} +details{margin-left:1.25rem} +details>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;outline:none;-webkit-tap-highlight-color:transparent} +details>summary::-webkit-details-marker{display:none} +details>summary::before{content:"";border:solid transparent;border-left:solid;border-width:.3em 0 .3em .5em;position:absolute;top:.5em;left:-1.25rem;transform:translateX(15%)} +details[open]>summary::before{border:solid transparent;border-top:solid;border-width:.5em .3em 0;transform:translateY(15%)} +details>summary::after{content:"";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem} +.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic} +table.tableblock.fit-content>caption.title{white-space:nowrap;width:0} +.paragraph.lead>p,#preamble>.sectionbody>[class=paragraph]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)} +.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%} +.admonitionblock>table td.icon{text-align:center;width:80px} +.admonitionblock>table td.icon img{max-width:none} +.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase} +.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere} +.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0} +.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px} +.exampleblock>.content>:first-child{margin-top:0} +.exampleblock>.content>:last-child{margin-bottom:0} +.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px} +.sidebarblock>:first-child{margin-top:0} +.sidebarblock>:last-child{margin-bottom:0} +.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center} +.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0} +.literalblock pre,.listingblock>.content>pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em} +@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}} +@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}} +.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class=highlight],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8} +.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)} +.listingblock>.content{position:relative} +.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5} +.listingblock:hover code[data-lang]::before{display:block} +.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5} +.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"} +.listingblock pre.highlightjs{padding:0} +.listingblock pre.highlightjs>code{padding:1em;border-radius:4px} +.listingblock pre.prettyprint{border-width:0} +.prettyprint{background:#f7f7f8} +pre.prettyprint .linenums{line-height:1.45;margin-left:2em} +pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0} +pre.prettyprint li code[data-lang]::before{opacity:1} +pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none} +table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none} +table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal} +table.linenotable td.code{padding-left:.75em} +table.linenotable td.linenos,pre.pygments .linenos{border-right:1px solid;opacity:.35;padding-right:.5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} +pre.pygments span.linenos{display:inline-block;margin-right:.75em} +.quoteblock{margin:0 1em 1.25em 1.5em;display:table} +.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em} +.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify} +.quoteblock blockquote{margin:0;padding:0;border:0} +.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)} +.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0} +.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right} +.verseblock{margin:0 1em 1.25em} +.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans-serif;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility} +.verseblock pre strong{font-weight:400} +.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex} +.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic} +.quoteblock .attribution br,.verseblock .attribution br{display:none} +.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)} +.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none} +.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0} +.quoteblock.abstract{margin:0 1em 1.25em;display:block} +.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center} +.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf} +.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0} +.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem} +.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;font-size:.85rem;text-align:left;margin-right:0} +p.tableblock:last-child{margin-bottom:0} +td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere} +td.tableblock>.content>:last-child{margin-bottom:-1.25em} +table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede} +table.grid-all>*>tr>*{border-width:1px} +table.grid-cols>*>tr>*{border-width:0 1px} +table.grid-rows>*>tr>*{border-width:1px 0} +table.frame-all{border-width:1px} +table.frame-ends{border-width:1px 0} +table.frame-sides{border-width:0 1px} +table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0} +table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0} +table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0} +table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0} +table.stripes-all>*>tr,table.stripes-odd>*>tr:nth-of-type(odd),table.stripes-even>*>tr:nth-of-type(even),table.stripes-hover>*>tr:hover{background:#f8f8f7} +th.halign-left,td.halign-left{text-align:left} +th.halign-right,td.halign-right{text-align:right} +th.halign-center,td.halign-center{text-align:center} +th.valign-top,td.valign-top{vertical-align:top} +th.valign-bottom,td.valign-bottom{vertical-align:bottom} +th.valign-middle,td.valign-middle{vertical-align:middle} +table thead th,table tfoot th{font-weight:bold} +tbody tr th{background:#f7f8f7} +tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold} +p.tableblock>code:only-child{background:none;padding:0} +p.tableblock{font-size:1em} +ol{margin-left:1.75em} +ul li ol{margin-left:1.5em} +dl dd{margin-left:1.125em} +dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0} +li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em} +ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none} +ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em} +ul.unstyled,ol.unstyled{margin-left:0} +li>p:empty:only-child::before{content:"";display:inline-block} +ul.checklist>li>p:first-child{margin-left:-1em} +ul.checklist>li>p:first-child>.fa-square-o:first-child,ul.checklist>li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em} +ul.checklist>li>p:first-child>input[type=checkbox]:first-child{margin-right:.25em} +ul.inline{display:flex;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em} +ul.inline>li{margin-left:1.25em} +.unstyled dl dt{font-weight:400;font-style:normal} +ol.arabic{list-style-type:decimal} +ol.decimal{list-style-type:decimal-leading-zero} +ol.loweralpha{list-style-type:lower-alpha} +ol.upperalpha{list-style-type:upper-alpha} +ol.lowerroman{list-style-type:lower-roman} +ol.upperroman{list-style-type:upper-roman} +ol.lowergreek{list-style-type:lower-greek} +.hdlist>table,.colist>table{border:0;background:none} +.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none} +td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em} +td.hdlist1{font-weight:bold;padding-bottom:1.25em} +td.hdlist2{word-wrap:anywhere} +.literalblock+.colist,.listingblock+.colist{margin-top:-.5em} +.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top} +.colist td:not([class]):first-child img{max-width:none} +.colist td:not([class]):last-child{padding:.25em 0} +.thumb,.th{line-height:0;display:inline-block;border:4px solid #fff;box-shadow:0 0 0 1px #ddd} +.imageblock.left{margin:.25em .625em 1.25em 0} +.imageblock.right{margin:.25em 0 1.25em .625em} +.imageblock>.title{margin-bottom:0} +.imageblock.thumb,.imageblock.th{border-width:6px} +.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em} +.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0} +.image.left{margin-right:.625em} +.image.right{margin-left:.625em} +a.image{text-decoration:none;display:inline-block} +a.image object{pointer-events:none} +sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super} +sup.footnote a,sup.footnoteref a{text-decoration:none} +sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline} +#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em} +#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0} +#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em} +#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em} +#footnotes .footnote:last-of-type{margin-bottom:0} +#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0} +div.unbreakable{page-break-inside:avoid} +.big{font-size:larger} +.small{font-size:smaller} +.underline{text-decoration:underline} +.overline{text-decoration:overline} +.line-through{text-decoration:line-through} +.aqua{color:#00bfbf} +.aqua-background{background:#00fafa} +.black{color:#000} +.black-background{background:#000} +.blue{color:#0000bf} +.blue-background{background:#0000fa} +.fuchsia{color:#bf00bf} +.fuchsia-background{background:#fa00fa} +.gray{color:#606060} +.gray-background{background:#7d7d7d} +.green{color:#006000} +.green-background{background:#007d00} +.lime{color:#00bf00} +.lime-background{background:#00fa00} +.maroon{color:#600000} +.maroon-background{background:#7d0000} +.navy{color:#000060} +.navy-background{background:#00007d} +.olive{color:#606000} +.olive-background{background:#7d7d00} +.purple{color:#600060} +.purple-background{background:#7d007d} +.red{color:#bf0000} +.red-background{background:#fa0000} +.silver{color:#909090} +.silver-background{background:#bcbcbc} +.teal{color:#006060} +.teal-background{background:#007d7d} +.white{color:#bfbfbf} +.white-background{background:#fafafa} +.yellow{color:#bfbf00} +.yellow-background{background:#fafa00} +span.icon>.fa{cursor:default} +a span.icon>.fa{cursor:inherit} +.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default} +.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c} +.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111} +.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900} +.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400} +.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000} +.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold} +.conum[data-value] *{color:#fff!important} +.conum[data-value]+b{display:none} +.conum[data-value]::after{content:attr(data-value)} +pre .conum[data-value]{position:relative;top:-.125em} +b.conum *{color:inherit!important} +.conum:not([data-value]):empty{display:none} +dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility} +h1,h2,p,td.content,span.alt,summary{letter-spacing:-.01em} +p strong,td.content strong,div.footnote strong{letter-spacing:-.005em} +p,blockquote,dt,td.content,span.alt,summary{font-size:1.0625rem} +p{margin-bottom:1.25rem} +.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em} +.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc} +.print-only{display:none!important} +@page{margin:1.25cm .75cm} +@media print{*{box-shadow:none!important;text-shadow:none!important} +html{font-size:80%} +a{color:inherit!important;text-decoration:underline!important} +a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important} +a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em} +abbr[title]{border-bottom:1px dotted} +abbr[title]::after{content:" (" attr(title) ")"} +pre,blockquote,tr,img,object,svg{page-break-inside:avoid} +thead{display:table-header-group} +svg{max-width:100%} +p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3} +h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid} +#header,#content,#footnotes,#footer{max-width:none} +#toc,.sidebarblock,.exampleblock>.content{background:none!important} +#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important} +body.book #header{text-align:center} +body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em} +body.book #header .details{border:0!important;display:block;padding:0!important} +body.book #header .details span:first-child{margin-left:0!important} +body.book #header .details br{display:block} +body.book #header .details br+span::before{content:none!important} +body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important} +body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always} +.listingblock code[data-lang]::before{display:block} +#footer{padding:0 .9375em} +.hide-on-print{display:none!important} +.print-only{display:block!important} +.hide-for-print{display:none!important} +.show-for-print{display:inherit!important}} +@media amzn-kf8,print{#header>h1:first-child{margin-top:1.25rem} +.sect1{padding:0!important} +.sect1+.sect1{border:0} +#footer{background:none} +#footer-text{color:rgba(0,0,0,.6);font-size:.9em}} +@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}} +</style> +<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> +<style> +/*! Stylesheet for CodeRay to loosely match GitHub themes | MIT License */ +pre.CodeRay{background:#f7f7f8} +.CodeRay .line-numbers{border-right:1px solid;opacity:.35;padding:0 .5em 0 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} +.CodeRay span.line-numbers{display:inline-block;margin-right:.75em} +.CodeRay .line-numbers strong{color:#000} +table.CodeRay{border-collapse:separate;border:0;margin-bottom:0;background:none} +table.CodeRay td{vertical-align:top;line-height:inherit} +table.CodeRay td.line-numbers{text-align:right} +table.CodeRay td.code{padding:0 0 0 .75em} +.CodeRay .debug{color:#fff!important;background:navy!important} +.CodeRay .annotation{color:#007} +.CodeRay .attribute-name{color:navy} +.CodeRay .attribute-value{color:#700} +.CodeRay .binary{color:#509} +.CodeRay .comment{color:#998;font-style:italic} +.CodeRay .char{color:#04d} +.CodeRay .char .content{color:#04d} +.CodeRay .char .delimiter{color:#039} +.CodeRay .class{color:#458;font-weight:bold} +.CodeRay .complex{color:#a08} +.CodeRay .constant,.CodeRay .predefined-constant{color:teal} +.CodeRay .color{color:#099} +.CodeRay .class-variable{color:#369} +.CodeRay .decorator{color:#b0b} +.CodeRay .definition{color:#099} +.CodeRay .delimiter{color:#000} +.CodeRay .doc{color:#970} +.CodeRay .doctype{color:#34b} +.CodeRay .doc-string{color:#d42} +.CodeRay .escape{color:#666} +.CodeRay .entity{color:#800} +.CodeRay .error{color:#808} +.CodeRay .exception{color:inherit} +.CodeRay .filename{color:#099} +.CodeRay .function{color:#900;font-weight:bold} +.CodeRay .global-variable{color:teal} +.CodeRay .hex{color:#058} +.CodeRay .integer,.CodeRay .float{color:#099} +.CodeRay .include{color:#555} +.CodeRay .inline{color:#000} +.CodeRay .inline .inline{background:#ccc} +.CodeRay .inline .inline .inline{background:#bbb} +.CodeRay .inline .inline-delimiter{color:#d14} +.CodeRay .inline-delimiter{color:#d14} +.CodeRay .important{color:#555;font-weight:bold} +.CodeRay .interpreted{color:#b2b} +.CodeRay .instance-variable{color:teal} +.CodeRay .label{color:#970} +.CodeRay .local-variable{color:#963} +.CodeRay .octal{color:#40e} +.CodeRay .predefined{color:#369} +.CodeRay .preprocessor{color:#579} +.CodeRay .pseudo-class{color:#555} +.CodeRay .directive{font-weight:bold} +.CodeRay .type{font-weight:bold} +.CodeRay .predefined-type{color:inherit} +.CodeRay .reserved,.CodeRay .keyword{color:#000;font-weight:bold} +.CodeRay .key{color:#808} +.CodeRay .key .delimiter{color:#606} +.CodeRay .key .char{color:#80f} +.CodeRay .value{color:#088} +.CodeRay .regexp .delimiter{color:#808} +.CodeRay .regexp .content{color:#808} +.CodeRay .regexp .modifier{color:#808} +.CodeRay .regexp .char{color:#d14} +.CodeRay .regexp .function{color:#404;font-weight:bold} +.CodeRay .string{color:#d20} +.CodeRay .string .string .string{background:#ffd0d0} +.CodeRay .string .content{color:#d14} +.CodeRay .string .char{color:#d14} +.CodeRay .string .delimiter{color:#d14} +.CodeRay .shell{color:#d14} +.CodeRay .shell .delimiter{color:#d14} +.CodeRay .symbol{color:#990073} +.CodeRay .symbol .content{color:#a60} +.CodeRay .symbol .delimiter{color:#630} +.CodeRay .tag{color:teal} +.CodeRay .tag-special{color:#d70} +.CodeRay .variable{color:#036} +.CodeRay .insert{background:#afa} +.CodeRay .delete{background:#faa} +.CodeRay .change{color:#aaf;background:#007} +.CodeRay .head{color:#f8f;background:#505} +.CodeRay .insert .insert{color:#080} +.CodeRay .delete .delete{color:#800} +.CodeRay .change .change{color:#66f} +.CodeRay .head .head{color:#f4f} +</style> +</head> +<body class="article toc2 toc-left"> +<div id="header"> +<h1>Log4j Jakarta</h1> +<div id="toc" class="toc2"> +<div id="toctitle">Table of Contents</div> +<ul class="sectlevel1"> +<li><a href="#log4j-jakarta-jms">Log4j Jakarta JMS Appender</a> +<ul class="sectlevel2"> +<li><a href="#log4j-jakarta-jms-dependency">Dependency</a></li> +<li><a href="#log4j-jakarta-jms-config">Configuration</a></li> +</ul> +</li> +<li><a href="#log4j-jakarta-smtp">Log4j Jakarta SMTP</a> +<ul class="sectlevel2"> +<li><a href="#log4j-jakarta-smtp-dependency">Dependency</a></li> +<li><a href="#log4j-jakarta-smtp-config">Configuration</a></li> +</ul> +</li> +<li><a href="#log4j-jakarta-web">Log4j Jakarta Web</a> +<ul class="sectlevel2"> +<li><a href="#log4j-jakarta-web-intro">Using Log4j Core in web applications</a></li> +<li><a href="#log4j-jakarta-web-installation">Installation</a></li> +<li><a href="#log4j-jakarta-web-configuration">Lifecycle hooks and configuration</a></li> +<li><a href="#log4j-jakarta-web-lookup">Web lookup</a></li> +<li><a href="#log4j-jakarta-web-async">Asynchronous Requests and Threads</a></li> +<li><a href="#log4j-jakarta-web-appender">Servlet Appender</a></li> +</ul> +</li> +<li><a href="#development">Development</a></li> +<li><a href="#distribution">Distribution</a> +<ul class="sectlevel2"> +<li><a href="#maven-bom">Maven Bill of Materials (BOM)</a></li> +<li><a href="#cyclonedx-sbom">CycloneDX Software Bill of Materials (SBOM)</a></li> +</ul> +</li> +<li><a href="#support">Support</a></li> +<li><a href="#security">Security</a></li> +<li><a href="#release-notes">Release Notes</a> +<ul class="sectlevel2"> +<li><a href="#release-notes-3-x-x">3.x.x</a></li> +</ul> +</li> +<li><a href="#release-instructions">Release instructions</a></li> +<li><a href="#license">License</a></li> +</ul> +</div> +</div> +<div id="content"> +<div id="preamble"> +<div class="sectionbody"> +<div class="paragraph"> +<p>This project provides various <a href="https://jakarta.ee/">Jakarta</a>-specific <a href="https://logging.apache.org/log4j">Log4j</a> components.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="log4j-jakarta-jms">Log4j Jakarta JMS Appender</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>The JMS Appender sends the formatted log event to a JMS Destination.</p> +</div> +<div class="sect2"> +<h3 id="log4j-jakarta-jms-dependency">Dependency</h3> +<div class="paragraph"> +<p>You need to have the <code>org.apache.logging.log4j:log4j-jakarta-jms</code> dependency in your classpath:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag"><dependency></span> + <span class="tag"><groupId></span>org.apache.logging.log4j<span class="tag"></groupId></span> + <span class="tag"><artifactId></span>log4j-jakarta-jms<span class="tag"></artifactId></span> + <span class="tag"><version></span>3.0.0-SNAPSHOT<span class="tag"></version></span> +<span class="tag"></dependency></span></code></pre> +</div> +</div> +<div class="admonitionblock warning"> +<table> +<tr> +<td class="icon"> +<i class="fa icon-warning" title="Warning"></i> +</td> +<td class="content"> +<div class="paragraph"> +<p>JMS Appender requires a <code>jakarta.jms:jakarta.jms-api</code> implementation (e.g., the one provided by Eclipse GlassFish or Apache ActiveMQ) at runtime.</p> +</div> +</td> +</tr> +</table> +</div> +</div> +<div class="sect2"> +<h3 id="log4j-jakarta-jms-config">Configuration</h3> +<div class="admonitionblock warning"> +<table> +<tr> +<td class="icon"> +<i class="fa icon-warning" title="Warning"></i> +</td> +<td class="content"> +<div class="paragraph"> +<p>The JMS Appender requires JNDI support so as of release 2.15.1 and will not function unless <code>log4j2.enableJndi=true</code> is configured as a system property or environment variable.</p> +</div> +</td> +</tr> +</table> +</div> +<div class="paragraph"> +<p>Note that in Log4j 2.0, this Appender was split into a <code>JMSQueueAppender</code> and a <code>JMSTopicAppender</code>. +Starting in Log4j 2.1, these Appenders were combined into the JMS Appender, which makes no distinction between queues and topics. +However, configurations written for 2.0 which use the <code><JMSQueue/></code> or <code><JMSTopic/></code> elements will continue to work with the new <code><JMS/></code> configuration element.</p> +</div> +<table class="tableblock frame-all grid-all stretch"> +<caption class="title">Table 1. JMS Appender parameters</caption> +<colgroup> +<col style="width: 12.5%;"> +<col style="width: 12.5%;"> +<col style="width: 12.5%;"> +<col style="width: 62.5%;"> +</colgroup> +<thead> +<tr> +<th class="tableblock halign-left valign-top">Parameter</th> +<th class="tableblock halign-left valign-top">Type</th> +<th class="tableblock halign-left valign-top">Default</th> +<th class="tableblock halign-left valign-top">Description</th> +</tr> +</thead> +<tbody> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>factoryBindingName</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The name to locate in the <a href="https://download.oracle.com/javase/7/docs/api/javax/naming/Context.html"><code>Context</code></a> that provides the <code>ConnectionFactory</code>. +This can be any sub-interface of <a href="https://download.oracle.com/javaee/5/api/javax/jms/ConnectionFactory.html"><code>ConnectionFactory</code></a> as well.</p> +<p class="tableblock">This parameter is <strong>required</strong>.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>factoryName</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The fully qualified class name that should be used to define the initial <code>ContextFactory</code> as defined in <a href="https://download.oracle.com/javase/7/docs/api/javax/naming/Context.html#INITIAL_CONTEXT_FACTORY"><code>INITIAL_CONTEXT_FACTORY</code></a>.</p> +<p class="tableblock">If a <code>factoryName</code> is specified without a <code>providerURL</code>, a warning message will be logged as this is likely to cause problems.</p> +<p class="tableblock">This parameter is <strong>required</strong>.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>filter</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Filter</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by this Appender. +More than one Filter may be used by using a <code>CompositeFilter</code>.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>layout</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Layout</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The Layout to use to format the LogEvent.</p> +<p class="tableblock">This parameter is <strong>required</strong> since <code>2.9</code>. +In previous versions <code>SerializedLayout</code> was default.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>name</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender.</p> +<p class="tableblock">This parameter is <strong>required</strong>.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>password</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The password to use to create the JMS connection</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>providerURL</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The URL of the provider to use as defined by <a href="https://download.oracle.com/javase/7/docs/api/javax/naming/Context.html#PROVIDER_URL"><code>PROVIDER_URL</code></a>.</p> +<p class="tableblock">This parameter is <strong>required</strong>.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>destinationBindingName</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The name to use to locate the <a href="https://download.oracle.com/javaee/5/api/javax/jms/Destination.html"><code>Destination</code></a>. +This can be a <code>Queue</code> or <code>Topic</code>, and as such, the attribute names <code>queueBindingName</code> and <code>topicBindingName</code> are aliases to maintain compatibility with the Log4j 2.0 JMS Appenders.</p> +<p class="tableblock">This parameter is <strong>required</strong>.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>securityPrincipalName</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the identity of the Principal as specified by <a href="https://download.oracle.com/javase/7/docs/api/javax/naming/Context.html#SECURITY_PRINCIPAL"><code>SECURITY_PRINCIPAL</code></a>. +If a <code>securityPrincipalName</code> is specified without <code>securityCredentials</code>, a warning message will be logged as this is likely to cause problems.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>securityCredentials</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The security credentials for the principal as specified by <a href="https://download.oracle.com/javase/7/docs/api/javax/naming/Context.html#SECURITY_CREDENTIALS"><code>SECURITY_CREDENTIALS</code></a>.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ignoreExceptions</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>boolean</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Indicates if exceptions encountered while appending events to be internally logged and then ignored. +When set to <code>false</code> exceptions will be propagated to the caller, instead. +You must set this to <code>false</code> when wrapping this Appender in a <code>FailoverAppender</code>.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>immediateFail</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>boolean</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">When set to <code>true</code>, log events will not wait to try to reconnect and will fail immediately if the JMS resources are not available. +This parameter is introduced in <code>2.9</code>.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>reconnectIntervalMillis</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>long</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>5000</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">If set to a value greater than <code>0</code>, after an error, the <code>JMSManager</code> will attempt to reconnect to the broker after waiting the specified number of milliseconds. +If the reconnect fails then an exception will be thrown, which can be caught by the application if <code>ignoreExceptions</code> is set to <code>false</code>. +This parameter is introduced in <code>2.9</code>.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>urlPkgPrefixes</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>null</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">A colon-separated list of package prefixes for the class name of the factory class that will create a URL context factory as defined by <a href="https://download.oracle.com/javase/7/docs/api/javax/naming/Context.html#URL_PKG_PREFIXES"><code>URL_PKG_PREFIXES</code></a></p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>userName</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>null</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The user ID used to create the JMS connection</p></td> +</tr> +</tbody> +</table> +<div class="listingblock"> +<div class="title">Example <code>log4j.xml</code> demonstrating JMS Appender usage</div> +<div class="content"> +<pre class="CodeRay highlight"><code><?xml version="1.0" encoding="UTF-8"?> +<Configuration status="warn" name="MyApp"> + + <Appenders> + <JMS name="jmsQueue" + destinationBindingName="MyQueue" + factoryBindingName="MyQueueConnectionFactory"> + <JsonTemplateLayout/> + </JMS> + </Appenders> + + <Loggers> + <Root level="error"> + <AppenderRef ref="jmsQueue"/> + </Root> + </Loggers> + +</Configuration></code></pre> +</div> +</div> +<div class="paragraph"> +<p>Starting from version <code>2.9</code>, you can map your Log4j <code>MapMessage</code>s to JMS <code>javax.jms.MapMessage</code>s, set the Layout of the Appender to <code>MessageLayout</code> with <code><MessageLayout/></code>:</p> +</div> +<div class="listingblock"> +<div class="title">Example <code>log4j.xml</code> demonstrating JMS Appender usage with <code>MessageLayout</code> to translate <code>MapMessage</code>s</div> +<div class="content"> +<pre class="CodeRay highlight"><code><?xml version="1.0" encoding="UTF-8"?> +<Configuration status="warn" name="MyApp"> + + <Appenders> + <JMS name="jmsQueue" + destinationBindingName="MyQueue" + factoryBindingName="MyQueueConnectionFactory"> + <MessageLayout /> + </JMS> + </Appenders> + + <Loggers> + <Root level="error"> + <AppenderRef ref="jmsQueue"/> + </Root> + </Loggers> + +</Configuration></code></pre> +</div> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="log4j-jakarta-smtp">Log4j Jakarta SMTP</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>Log4j Jakarta SMTP appender sends an e-mail when a specific logging event occurs, typically on +errors or fatal errors.</p> +</div> +<div class="sect2"> +<h3 id="log4j-jakarta-smtp-dependency">Dependency</h3> +<div class="paragraph"> +<p>You need to have the <code>org.apache.logging.log4j:log4j-jakarta-smtp</code> dependency in your classpath:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag"><dependency></span> + <span class="tag"><groupId></span>org.apache.logging.log4j<span class="tag"></groupId></span> + <span class="tag"><artifactId></span>log4j-jakarta-smtp<span class="tag"></artifactId></span> + <span class="tag"><version></span>3.0.0-SNAPSHOT<span class="tag"></version></span> +<span class="tag"></dependency></span></code></pre> +</div> +</div> +<div class="admonitionblock warning"> +<table> +<tr> +<td class="icon"> +<i class="fa icon-warning" title="Warning"></i> +</td> +<td class="content"> +<div class="paragraph"> +<p>SMTP Appender requires <code>jakarta.activation:jakarta.activation-api</code> and <code>jakarta.mail:jakarta.mail-api</code> implementations at runtime. +You can use <code>org.eclipse.angus:angus-activation</code> and <code>org.eclipse.angus:angus-mail</code>, or any other of your preference.</p> +</div> +</td> +</tr> +</table> +</div> +</div> +<div class="sect2"> +<h3 id="log4j-jakarta-smtp-config">Configuration</h3> +<div class="paragraph"> +<p>The number of logging events delivered in an e-mail depend on the value of <code>bufferSize</code> option. +The SMTP Appender keeps only the last <code>bufferSize</code> logging events in its cyclic buffer. +This keeps memory requirements at a reasonable level while still delivering useful application context. +All events in the buffer are included in the email. +The buffer will contain the most recent events of level <code>TRACE</code> to <code>WARN</code> preceding the event that triggered the email.</p> +</div> +<div class="paragraph"> +<p>The default behavior is to trigger sending an email whenever an <code>ERROR</code> or higher severity event is logged and to format it as HTML. +The circumstances on when the email is sent can be controlled by setting one or more filters on the Appender. +As with other Appenders, the formatting can be controlled by specifying a Layout for the Appender.</p> +</div> +<table class="tableblock frame-all grid-all stretch"> +<caption class="title">Table 2. SMTP Appender parameters</caption> +<colgroup> +<col style="width: 12.5%;"> +<col style="width: 12.5%;"> +<col style="width: 12.5%;"> +<col style="width: 62.5%;"> +</colgroup> +<thead> +<tr> +<th class="tableblock halign-left valign-top">Parameter</th> +<th class="tableblock halign-left valign-top">Type</th> +<th class="tableblock halign-left valign-top">Default</th> +<th class="tableblock halign-left valign-top">Description</th> +</tr> +</thead> +<tbody> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>name</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the Appender</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>from</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The email address of the sender</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>replyTo</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The comma-separated list of reply-to email addresses</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>to</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The comma-separated list of recipient email addresses</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cc</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The comma-separated list of CC email addresses</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>bcc</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The comma-separated list of BCC email addresses</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>subject</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The subject of the email message</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>bufferSize</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>int</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>512</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The maximum number of log events to be buffered for inclusion in the message</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>layout</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Layout</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code><code>HtmlLayout</code></code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The Layout to use to format the <code>LogEvent</code></p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>filter</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Filter</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">A Filter to determine if the event should be handled by this Appender. +More than one Filter may be used by using a <code>CompositeFilter</code>.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>smtpDebug</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>boolean</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">When set to true enables session debugging on <code>STDOUT</code></p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>smtpHost</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The SMTP hostname to send to.</p> +<p class="tableblock">This parameter is <strong>required</strong>.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>smtpPassword</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The password required to authenticate against the SMTP server</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>smtpPort</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>integer</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The SMTP port to send to</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>smtpProtocol</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>smtp</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The SMTP transport protocol; e.g., <code>smtps</code></p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>smtpUsername</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The username required to authenticate against the SMTP server</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ignoreExceptions</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>boolean</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Indicates if exceptions encountered while appending events to be internally logged and then ignored. +When set to <code>false</code> exceptions will be propagated to the caller, instead. +You must set this to <code>false</code> when wrapping this Appender in a <code>FailoverAppender</code>.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>SSL</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>SslConfiguration</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Contains the configuration for the <code>KeyStore</code> and <code>TrustStore</code>. +See <a href="https://logging.apache.org/log4j/2.x/manual/appenders.html#SSL">SSL Configuration</a>.</p></td> +</tr> +</tbody> +</table> +<div class="listingblock"> +<div class="title">Example <code>log4j.xml</code> demonstrating SMTP Appender usage</div> +<div class="content"> +<pre class="CodeRay highlight"><code><?xml version="1.0" encoding="UTF-8"?> +<Configuration status="warn" name="MyApp"> + + <Appenders> + <SMTP name="Mail" + subject="Error Log" + to="[email protected]" + from="[email protected]" + smtpHost="localhost" + smtpPort="25" + bufferSize="50"> + </SMTP> + </Appenders> + + <Loggers> + <Root level="error"> + <AppenderRef ref="Mail"/> + </Root> + </Loggers> + +</Configuration></code></pre> +</div> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="log4j-jakarta-web">Log4j Jakarta Web</h2> +<div class="sectionbody"> +<div class="sect2"> +<h3 id="log4j-jakarta-web-intro">Using Log4j Core in web applications</h3> +<div class="paragraph"> +<p>Using a logging backend like <strong>Log4j Core</strong> in a Jakarta EE application requires particular care. +Since the lifecycle of a container or web application is independent of the lifecycle of the JVM, it’s important for logging resources to be properly cleaned up (database connections closed, files closed, etc.) when the container or web application shuts down.</p> +</div> +<div class="paragraph"> +<p>The purpose of the <code>log4j-jakarta-web</code> is to register the appropriate hooks into a container’s lifecycle.</p> +</div> +<div class="admonitionblock warning"> +<table> +<tr> +<td class="icon"> +<i class="fa icon-warning" title="Warning"></i> +</td> +<td class="content"> +<div class="paragraph"> +<p>To avoid problems, some Log4j API and Log4j Core features are automatically disabled, when running in a Jakarta EE environment. Most notably:</p> +</div> +<div class="ulist"> +<ul> +<li> +<p>the usage of <code>ThreadLocal</code> and garbage-free logging,</p> +</li> +<li> +<p>the JVM shutdown hook.</p> +</li> +</ul> +</div> +</td> +</tr> +</table> +</div> +</div> +<div class="sect2"> +<h3 id="log4j-jakarta-web-installation">Installation</h3> +<div class="paragraph"> +<p>In order to install <code>log4j-jakarta-web</code> in your Web application, you need to add it as runtime dependency:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag"><dependency></span> + <span class="tag"><groupId></span>org.apache.logging.log4j<span class="tag"></groupId></span> + <span class="tag"><artifactId></span>log4j-jakarta-web<span class="tag"></artifactId></span> + <span class="tag"><version></span>3.0.0-SNAPSHOT<span class="tag"></version></span> + <span class="tag"><scope></span>runtime<span class="tag"></scope></span> +<span class="tag"></dependency></span></code></pre> +</div> +</div> +</div> +<div class="sect2"> +<h3 id="log4j-jakarta-web-configuration">Lifecycle hooks and configuration</h3> +<div class="paragraph"> +<p>In a Jakarta EE 9 environment, Log4j Jakarta Web automatically registers a <a href="https://jakarta.ee/specifications/servlet/5.0/apidocs/jakarta/servlet/servletcontainerinitializer">ServletContainerInitializer</a> that takes care of the Log4j Core startup, configuration and shutdown. The initializer can be configured through these <a href="https://jakarta.ee/specifications/servlet/5.0/jakarta-servlet-spec-5.0#initialization-parameters">servlet context initialization parameters</a>, w [...] +</div> +<table class="tableblock frame-all grid-all stretch"> +<caption class="title">Table 3. Servlet context initialization parameters</caption> +<colgroup> +<col style="width: 14.2857%;"> +<col style="width: 14.2857%;"> +<col style="width: 71.4286%;"> +</colgroup> +<thead> +<tr> +<th class="tableblock halign-left valign-top">Parameter</th> +<th class="tableblock halign-left valign-top">Default</th> +<th class="tableblock halign-left valign-top">Description</th> +</tr> +</thead> +<tbody> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>isLog4jAutoInitializationDisabled</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">If set to <code>true</code> disables the <code>ServletContainerInitializer</code>.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>isLog4jAutoShutdownDisabled</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">If set to <code>true</code> disables the shutdown of the logger context.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>log4j.stop.timeout.timeunit</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>SECONDS</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/TimeUnit.html">TimeUnit</a> used to express the shutdown timeout.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>log4j.stop.timeout</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>30</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The shutdown timeout.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>log4jContextName</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> +<p>Specifies the name of the logger context to use.</p> +</div> +<div class="paragraph"> +<p>It must be <strong>explicitly specified</strong> if <code>JndiContextSelector</code> is used.</p> +</div> +<div class="paragraph"> +<p>The default value is:</p> +</div> +<div class="olist arabic"> +<ol class="arabic"> +<li> +<p>the servlet context name, if present,</p> +</li> +<li> +<p>the servlet context path, otherwise.</p> +</li> +</ol> +</div></div></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>isLog4jContextSelectorNamed</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Must be set to <code>true</code> if Log4j Core uses a <code>JndiContextSelector</code>.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>log4jConfiguration</code></p></td> +<td class="tableblock halign-left valign-top"></td> +<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph"> +<p>The location of a Log4j Core configuration file. +If no value is provided:</p> +</div> +<div class="olist arabic"> +<ol class="arabic"> +<li> +<p>Log4j Jakarta Web looks for a file named <code>/WEB-INFlog4j2-<name>.<extension></code>, where <code><name></code> is the name of the logger context,</p> +</li> +<li> +<p>if no such file exists it looks for a file named <code>/WEB-INF/log4j2.<extension></code>,</p> +</li> +<li> +<p>otherwise Log4j Core uses the <a href="https://logging.apache.org/log4j/2.x/manual/configuration.html#automatic-configuration">automatic configuration procedure</a>.</p> +</li> +</ol> +</div></div></td> +</tr> +</tbody> +</table> +<div class="admonitionblock warning"> +<table> +<tr> +<td class="icon"> +<i class="fa icon-warning" title="Warning"></i> +</td> +<td class="content"> +<div class="paragraph"> +<p>The Log4j Jakarta Web JAR file is a web-fragment configured to run before any other web fragments in your application.</p> +</div> +<div class="paragraph"> +<p>While this guarantees that Log4j Core starts before all other initializers and listeners, the Servlet 5.0 Specification (cf. <a href="https://jakarta.ee/specifications/servlet/5.0/jakarta-servlet-spec-5.0#Assembling_the_descriptor">section 8.2.3</a>) does not give guarantees that Log4j Core will shutdown after all servlet context listeners.</p> +</div> +<div class="paragraph"> +<p>If the shutdown order is important, users must create a <code>web.xml</code> descriptor and add the <code>Log4jServletContextListener</code> explicitly:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag"><listener></span> + <span class="tag"><listener-class></span> + org.apache.logging.log4j.web.Log4jServletContextListener + <span class="tag"></listener-class></span> +<span class="tag"></listener></span></code></pre> +</div> +</div> +</td> +</tr> +</table> +</div> +<div class="sect3"> +<h4 id="log4j-jakarta-web-jndi-configuration">JNDI configuration</h4> +<div class="paragraph"> +<p>Log4j Core allows the usage of JNDI to coordinate the usage of logger contexts in a Jakarta EE application server. +In order to use this feature, you need to:</p> +</div> +<div class="olist arabic"> +<ol class="arabic"> +<li> +<p>Install the <code>log4j-jndi</code> module.</p> +</li> +<li> +<p>Switch to the <code>JndiContextSelector</code>, by setting the <code>log4j2.*.LoggerContext.selector</code> Log4j property to <code>org.apache.logging.log4j.jndi.selector.JndiContextSelector</code>,</p> +</li> +<li> +<p>For security reasons you need to enable the selector, by setting the <code>log4j2.*.JNDI.contextSelector</code> Log4j property to <code>true</code>,</p> +</li> +<li> +<p>Each web application needs to configure the servlet context parameter <code>isLog4jContextSelectorNamed</code> to <code>true</code> and provide a value for the <code>log4jContextName</code> servlet context parameter and <code>java:comp/env/log4j/context-name</code> JNDI environment entry:</p> +</li> +</ol> +</div> +<div class="listingblock"> +<div class="content"> +<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag"><web-app></span> + <span class="tag"><context-param></span> + <span class="tag"><param-name></span>isLog4jContextSelectorNamed<span class="tag"></param-name></span> + <span class="tag"><param-value></span>true<span class="tag"></param-value></span> + <span class="tag"></context-param></span> + <span class="tag"><context-param></span> + <span class="tag"><param-name></span>log4jContextName<span class="tag"></param-name></span> + <span class="tag"><param-value></span>your_application_name<span class="tag"></param-value></span> + <span class="tag"></context-param></span> + <span class="tag"><env-entry></span> + <span class="tag"><env-entry-name></span>log4j/context-name<span class="tag"></env-entry-name></span> + <span class="tag"><env-entry-value></span>your_application_name<span class="tag"></env-entry-value></span> + <span class="tag"><env-entry-type></span>java.lang.String<span class="tag"></env-entry-type></span> + <span class="tag"></env-entry></span> +<span class="tag"></web-app></span></code></pre> +</div> +</div> +</div> +</div> +<div class="sect2"> +<h3 id="log4j-jakarta-web-lookup">Web lookup</h3> +<div class="paragraph"> +<p>Log4j Jakarta Web also provides a <code>${web:…​}</code> lookup</p> +</div> +<table class="tableblock frame-all grid-all stretch"> +<caption class="title">Table 4. Web lookup supported keys</caption> +<colgroup> +<col style="width: 16.6666%;"> +<col style="width: 83.3334%;"> +</colgroup> +<thead> +<tr> +<th class="tableblock halign-left valign-top">Key</th> +<th class="tableblock halign-left valign-top">Description</th> +</tr> +</thead> +<tbody> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>attr.<key></code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Value of the <code><key</code>> servlet context attribute.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>contextPathName</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The <strong>first</strong> fragment of the servlet context path.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>contextPath</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The <strong>entire</strong> servlet context path.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cookie.<key></code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Value of the <code><key></code> HTTP cookie.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>effectiveMajorVersion</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The major version of the Servlet specification supported by the application.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>effectiveMinorVersion</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The minor version of the Servlet specification supported by the application.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>header.<key></code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Value of the <code><key></code> request HTTP header.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>initParam.<key></code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Value of the <code><key></code> servlet context initialization parameter.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>majorVersion</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The major version of the Servlet specification supported by the server.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>minorVersion</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The minor version of the Servlet specification supported by the server.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>request.attr.<key></code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Value of the <code><key></code> servlet request attribute.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>request.method</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">HTTP request method.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>request.parameter.<key></code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Value of the <code><key></code> servlet request parameter.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>request.principal</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Servlet request principal.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>request.remoteAddress</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Servlet request remote address.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>request.remoteHost</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Servlet request remote host.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>request.remotePort</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Servlet request remote port.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>request.uri</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Servlet request URI.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>request.url</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Servlet request URL.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>rootDir</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The root directory of the servlet context.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>serverInfo</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The server info.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>servletContextName</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The servlet context name.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>session.attr.<key></code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Value of the <code><key></code> servlet session attribute.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code>session.id</code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">Servlet session id.</p></td> +</tr> +<tr> +<td class="tableblock halign-left valign-top"><p class="tableblock"><code><key></code></p></td> +<td class="tableblock halign-left valign-top"><p class="tableblock">The value of <code><key></code> is searched as context attribute or context initialization parameter.</p></td> +</tr> +</tbody> +</table> +</div> +<div class="sect2"> +<h3 id="log4j-jakarta-web-async">Asynchronous Requests and Threads</h3> +<div class="paragraph"> +<p>The handling of asynchronous requests is tricky, and regardless of Servlet container version or configuration Log4j cannot handle everything automatically. +When standard requests, forwards, includes, and error resources are processed, the <code>Log4jServletFilter</code> binds the <code>LoggerContext</code> to the thread handling the request. +After request processing completes, the filter unbinds the <code>LoggerContext</code> from the thread.</p> +</div> +<div class="paragraph"> +<p>Similarly, when an internal request is dispatched using a +<code>javax.servlet.AsyncContext</code>, the <code>Log4jServletFilter</code> also binds the +<code>LoggerContext</code> to the thread handling the request and unbinds it when +request processing completes. However, this only happens for requests +<em>dispatched</em> through the <code>AsyncContext</code>. There are other asynchronous +activities that can take place other than internal dispatched requests.</p> +</div> +<div class="paragraph"> +<p>For example, after starting an <code>AsyncContext</code> you could start up a +separate thread to process the request in the background, possibly +writing the response with the <code>ServletOutputStream</code>. Filters cannot +intercept the execution of this thread. Filters also cannot intercept +threads that you start in the background during non-asynchronous +requests. This is true whether you use a brand new thread or a thread +borrowed from a thread pool. So what can you do for these special +threads?</p> +</div> +<div class="paragraph"> +<p>You may not need to do anything. If you didn’t use the +<code>isLog4jContextSelectorNamed</code> context parameter, there is no need to +bind the <code>LoggerContext</code> to the thread. Log4j can safely locate the +<code>LoggerContext</code> on its own. In these cases, the filter provides only +very modest performance gains, and only when creating new <code>Logger</code> instances. +However, if you <em>did</em> specify the <code>isLog4jContextSelectorNamed</code> context +parameter with the value "true", you will need to manually bind the +<code>LoggerContext</code> to asynchronous threads. Otherwise, Log4j will not be +able to locate it.</p> +</div> +<div class="paragraph"> +<p>Thankfully, Log4j provides a simple mechanism for binding the +<code>LoggerContext</code> to asynchronous threads in these special circumstances. +The simplest way to do this is to wrap the <code>Runnable</code> instance that is +passed to the <code>AsyncContext.start()</code> method.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">import</span> <span class="include">java.io.IOException</span>; +<span class="keyword">import</span> <span class="include">javax.servlet.AsyncContext</span>; +<span class="keyword">import</span> <span class="include">javax.servlet.ServletException</span>; +<span class="keyword">import</span> <span class="include">javax.servlet.http.HttpServlet</span>; +<span class="keyword">import</span> <span class="include">javax.servlet.http.HttpServletRequest</span>; +<span class="keyword">import</span> <span class="include">javax.servlet.http.HttpServletResponse</span>; + +<span class="keyword">import</span> <span class="include">org.apache.logging.log4j.LogManager</span>; +<span class="keyword">import</span> <span class="include">org.apache.logging.log4j.Logger</span>; +<span class="keyword">import</span> <span class="include">org.apache.logging.log4j.web.WebLoggerContextUtils</span>; + +<span class="directive">public</span> <span class="type">class</span> <span class="class">TestAsyncServlet</span> <span class="directive">extends</span> HttpServlet { + + <span class="annotation">@Override</span> + <span class="directive">protected</span> <span class="type">void</span> doGet(<span class="directive">final</span> HttpServletRequest req, <span class="directive">final</span> HttpServletResponse resp) <span class="directive">throws</span> ServletException, <span class="exception">IOException</span> { + <span class="directive">final</span> AsyncContext asyncContext = req.startAsync(); + asyncContext.start(WebLoggerContextUtils.wrapExecutionContext(<span class="local-variable">this</span>.getServletContext(), <span class="keyword">new</span> <span class="predefined-type">Runnable</span>() { + <span class="annotation">@Override</span> + <span class="directive">public</span> <span class="type">void</span> run() { + <span class="directive">final</span> <span class="predefined-type">Logger</span> logger = <span class="predefined-type">LogManager</span>.getLogger(TestAsyncServlet.class); + logger.info(<span class="string"><span class="delimiter">"</span><span class="content">Hello, servlet!</span><span class="delimiter">"</span></span>); + } + })); + } + + <span class="annotation">@Override</span> + <span class="directive">protected</span> <span class="type">void</span> doPost(<span class="directive">final</span> HttpServletRequest req, <span class="directive">final</span> HttpServletResponse resp) <span class="directive">throws</span> ServletException, <span class="exception">IOException</span> { + <span class="directive">final</span> AsyncContext asyncContext = req.startAsync(); + asyncContext.start(<span class="keyword">new</span> <span class="predefined-type">Runnable</span>() { + <span class="annotation">@Override</span> + <span class="directive">public</span> <span class="type">void</span> run() { + <span class="directive">final</span> Log4jWebSupport webSupport = + WebLoggerContextUtils.getWebLifeCycle(TestAsyncServlet.this.getServletContext()); + webSupport.setLoggerContext(); + <span class="comment">// do stuff</span> + webSupport.clearLoggerContext(); + } + }); + } +}</code></pre> +</div> +</div> +<div class="paragraph"> +<p>This can be slightly more convenient when using Java 1.8 and lambda +functions as demonstrated below.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">import</span> <span class="include">java.io.IOException</span>; +<span class="keyword">import</span> <span class="include">javax.servlet.AsyncContext</span>; +<span class="keyword">import</span> <span class="include">javax.servlet.ServletException</span>; +<span class="keyword">import</span> <span class="include">javax.servlet.http.HttpServlet</span>; +<span class="keyword">import</span> <span class="include">javax.servlet.http.HttpServletRequest</span>; +<span class="keyword">import</span> <span class="include">javax.servlet.http.HttpServletResponse</span>; + +<span class="keyword">import</span> <span class="include">org.apache.logging.log4j.LogManager</span>; +<span class="keyword">import</span> <span class="include">org.apache.logging.log4j.Logger</span>; +<span class="keyword">import</span> <span class="include">org.apache.logging.log4j.web.WebLoggerContextUtils</span>; + +<span class="directive">public</span> <span class="type">class</span> <span class="class">TestAsyncServlet</span> <span class="directive">extends</span> HttpServlet { + <span class="annotation">@Override</span> + <span class="directive">protected</span> <span class="type">void</span> doGet(HttpServletRequest req, HttpServletResponse resp) <span class="directive">throws</span> ServletException, <span class="exception">IOException</span> { + <span class="directive">final</span> AsyncContext asyncContext = req.startAsync(); + asyncContext.start(WebLoggerContextUtils.wrapExecutionContext(<span class="local-variable">this</span>.getServletContext(), () -> { + <span class="directive">final</span> <span class="predefined-type">Logger</span> logger = <span class="predefined-type">LogManager</span>.getLogger(TestAsyncServlet.class); + logger.info(<span class="string"><span class="delimiter">"</span><span class="content">Hello, servlet!</span><span class="delimiter">"</span></span>); + })); + } +}</code></pre> +</div> +</div> +<div class="paragraph"> +<p>Alternatively, you can obtain the +<a href="../log4j-web/apidocs/org/apache/logging/log4j/web/Log4jWebLifeCycle.html"><code>Log4jWebLifeCycle</code></a> +instance from the <code>ServletContext</code> attributes, call its +<code>setLoggerContext</code> method as the very first line of code in your +asynchronous thread, and call its <code>clearLoggerContext</code> method as the +very last line of code in your asynchronous thread. The following code +demonstrates this. It uses the container thread pool to execute +asynchronous request processing, passing an anonymous inner <code>Runnable</code> +to the <code>start</code> method.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">import</span> <span class="include">java.io.IOException</span>; +<span class="keyword">import</span> <span class="include">javax.servlet.AsyncContext</span>; +<span class="keyword">import</span> <span class="include">javax.servlet.ServletException</span>; +<span class="keyword">import</span> <span class="include">javax.servlet.http.HttpServlet</span>; +<span class="keyword">import</span> <span class="include">javax.servlet.http.HttpServletRequest</span>; +<span class="keyword">import</span> <span class="include">javax.servlet.http.HttpServletResponse</span>; + +<span class="keyword">import</span> <span class="include">org.apache.logging.log4j.LogManager</span>; +<span class="keyword">import</span> <span class="include">org.apache.logging.log4j.Logger</span>; +<span class="keyword">import</span> <span class="include">org.apache.logging.log4j.web.Log4jWebLifeCycle</span>; +<span class="keyword">import</span> <span class="include">org.apache.logging.log4j.web.WebLoggerContextUtils</span>; + +<span class="directive">public</span> <span class="type">class</span> <span class="class">TestAsyncServlet</span> <span class="directive">extends</span> HttpServlet { + <span class="annotation">@Override</span> + <span class="directive">protected</span> <span class="type">void</span> doGet(HttpServletRequest req, HttpServletResponse resp) <span class="directive">throws</span> ServletException, <span class="exception">IOException</span> { + <span class="directive">final</span> AsyncContext asyncContext = req.startAsync(); + asyncContext.start(<span class="keyword">new</span> <span class="predefined-type">Runnable</span>() { + <span class="annotation">@Override</span> + <span class="directive">public</span> <span class="type">void</span> run() { + <span class="directive">final</span> Log4jWebLifeCycle webLifeCycle = + WebLoggerContextUtils.getWebLifeCycle(TestAsyncServlet.this.getServletContext()); + webLifeCycle.setLoggerContext(); + <span class="keyword">try</span> { + <span class="directive">final</span> <span class="predefined-type">Logger</span> logger = <span class="predefined-type">LogManager</span>.getLogger(TestAsyncServlet.class); + logger.info(<span class="string"><span class="delimiter">"</span><span class="content">Hello, servlet!</span><span class="delimiter">"</span></span>); + } <span class="keyword">finally</span> { + webLifeCycle.clearLoggerContext(); + } + } + }); + } +}</code></pre> +</div> +</div> +<div class="paragraph"> +<p>Note that you <em>must</em> call <code>clearLoggerContext</code> once your thread is +finished processing. Failing to do so will result in memory leaks. If +using a thread pool, it can even disrupt the logging of other web +applications in your container. For that reason, the example here shows +clearing the context in a <code>finally</code> block, which will always execute.</p> +</div> +</div> +<div class="sect2"> +<h3 id="log4j-jakarta-web-appender">Servlet Appender</h3> +<div class="paragraph"> +<p>Log4j Jakarta Web provides a Servlet Appender that uses the servlet context as the log target. +For example:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag"><Configuration</span> <span class="attribute-name">status</span>=<span class="string"><span class="delimiter">"</span><span class="content">WARN</span><span class="delimiter">"</span></span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">ServletTest</span><span class="delimiter">"</span></span><span class="tag">></span> + + <span class="tag"><Appenders></span> + <span class="tag"><Servlet</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">Servlet</span><span class="delimiter">"</span></span><span class="tag">></span> + <span class="tag"><PatternLayout</span> <span class="attribute-name">pattern</span>=<span class="string"><span class="delimiter">"</span><span class="content">%m%n%ex{none}</span><span class="delimiter">"</span></span><span class="tag">/></span> + <span class="tag"></Servlet></span> + <span class="tag"></Appenders></span> + + <span class="tag"><Loggers></span> + <span class="tag"><Root</span> <span class="attribute-name">level</span>=<span class="string"><span class="delimiter">"</span><span class="content">debug</span><span class="delimiter">"</span></span><span class="tag">></span> + <span class="tag"><AppenderRef</span> <span class="attribute-name">ref</span>=<span class="string"><span class="delimiter">"</span><span class="content">Servlet</span><span class="delimiter">"</span></span><span class="tag">/></span> + <span class="tag"></Root></span> + <span class="tag"></Loggers></span> + +<span class="tag"></Configuration></span></code></pre> +</div> +</div> +<div class="paragraph"> +<p>To avoid double logging of exceptions to the servlet context, you must +use <code>%ex{none}</code> in your <code>PatternLayout</code> as shown in the example. The +exception will be omitted from the message text but it is passed to the +servlet context as the actual <code>Throwable</code> object.</p> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="development">Development</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>Log4j Jakarta uses <a href="https://github.com/apache/logging-log4j-jakarta">GitHub</a> for source code management.</p> +</div> +<div class="paragraph"> +<p>The project requires a Java compiler matching the <code>[17,18)</code> range and targets Java <code>8</code>.</p> +</div> +<div class="paragraph"> +<p>You can build and verify sources using:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre class="CodeRay highlight"><code data-lang="bash">./mvnw verify</code></pre> +</div> +</div> +<div class="paragraph"> +<p>You can build and view the website as follows:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre class="CodeRay highlight"><code data-lang="bash">./mvnw -N site +python -m http.server -d target/site</code></pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="distribution">Distribution</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>In accordance with the Apache Software Foundation’s release <a href="https://infra.apache.org/release-distribution.html">distribution policy</a> and <a href="https://infra.apache.org/release-publishing.html">creation process</a>, project artifacts are <em>officially</em> accessible from the following locations:</p> +</div> +<div class="ulist"> +<ul> +<li> +<p>ASF <a href="https://repository.apache.org/content/repositories/releases">Release</a> and <a href="https://repository.apache.org/content/repositories/snapshots">snapshot</a> repositories (mirrored to <a href="https://central.sonatype.dev/">the Maven Central Repository</a>)</p> +</li> +<li> +<p>ASF <a href="https://downloads.apache.org/logging/log4j-jakarta">Distribution directory</a></p> +</li> +</ul> +</div> +<div class="paragraph"> +<p>See <a href="#release-instructions">the release instructions</a> for details.</p> +</div> +<div class="sect2"> +<h3 id="maven-bom">Maven Bill of Materials (BOM)</h3> +<div class="paragraph"> +<p>To keep your Log4j Jakarta module versions aligned, a <a href="https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#bill-of-materials-bom-poms">Maven Bill of Materials (BOM) POM</a> is provided for your convenience.</p> +</div> +<div class="paragraph"> +<p>To use this with Maven, add the dependency listed below to your <code>pom.xml</code> file. +Note that the <code><dependencyManagement></code> nesting and the <code><scope>import</scope></code> instruction. +This will <em>import</em> all modules bundled with the associated Log4j release to your <code>dependencyManagement</code>. +As a result, you don’t have to specify versions of the imported modules (<code>log4j-jakarta-smtp</code>, etc.) while using them as a <code><dependency></code>.</p> +</div> +<div class="listingblock"> +<div class="title"><code>pom.xml</code> snippet importing <code>log4j-jakarta-bom</code></div> +<div class="content"> +<pre class="CodeRay highlight"><code><dependencyManagement> + <dependencies> + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-jakarta-bom</artifactId> + <version>3.0.0-SNAPSHOT</version> + <scope>import</scope> + <type>pom</type> + </dependency> + </dependencies> +</dependencyManagement></code></pre> +</div> +</div> +</div> +<div class="sect2"> +<h3 id="cyclonedx-sbom">CycloneDX Software Bill of Materials (SBOM)</h3> +<div class="paragraph"> +<p>Starting with version <code>0.6.0</code>, Log4j Jakarta distributes <a href="https://cyclonedx.org/capabilities/sbom/">CyclenoDX Software Bill of Materials (SBOM)</a> along with each deployed artifact. +This is streamlined by <code>logging-parent</code>, see <a href="https://logging.apache.org/logging-parent/latest/#cyclonedx-sbom">its website</a> for details.</p> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="support">Support</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>Please keep in mind that this project is intended for internal usage only. +You can use GitHub Issues for feature requests and bug reports – not questions! +See <a href="https://logging.apache.org/log4j/2.x/support.html">the Log4j support policy</a> for details.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="security">Security</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>If you have encountered an unlisted security vulnerability or other unexpected behaviour that has security impact, please report them privately to <a href="mailto:[email protected]">the Log4j security mailing list</a>. +See <a href="https://logging.apache.org/log4j/2.x/security.html">the Log4j Security page</a> for further details.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="release-notes">Release Notes</h2> +<div class="sectionbody"> +<div class="sect2"> +<h3 id="release-notes-3-x-x">3.x.x</h3> +<div class="paragraph"> +<p>This minor release contains various bug fixes and improvements.</p> +</div> +<div class="sect3"> +<h4 id="_added">Added</h4> +<div class="ulist"> +<ul> +<li> +<p>Allow web lookup to access more information. (<a href="https://issues.apache.org/jira/browse/LOG4J2-2523">LOG4J2-2523</a>)</p> +</li> +<li> +<p>Convert <code>log4j-jms</code> based on Java EE 8+ to <code>log4j-jakarta-jms</code> based on Jakarta EE 9+ (<a href="https://github.com/apache/logging-log4j2/issues/1966">#1966</a>)</p> +</li> +</ul> +</div> +</div> +<div class="sect3"> +<h4 id="_changed">Changed</h4> +<div class="ulist"> +<ul> +<li> +<p>Fork Jakarta-specific components from <code>logging-log4j2</code> repository to <code>logging-log4j-jakarta</code> (<a href="https://github.com/apache/logging-log4j2/issues/1966">#1966</a>)</p> +</li> +</ul> +</div> +</div> +<div class="sect3"> +<h4 id="_removed">Removed</h4> +<div class="ulist"> +<ul> +<li> +<p>Remove <code>log4j-jms</code> based on Java EE 8+ (<a href="https://github.com/apache/logging-log4j2/issues/1966">#1966</a>)</p> +</li> +</ul> +</div> +</div> +<div class="sect3"> +<h4 id="_fixed">Fixed</h4> +<div class="ulist"> +<ul> +<li> +<p>Only shutdown Log4j after last <code>Log4jServletContextListener</code> is executed. (<a href="https://github.com/apache/logging-log4j2/issues/1782">1782</a>)</p> +</li> +</ul> +</div> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="release-instructions">Release instructions</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>Log4j Jakarta employs the CI/CD foundation provided by the <a href="https://logging.apache.org/logging-parent"><code>logging-parent</code></a>. +You can simply use its release instructions.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="license">License</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. +See <code>NOTICE.txt</code> distributed with this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. +You may obtain a copy of the License at <a href="https://www.apache.org/licenses/LICENSE-2.0" class="bare">https://www.apache.org/licenses/LICENSE-2.0</a>.</p> +</div> +<div class="paragraph"> +<p>Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and limitations under the License.</p> +</div> +</div> +</div> +</div> +<div id="footer"> +<div id="footer-text"> +Last updated 2023-11-16 15:05:33 +0100 +</div> +</div> +</body> +</html> \ No newline at end of file diff --git a/latest b/latest new file mode 120000 index 0000000..aaedd87 --- /dev/null +++ b/latest @@ -0,0 +1 @@ +3.x \ No newline at end of file
