I do not think this should be marker "experimental".

If it is brought into trunk for 2.1 and we have a beta, we can say, this
and that are new, it's a beta.

Gary

---------- Forwarded message ----------
From: <[email protected]>
Date: Wed, Sep 17, 2014 at 11:45 AM
Subject: [1/3] git commit: LOG4J2-431 MemoryMappedFileAppender manual page
To: [email protected]


Repository: logging-log4j2
Updated Branches:
  refs/heads/LOG4J2-431 64369f3d7 -> 63aed83d6


LOG4J2-431 MemoryMappedFileAppender manual page

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit:
http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/80dafe9e
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/80dafe9e
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/80dafe9e

Branch: refs/heads/LOG4J2-431
Commit: 80dafe9e85c28f89d5b4d411d8b28c33642f411f
Parents: 64369f3
Author: rpopma <[email protected]>
Authored: Thu Sep 18 00:42:50 2014 +0900
Committer: rpopma <[email protected]>
Committed: Thu Sep 18 00:42:50 2014 +0900

----------------------------------------------------------------------
 src/site/xdoc/manual/appenders.xml | 131 ++++++++++++++++++++++++++++++++
 1 file changed, 131 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/80dafe9e/src/site/xdoc/manual/appenders.xml
----------------------------------------------------------------------
diff --git a/src/site/xdoc/manual/appenders.xml
b/src/site/xdoc/manual/appenders.xml
index 032983b..7d47f78 100644
--- a/src/site/xdoc/manual/appenders.xml
+++ b/src/site/xdoc/manual/appenders.xml
@@ -1320,6 +1320,137 @@ public class JpaLogEntity extends
AbstractLogEventWrapperEntity {
     ...
 }]]></pre>
         </subsection>
+      <a name="MemoryMappedFileAppender" />
+      <subsection name="MemoryMappedFileAppender">
+        <p><i>Experimental. This has been tested on several platforms, but
this is
+          a new component (since 2.1) and does not yet have much track
record.</i></p>
+        <p>
+          The MemoryMappedFileAppender maps a part of the specified file
into memory
+          and writes log events to this memory, relying on the operating
system's
+          virtual memory manager to synchronize the changes to the storage
device.
+          The main benefit of doing this is I/O performance. Instead of
making system
+          calls to write to disk, this appender can simply change the
program's local memory,
+          which is orders of magnitude faster. Also, in most operating
systems the memory
+          region mapped actually is the kernel's <a href="
http://en.wikipedia.org/wiki/Page_cache";>page
+          cache</a> (file cache), meaning that no copies need to be
created in user space.
+          (TODO: performance tests that compare performance of this
appender to
+          RandomAccessFileAppender and FileAppender.)
+        </p>
+        <p>
+          There is some overhead with mapping a file region into memory,
+          especially very large regions (half a gigabyte or more).
+          The default region size is 32 MB, which should strike a
reasonable balance
+          between the frequency and the duration of remap operations.
+          (TODO: performance test remapping various sizes.)
+        </p>
+        <p>
+          Similar to the FileAppender and the RandomAccessFileAppender,
+          MemoryMappedFileAppender uses a MemoryMappedFileManager to
actually perform the
+          file I/O. While MemoryMappedFileAppender from different
Configurations
+          cannot be shared, the MemoryMappedFileManagers can be if the
Manager is
+          accessible. For example, two web applications in a servlet
container can have
+          their own configuration and safely write to the same file if
Log4j
+          is in a ClassLoader that is common to both of them.
+        </p>
+        <table>
+          <caption align="top">MemoryMappedFileAppender
Parameters</caption>
+          <tr>
+            <th>Parameter Name</th>
+            <th>Type</th>
+            <th>Description</th>
+          </tr>
+          <tr>
+            <td>append</td>
+            <td>boolean</td>
+            <td>When true - the default, records will be appended to the
end
+              of the file. When set to false, the file will be cleared
before
+              new records are written.
+            </td>
+          </tr>
+          <tr>
+            <td>fileName</td>
+            <td>String</td>
+            <td>The name of the file to write to. If the file, or any of
its
+              parent directories, do not exist, they will be created.
+            </td>
+          </tr>
+          <tr>
+            <td>filters</td>
+            <td>Filter</td>
+            <td>A Filter to determine if the event should be handled by
this
+              Appender. More than one Filter may be used by using a
CompositeFilter.
+            </td>
+          </tr>
+          <tr>
+            <td>immediateFlush</td>
+            <td>boolean</td>
+            <td>
+              <p>When set to true, each write will be followed by a
+                call to <a href="
http://docs.oracle.com/javase/7/docs/api/java/nio/MappedByteBuffer.html#force()
">MappedByteBuffer.force()</a>.
+            This will guarantee the data is written to the storage device.
+              </p>
+              <p>The default for this parameter is <code>false</code>.
+                This means that the data is written to the storage device
even
+                if the Java process crashes, but there may be data loss if
the
+                operating system crashes. Note that manually forcing a
sync on every
+                log event loses most of the performance benefits of using
a memory mapped file.</p>
+              <p>Flushing after every write is only useful when using this
+              appender with synchronous loggers. Asynchronous loggers and
+              appenders will automatically flush at the end of a batch of
events,
+              even if immediateFlush is set to false. This also guarantees
+              the data is written to disk but is more efficient.
+              </p>
+            </td>
+          </tr>
+          <tr>
+            <td>regionLength</td>
+            <td>int</td>
+            <td>The length of the mapped region, defaults to 32 MB
+              (32 * 1024 * 1024 bytes). This parameter must be a value
+              between 256 and 1,073,741,824 (1 GB or 2^30);
+              values outside this range will be adjusted to the closest
valid
+              value.
+              Log4j will round the specified value up to the nearest power
of two.</td>
+          </tr>
+          <tr>
+            <td>layout</td>
+            <td>Layout</td>
+            <td>The Layout to use to format the LogEvent</td>
+          </tr>
+          <tr>
+            <td>name</td>
+            <td>String</td>
+            <td>The name of the Appender.</td>
+          </tr>
+          <tr>
+            <td>ignoreExceptions</td>
+            <td>boolean</td>
+            <td>The default is <code>true</code>, causing 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
+              <a href="#FailoverAppender">FailoverAppender</a>.</td>
+          </tr>
+        </table>
+        <p>
+          Here is a sample MemoryMappedFile configuration:
+        </p>
+
+          <pre class="prettyprint linenums"><![CDATA[<?xml version="1.0"
encoding="UTF-8"?>
+<Configuration status="warn" name="MyApp" packages="">
+  <Appenders>
+    <MemoryMappedFile name="MyFile" fileName="logs/app.log">
+      <PatternLayout>
+        <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
+      </PatternLayout>
+    </MemoryMappedFile>
+  </Appenders>
+  <Loggers>
+    <Root level="error">
+      <AppenderRef ref="MyFile"/>
+    </Root>
+  </Loggers>
+</Configuration>]]></pre>
+      </subsection>
         <a name="NoSQLAppender"/>
         <subsection name="NoSQLAppender">
           <p>The NoSQLAppender writes log events to a NoSQL database using
an internal lightweight provider interface.




-- 
E-Mail: [email protected] | [email protected]
Java Persistence with Hibernate, Second Edition
<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Reply via email to