<style>
/* Changing the layout to use less space for mobiles */
@media screen and (max-device-width: 480px), screen and (-webkit-min-device-pixel-ratio: 2) {
    #email-body { min-width: 30em !important; }
    #email-page { padding: 8px !important; }
    #email-banner { padding: 8px 8px 0 8px !important; }
    #email-avatar { margin: 1px 8px 8px 0 !important; padding: 0 !important; }
    #email-fields { padding: 0 8px 8px 8px !important; }
    #email-gutter { width: 0 !important; }
}
</style>
<div id="email-body">
<table id="email-wrap" align="center" border="0" cellpadding="0" cellspacing="0" style="background-color:#f0f0f0;color:#000000;width:100%;">
    <tr valign="top">
        <td id="email-page" style="padding:16px !important;">
            <table align="center" border="0" cellpadding="0" cellspacing="0" style="background-color:#ffffff;border:1px solid #bbbbbb;color:#000000;width:100%;">
                <tr valign="top">
                    <td bgcolor="#003366" style="background-color:#003366;color:#ffffff;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;line-height:1;"><img src="http://jira.qos.ch/s/en_USb9v8he-418945332/850/25/_/jira-logo-scaled.png" alt="" style="vertical-align:top;" /></td>
                </tr><tr valign="top">
    <td id="email-banner" style="padding:32px 32px 0 32px;">
        
                
        
        
            <table align="left" border="0" cellpadding="0" cellspacing="0" width="100%" style="width:100%;">
    <tr valign="top">
        <td style="color:#505050;font-family:Arial,FreeSans,Helvetica,sans-serif;padding:0;">
                                        <img id="email-avatar" src="http://jira.qos.ch/secure/useravatar?avatarId=10122" alt="" height="48" width="48" border="0" align="left" style="padding:0;margin: 0 16px 16px 0;" />
                        <div id="email-action" style="padding: 0 0 8px 0;font-size:12px;line-height:18px;">
                                    <a class="user-hover" rel="michal" id="email_michal" href="http://jira.qos.ch/secure/ViewProfile.jspa?name=michal" style="color:#326ca6;">Michal Jacykiewicz</a>
     created <img src="http://jira.qos.ch/images/icons/issuetypes/bug.png" height="16" width="16" border="0" align="absmiddle" alt="Bug"> <a style='color:#326ca6;text-decoration:none;' href='http://jira.qos.ch/browse/LOGBACK-919'>LOGBACK-919</a>
            </div>
                        <div id="email-summary" style="font-size:16px;line-height:20px;padding:2px 0 16px 0;">
                <a style='color:#326ca6;text-decoration:none;' href='http://jira.qos.ch/browse/LOGBACK-919'><strong>SizeAndTimeBasedFNATP.setMaxFileSize ignored</strong></a>
            </div>
                    </td>
    </tr>
</table>
    </td>
</tr>
<tr valign="top">
    <td id="email-fields" style="padding:0 32px 32px 32px;">
        <table border="0" cellpadding="0" cellspacing="0" style="padding:0;text-align:left;width:100%;" width="100%">
            <tr valign="top">
                <td id="email-gutter" style="width:64px;white-space:nowrap;"></td>
                <td>
                    <table border="0" cellpadding="0" cellspacing="0" width="100%">
                        <tr valign="top">
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
        <strong style="font-weight:normal;color:#505050;">Issue Type:</strong>
    </td>
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
                <img src="http://jira.qos.ch/images/icons/issuetypes/bug.png" height="16" width="16" border="0" align="absmiddle" alt="Bug">        Bug
    </td>
</tr>                        <tr valign="top">
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
        <strong style="font-weight:normal;color:#505050;">Affects Versions:</strong>
    </td>
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
                    1.0.13            </td>
</tr>
                        <tr valign="top">
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
        <strong style="font-weight:normal;color:#505050;">Assignee:</strong>
    </td>
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
                                        <a class="user-hover" rel="logback-dev@qos.ch" id="email_logback-dev@qos.ch" href="http://jira.qos.ch/secure/ViewProfile.jspa?name=logback-dev%40qos.ch" style="color:#326ca6;">Logback dev list</a>
                </td>
