in src/main/java/org/apache/log4j/rolling/RollingFileAppender.java [218:338]
  public boolean rollover() {
    //
    //   can't roll without a policy
    //
    if (rollingPolicy != null) {
      Exception exception = null;
      synchronized (this) {
        //
        //   if a previous async task is still running
        //}
        if (lastRolloverAsyncAction != null) {
          //
          //  block until complete
          //
          lastRolloverAsyncAction.close();
          //
          //    or don't block and return to rollover later
          //
          //if (!lastRolloverAsyncAction.isComplete()) return false;
        }
        try {
          RolloverDescription rollover = rollingPolicy.rollover(getFile());
          if (rollover != null) {
            if (rollover.getActiveFileName().equals(getFile())) {
              closeWriter();
              boolean success = true;
              if (rollover.getSynchronous() != null) {
                success = false;
                try {
                  success = rollover.getSynchronous().execute();
                } catch (Exception ex) {
                  exception = ex;
                }
              }
              if (success) {
                if (rollover.getAppend()) {
                  fileLength = new File(rollover.getActiveFileName()).length();
                } else {
                  fileLength = 0;
                }
                if (rollover.getAsynchronous() != null) {
                  lastRolloverAsyncAction = rollover.getAsynchronous();
                  new Thread(lastRolloverAsyncAction).start();
                }
                setFile(
                  rollover.getActiveFileName(), rollover.getAppend(),
                  bufferedIO, bufferSize);
              } else {
                setFile(
                  rollover.getActiveFileName(), true, bufferedIO, bufferSize);
                if (exception == null) {
                  LogLog.warn("Failure in post-close rollover action");
                } else {
                  LogLog.warn(
                    "Exception in post-close rollover action", exception);
                }
              }
            } else {
              Writer newWriter =
                createWriter(
                    createFileOutputStream(
                        rollover.getActiveFileName(), rollover.getAppend()));
              closeWriter();
              setFile(rollover.getActiveFileName());
              this.qw = createQuietWriter(newWriter);
              boolean success = true;
              if (rollover.getSynchronous() != null) {
                success = false;
                try {
                  success = rollover.getSynchronous().execute();
                } catch (Exception ex) {
                  exception = ex;
                }
              }
              if (success) {
                if (rollover.getAppend()) {
                  fileLength = new File(rollover.getActiveFileName()).length();
                } else {
                  fileLength = 0;
                }
                if (rollover.getAsynchronous() != null) {
                  lastRolloverAsyncAction = rollover.getAsynchronous();
                  new Thread(lastRolloverAsyncAction).start();
                }
              }
              writeHeader();
            }
            return true;
          }
        } catch (Exception ex) {
          exception = ex;
        }
      }
      if (exception != null) {
        LogLog.warn(
          "Exception during rollover, rollover deferred.", exception);
      }
    }
    return false;
  }