<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Apache Logging Services</title>

    <link href="/css/asciidoctor-default.css" rel="stylesheet" type="text/css" />
    <link href="/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
    <link href="/css/site.css?version=20231214" rel="stylesheet" type="text/css" />

    <script src="/js/jquery.min.js"></script>
    <script src="/js/bootstrap.min.js"></script>
    <script src="/js/site.js"></script>
    <link rel="alternate" type="application/rss+xml" title="ASF Loggin Services" href="/feed.xml">
</head>


<body>
<div class="navbar">
    <div class="navbar-inner">
        <div class="container">
            <a class="brand" href="/">Apache Logging Services&trade;</a>
            <ul class="nav">
                <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">About<b class="caret"></b></a>
                    <ul class="dropdown-menu">
                        <li><a href="/guidelines.html">Guidelines</a></li>
                        <li><a href="/charter.html">Charter</a></li>
                        <li><a href="/team-list.html">Team</a></li>
                        <li><a href="/processes.html">Retirement Processes</a>
                        <li><a target="_blank" href="https://cwiki.apache.org/confluence/display/LOGGING/Home">Wiki</a>
                        <li><a href="/what-is-logging.html">What is logging?</a></li>
                        <li><a href="/activity-monitor">Activity monitor</a></li>
                    </ul>
                </li>
            </ul>
            <ul class="nav">
                <li><a href="/download.html">Download</a></li>
            </ul>
            <ul class="nav">
                <li><a href="/support.html">Support</a></li>
            </ul>
            <ul class="nav">
                <li><a href="/security.html">Security</a></li>
            </ul>
            <ul class="nav">
                <li><a href="/xml/ns">XML Schemas</a></li>
            </ul>
            <ul class="nav pull-right">
                <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache<b class="caret"></b></a>
                    <ul class="dropdown-menu">
                        <li><a target="_blank" href="https://www.apache.org/">Home</a></li>
                        <li><a target="_blank" href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
                        <li><a target="_blank" href="https://www.apache.org/licenses/">License</a></li>
                        <li><a target="_blank" href="https://www.apache.org/foundation/thanks.html">Thanks</a></li>
                        <li><a target="_blank" href="https://www.apache.org/events/current-event.html">Current Events</a></li>
                        <li><a target="_blank" href="https://www.apache.org/security/">Security</a></li>
                        <li><a target="_blank" href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy</a></li>
                    </ul>
                </li>
            </ul>
            <ul class="nav pull-right">
                <li><a href="/blog">Blog</a></li>
            </ul>
        </div>
    </div>
</div>


<div class="container">
    <div class="content">
        <div class="hero-unit">
  <div class="pull-right"><img class="logo" src="img/feather.gif" /></div>
  <h1>Apache Logging Services</h1>
  <p>The Apache Logging Services project creates and maintains open-source software related to the logging of
    application behavior and released at no charge to the public.</p>
</div>


<div class="latest-post">
    
    <div class="latest-post-date">18 Dec 2023</div>
    <div class="latest-post-news"><a href="/blog/2023/12/18/20-years-of-innovation.html">Celebrating Two Decades of Innovation with Apache Log4j</a></div>
</div>


<div class="projects">
  <h3>Logging Frameworks</h3>

  
    
    <div class="project">
      <h2>Log4j®</h2>
      <p>A versatile, industrial-grade Java logging framework composed of an API, its implementation, and components to assist the deployment for various use cases.</p>
      <p><a target="_blank" class="btn" href="/log4j">Project site &raquo;</a></p>
    </div>
    
  
    
    <div class="project">
      <h2>Log4j® Kotlin</h2>
      <p>A Kotlin-friendly interface to log against the Log4j® API.</p>
      <p><a target="_blank" class="btn" href="/log4j/kotlin">Project site &raquo;</a></p>
    </div>
    
  
    
    <div class="project">
      <h2>Log4j® Scala</h2>
      <p>A Scala-friendly interface to log against the Log4j® API.</p>
      <p><a target="_blank" class="btn" href="/log4j/scala">Project site &raquo;</a></p>
    </div>
    
  
    
    <div class="project">
      <h2>Log4cxx</h2>
      <p>A logging framework for C++ patterned after Log4j®.</p>
      <p><a target="_blank" class="btn" href="/log4cxx">Project site &raquo;</a></p>
    </div>
    
  
    
  
    
  
    
  
    
    <div class="project">
      <h2>Log4Net</h2>
      <p>A port of the Log4j® to the Microsoft .NET runtime.</p>
      <p><a target="_blank" class="btn" href="/log4net">Project site &raquo;</a></p>
    </div>
    
  
    
  
    
  
    
  

  <h3>Advanced Log Processing</h3>

  
    
  
    
  
    
  
    
  
    
  
    
    <div class="project">
      <h2>Log4j® Audit</h2>
      <p>Audit logging framework built upon Apache Log4j®.</p>
      <p><a target="_blank" class="btn" href="/log4j-audit/latest">Project site &raquo;</a></p>
    </div>
    
  
    
    <div class="project">
      <h2>Flume</h2>
      <p>Distributed, reliable, and available service for efficiently collecting, aggregating, and moving large amounts of log data.</p>
      <p><a target="_blank" class="btn" href="https://flume.apache.org">Project site &raquo;</a></p>
    </div>
    
  
    
  
    
  
    
  
    
  

  <h3>Others</h3>
  <div class="project">
    <h2>Dormant Projects</h2>
    <p>Logging Services projects that are no longer actively maintained.</p>
    <p><a class="btn" href="dormant.html">See dormant projects &raquo;</a></p>
  </div>
</div>

    </div>    
</div>


<div class="footer">
    <div class="container">
        <p>
            Copyright © 2017-2024 <a href="https://www.apache.org" target="external">The Apache Software Foundation</a>.
            Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0"
            target="external">Apache Software License, Version 2.0</a> Please read our <a href="https://privacy.apache.org/policies/privacy-policy-public.html">privacy policy</a>.
        </p><p>
            Apache, Chainsaw, log4cxx, Log4j, Log4net, log4php and the Apache 
            feather logo are trademarks or registered trademarks of The Apache 
            Software Foundation.
            Oracle and Java are registered trademarks
            of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.
        </p>
    </div>
</div>
<!-- Matomo -->
<script>
  var _paq = window._paq = window._paq || [];
  _paq.push(["disableCookies"]);
  _paq.push(['trackPageView']);
  _paq.push(['enableLinkTracking']);
  (function() {
    var u="https://analytics.apache.org/";
    _paq.push(['setTrackerUrl', u+'matomo.php']);
    _paq.push(['setSiteId', '42']);
    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
    g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
  })();
</script>
<noscript><p><img src="https://analytics.apache.org/matomo.php?idsite=42&amp;rec=1" style="border:0;" alt="" /></p></noscript>
<!-- End Matomo Code -->
</body>
</html>