</tr>                                                <tr valign="top">
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
        <strong style="font-weight:normal;color:#505050;">Components:</strong>
    </td>
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
                    logback-core            </td>
</tr>
                        <tr valign="top">
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
        <strong style="font-weight:normal;color:#505050;">Created:</strong>
    </td>
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
        07/Nov/13 12:22 PM
    </td>
</tr>                        <tr valign="top">
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
        <strong style="font-weight:normal;color:#505050;">Description:</strong>
    </td>
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
        <p style='margin-top:0;margin-bottom:10px;'>The following junit test shows that <tt>RollingFileAppender</tt> along with <tt>TimeBasedRollingPolicy</tt> and <tt>SizeAndTimeBasedFNATP</tt> do ignore maxFileSize property.</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
java.lang.AssertionError: test.log size is 25.7MB which is 71.6% more than 15.0MB requested
java.lang.AssertionError: test.log size is 27.7MB which is 176.9% more than 10.0MB requested
</pre>
</div></div>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
<span class="code-keyword">package</span> third.party.logback;

<span class="code-keyword">import</span> <span class="code-keyword">static</span> org.junit.Assert.*;
<span class="code-keyword">import</span> java.io.File;
<span class="code-keyword">import</span> java.text.SimpleDateFormat;
<span class="code-keyword">import</span> java.util.Arrays;
<span class="code-keyword">import</span> java.util.Date;
<span class="code-keyword">import</span> java.util.HashSet;
<span class="code-keyword">import</span> java.util.Random;
<span class="code-keyword">import</span> java.util.Set;
<span class="code-keyword">import</span> org.junit.Before;
<span class="code-keyword">import</span> org.junit.BeforeClass;
<span class="code-keyword">import</span> org.junit.Test;
<span class="code-keyword">import</span> org.slf4j.LoggerFactory;
<span class="code-keyword">import</span> ch.qos.logback.classic.Logger;
<span class="code-keyword">import</span> ch.qos.logback.classic.LoggerContext;
<span class="code-keyword">import</span> ch.qos.logback.classic.encoder.PatternLayoutEncoder;
<span class="code-keyword">import</span> ch.qos.logback.classic.spi.ILoggingEvent;
<span class="code-keyword">import</span> ch.qos.logback.core.Appender;
<span class="code-keyword">import</span> ch.qos.logback.core.rolling.RollingFileAppender;
<span class="code-keyword">import</span> ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP;
<span class="code-keyword">import</span> ch.qos.logback.core.rolling.TimeBasedRollingPolicy;

<span class="code-keyword">public</span> class TimeRotationTest {
  <span class="code-keyword">private</span> <span class="code-keyword">static</span> File _tmpDir;
  <span class="code-keyword">private</span> Set<File> _filesExpected;

  @BeforeClass
  <span class="code-keyword">public</span> <span class="code-keyword">static</span> void setupForAll() <span class="code-keyword">throws</span> Exception {
    <span class="code-object">String</span> tmp = <span class="code-object">System</span>.getProperty(<span class="code-quote">"java.io.tmpdir"</span>) + <span class="code-quote">"/timedwindowlogbacktest/"</span> + <span class="code-object">System</span>.currentTimeMillis();
    _tmpDir = <span class="code-keyword">new</span> File(tmp);
    _tmpDir.mkdirs();
    assertTrue(_tmpDir + <span class="code-quote">" not created"</span>, _tmpDir.isDirectory());
    assertEquals(_tmpDir + <span class="code-quote">" not empty"</span>, 0, _tmpDir.list().length);
    <span class="code-keyword">for</span>(<span class="code-object">String</span> p : <span class="code-keyword">new</span> <span class="code-object">String</span>[]{ <span class="code-quote">"java.vendor"</span>, <span class="code-quote">"java.version"</span>, <span class="code-quote">"os.name"</span>, <span class="code-quote">"os.version"</span>, <span class="code-quote">"os.arch"</span> } ) {
      <span class="code-object">System</span>.out.println(p + <span class="code-quote">"="</span> + <span class="code-object">System</span>.getProperty(p));
    }
    <span class="code-object">System</span>.out.println(<span class="code-quote">"using "</span> + _tmpDir.getAbsolutePath() + <span class="code-quote">"\n"</span>);
  }

  @Before
  <span class="code-keyword">public</span> void setup() {
    _filesExpected = <span class="code-keyword">new</span> HashSet<File>();
  }

  <span class="code-keyword">private</span> void verifyFile(File file, <span class="code-object">long</span> maxSize) {
    <span class="code-object">String</span> name = file.getName();
    assertTrue(name + <span class="code-quote">" duplicate"</span>, _filesExpected.add(file));
    assertTrue(name + <span class="code-quote">" does not exist"</span>, file.canRead());
    assertTrue(name + <span class="code-quote">" size is zero"</span>, file.length() > 0);
    <span class="code-object">float</span> percent = 100f * file.length() / maxSize - 100f;
    <span class="code-object">String</span> msg = <span class="code-object">String</span>.format(<span class="code-quote">"%s size is %.1fMB which is %.1f%% more than %.1fMB requested"</span>,
            name, file.length()/1024f/1024, percent, maxSize/1024f/1024);
    assertTrue(msg, file.length() <= maxSize * 1.1); <span class="code-comment">// give it 10% slack
</span>  }

  <span class="code-keyword">private</span> Appender<ILoggingEvent> createAppender(<span class="code-object">String</span> basename_, <span class="code-object">String</span> rotated_, <span class="code-object">long</span> maxFileSize_, <span class="code-object">int</span> maxFiles_, <span class="code-object">boolean</span> append_) {
    LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();

    SizeAndTimeBasedFNATP triggeringPolicy = <span class="code-keyword">new</span> SizeAndTimeBasedFNATP<ILoggingEvent>();
    triggeringPolicy.setMaxFileSize(<span class="code-object">String</span>.valueOf(maxFileSize_));

    TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = <span class="code-keyword">new</span> TimeBasedRollingPolicy<ILoggingEvent>();
    rollingPolicy.setContext(context);
    rollingPolicy.setTimeBasedFileNamingAndTriggeringPolicy(triggeringPolicy);
    rollingPolicy.setMaxHistory(maxFiles_ - 1);
    rollingPolicy.setFileNamePattern(rotated_);

    triggeringPolicy.setContext(context);
    triggeringPolicy.setTimeBasedRollingPolicy(rollingPolicy);

    RollingFileAppender<ILoggingEvent> appender = <span class="code-keyword">new</span> RollingFileAppender<ILoggingEvent>();
    appender.setFile(basename_);
    appender.setAppend(append_);
    appender.setRollingPolicy(rollingPolicy);
    appender.setTriggeringPolicy(triggeringPolicy);
    rollingPolicy.setParent(appender);
    rollingPolicy.start();
    triggeringPolicy.start();

    PatternLayoutEncoder layout = <span class="code-keyword">new</span> PatternLayoutEncoder();
    layout.setPattern(<span class="code-quote">"%d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %level %logger %msg%n"</span>);
    layout.setContext(context);
    layout.start();

    appender.setEncoder(layout);
    appender.setContext(context);
    appender.start();
    <span class="code-keyword">return</span> appender;
  }

  <span class="code-keyword">private</span> void doTest(<span class="code-keyword">final</span> <span class="code-object">String</span> testname, <span class="code-object">String</span> basenameS, <span class="code-object">String</span> rotatedS, <span class="code-object">boolean</span> compress, <span class="code-object">int</span> maxFiles, <span class="code-object">long</span> maxSize) <span class="code-keyword">throws</span> Exception {
    File testDir = <span class="code-keyword">new</span> File(_tmpDir, testname);
    testDir.mkdirs();
    assertEquals(testDir + <span class="code-quote">" not empty"</span>, 0, testDir.listFiles().length);

    File basename = <span class="code-keyword">new</span> File(testDir, basenameS);
    File rotated  = <span class="code-keyword">new</span> File(testDir, rotatedS + (compress ? <span class="code-quote">".gz"</span> : ""));
    <span class="code-object">boolean</span> append = <span class="code-keyword">false</span>;

    Appender<ILoggingEvent> appender = createAppender(basename.getPath(), rotated.getPath(), maxSize, maxFiles, append);
    org.slf4j.Logger slf4jLog = LoggerFactory.getLogger(testname);  
    Logger logger = (Logger) slf4jLog; 
    logger.addAppender(appender);

    <span class="code-comment">// log some stuff, loads of it
</span>    Random rnd = <span class="code-keyword">new</span> Random();
    <span class="code-object">String</span> msg = <span class="code-quote">"{} During the application {} in the <span class="code-keyword">case</span> <span class="code-object">long</span>-lived application on {} when {} is another random"</span>;
    <span class="code-keyword">for</span>(<span class="code-object">int</span> i = 0; i < 200000; ++i) {
      logger.info(msg, <span class="code-object">System</span>.nanoTime(), <span class="code-keyword">new</span> Date(), rnd.nextGaussian());
    }

    <span class="code-keyword">for</span>(<span class="code-object">int</span> i = 0; i < maxFiles - 1; ++i) {
      <span class="code-object">String</span> file = <span class="code-object">String</span>.format(resolveFilename(rotated.getPath()), i);
      verifyFile(<span class="code-keyword">new</span> File(file), maxSize);
    }

    verifyFile(basename, maxSize);

    Set<File> filesPresent = <span class="code-keyword">new</span> HashSet<File>(Arrays.asList(testDir.listFiles()));
    filesPresent.removeAll(_filesExpected);
    assertTrue(<span class="code-quote">"unexpected "</span> + filesPresent.size() + <span class="code-quote">" files: "</span> + filesPresent, filesPresent.isEmpty());
  }

  <span class="code-keyword">private</span> <span class="code-object">String</span> resolveFilename(<span class="code-object">String</span> rotatedPattern_) {
    <span class="code-object">String</span> dateFormat = <span class="code-keyword">null</span>;
    <span class="code-keyword">final</span> <span class="code-object">String</span> DP = <span class="code-quote">"%d{"</span>;
    <span class="code-object">int</span> i = rotatedPattern_.indexOf(DP);
    <span class="code-object">int</span> j;
    <span class="code-keyword">if</span> (i > -1) {
      j = rotatedPattern_.indexOf('}');
      <span class="code-keyword">if</span> (j > DP.length() + i) {
        dateFormat = rotatedPattern_.substring(i + DP.length(), j);
      }
    } <span class="code-keyword">else</span> {
      dateFormat = <span class="code-quote">"yyyy-MM-dd"</span>;
      i = rotatedPattern_.indexOf(<span class="code-quote">"%d"</span>);
      j = i + 1;
    }
    <span class="code-object">String</span> s = rotatedPattern_.substring(0, i)
            + <span class="code-keyword">new</span> SimpleDateFormat(dateFormat).format(<span class="code-keyword">new</span> Date())
            + rotatedPattern_.substring(j + 1);
    <span class="code-keyword">return</span> s.replace(<span class="code-quote">"%i"</span>, <span class="code-quote">"%d"</span>);
  }

<span class="code-comment">//  @Test <span class="code-keyword">public</span> void testDailyMax3_5MB() <span class="code-keyword">throws</span> Exception { doTest(<span class="code-quote">"daily_max3_5MB_each"</span>, <span class="code-quote">"test.log"</span>, <span class="code-quote">"test_%d.log.%i"</span>, <span class="code-keyword">false</span>, 3, 5 * 1024 * 1024); }
</span>  @Test <span class="code-keyword">public</span> void testDailyMax8_5MB() <span class="code-keyword">throws</span> Exception { doTest(<span class="code-quote">"daily_max8_5MB_each"</span>, <span class="code-quote">"test.log"</span>, <span class="code-quote">"test_%d.log.%i"</span>, <span class="code-keyword">false</span>, 8, 5 * 1024 * 1024); }

  @Test <span class="code-keyword">public</span> void testDailyMax4_10MB() <span class="code-keyword">throws</span> Exception { doTest(<span class="code-quote">"daily_max4_10MB_each"</span>, <span class="code-quote">"test.log"</span>, <span class="code-quote">"test_%d.log.%i"</span>, <span class="code-keyword">false</span>, 4, 10 * 1024 * 1024); }
<span class="code-comment">//  @Test <span class="code-keyword">public</span> void testDailyMax2_10MB() <span class="code-keyword">throws</span> Exception { doTest(<span class="code-quote">"daily_max2_10MB_each"</span>, <span class="code-quote">"test.log"</span>, <span class="code-quote">"test_%d.log.%i"</span>, <span class="code-keyword">false</span>, 2, 10 * 1024 * 1024); }
</span>
  @Test <span class="code-keyword">public</span> void testOnePerDay_max2_30MB() <span class="code-keyword">throws</span> Exception { doTest(<span class="code-quote">"one_daily_max2_30MB_each"</span>, <span class="code-quote">"test.log"</span>, <span class="code-quote">"test_%d.log"</span>, <span class="code-keyword">false</span>, 2, 30 * 1024 * 1024); }
  @Test <span class="code-keyword">public</span> void testOnePerDay_max2_15MB() <span class="code-keyword">throws</span> Exception { doTest(<span class="code-quote">"one_daily_max2_15MB_each"</span>, <span class="code-quote">"test.log"</span>, <span class="code-quote">"test_%d.log"</span>, <span class="code-keyword">false</span>, 2, 15 * 1024 * 1024); }

  @Test <span class="code-keyword">public</span> void testCustomPattern() <span class="code-keyword">throws</span> Exception { doTest(<span class="code-quote">"custom_pattern"</span>, <span class="code-quote">"test.log"</span>, <span class="code-quote">"test_%d{yyyyMMdd}.log"</span>, <span class="code-keyword">false</span>, 2, 20 * 1024 * 1024); }

  @Test <span class="code-keyword">public</span> void testHourly10MB() <span class="code-keyword">throws</span> Exception { doTest(<span class="code-quote">"hourly10"</span>, <span class="code-quote">"test.log"</span>, <span class="code-quote">"test_%d{yyyyMMdd_HH}.log"</span>, <span class="code-keyword">false</span>, 2, 10 * 1024 * 1024); }
  @Test <span class="code-keyword">public</span> void testHourly20MB() <span class="code-keyword">throws</span> Exception { doTest(<span class="code-quote">"hourly20"</span>, <span class="code-quote">"test.log"</span>, <span class="code-quote">"test_%d{yyyyMMdd_HH}.log"</span>, <span class="code-keyword">false</span>, 2, 20 * 1024 * 1024); }
}
</pre>
</div></div>
    </td>
</tr>
                                                <tr valign="top">
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
        <strong style="font-weight:normal;color:#505050;">Environment:</strong>
    </td>
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
        <div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
java.vendor=Sun Microsystems Inc.
java.version=1.6.0_45
os.name=Windows 7
os.version=6.1
os.arch=amd64
</pre>
</div></div>
    </td>
</tr>
                                                <tr valign="top">
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
        <strong style="font-weight:normal;color:#505050;">Project:</strong>
    </td>
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
        <a style="color:#326ca6;" href="http://jira.qos.ch/browse/LOGBACK">logback</a>
    </td>
</tr>                                                <tr valign="top">
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
        <strong style="font-weight:normal;color:#505050;">Priority:</strong>
    </td>
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
                        <img src="http://jira.qos.ch/images/icons/priorities/critical.png" height="16" width="16" border="0" align="absmiddle" alt="Critical">                Critical
    </td>
</tr>
                        <tr valign="top">
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
        <strong style="font-weight:normal;color:#505050;">Reporter:</strong>
    </td>
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
                                        <a class="user-hover" rel="michal" id="email_michal" href="http://jira.qos.ch/secure/ViewProfile.jspa?name=michal" style="color:#326ca6;">Michal Jacykiewicz</a>
                </td>
</tr>                                                                    </table>
                </td>
            </tr>
        </table>
    </td>
</tr>













            </table>
        </td><!-- End #email-page -->
    </tr>
    <tr valign="top">
        <td style="color:#505050;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:10px;line-height:14px;padding: 0 16px 16px 16px;text-align:center;">
            This message is automatically generated by JIRA.<br />
            If you think it was sent incorrectly, please contact your JIRA administrators<br />
            For more information on JIRA, see: <a style='color:#326ca6;' href='http://www.atlassian.com/software/jira'>http://www.atlassian.com/software/jira</a>
        </td>
    </tr>
</table><!-- End #email-wrap -->
</div><!-- End #email-body -->