private void unsafeRotate(RotationPolicy policy, LocalDateTime dateTime) throws Exception { if (config.getFile().length() == 0) { LOGGER.debug("empty file, skipping rotation {file={}}"); config.getCallback().onSuccess(policy, dateTime, null); return; File rotatedFile = config.getFilePattern().create(dateTime).getAbsoluteFile(); LOGGER.debug("renaming {file={}, rotatedFile={}}", config.getFile(), rotatedFile); boolean renamed = config.getFile().renameTo(rotatedFile); if (!renamed) { String message = String.format("rename failure {file=%s, rotatedFile=%s}", config.getFile(), rotatedFile); IOException error = new IOException(message); config.getCallback().onFailure(policy, dateTime, rotatedFile, error); return; LOGGER.debug("re-opening file {file={}}", config.getFile()); FileOutputStream newStream = open(); FileOutputStream oldStream; Lock writeLock = config.getLock().writeLock(); writeLock.lock(); try { if (config.isCompress()) { asyncCompress(policy, dateTime, rotatedFile, config.getCallback()); return; config.getCallback().onSuccess(policy, dateTime, rotatedFile);
@Override public void run() { // Get file size. LocalDateTime now = config.getClock().now(); File file = config.getFile(); long byteCount; try { byteCount = file.length(); } catch (Exception error) { String message = String.format("failed accessing file size (file=%s)", file); Exception extendedError = new IOException(message, error); config.getCallback().onFailure(SizeBasedRotationPolicy.this, now, file, extendedError); return; } // Rotate if necessary. if (byteCount > maxByteCount) { LOGGER.debug("triggering {byteCount={}}", byteCount); config.getCallback().onTrigger(SizeBasedRotationPolicy.this, now); rotatable.rotate(SizeBasedRotationPolicy.this, now); } } };
@Override public String toString() { return String.format("RotatingFileOutputStream{file=%s}", config.getFile()); }
@Override public void start(Rotatable rotatable) { RotationConfig config = rotatable.getConfig(); LocalDateTime triggerDateTime = getTriggerDateTime(config.getClock()); TimerTask timerTask = createTimerTask(rotatable, triggerDateTime); config.getTimer().schedule(timerTask, triggerDateTime.toDate()); }
@Override public void write(int b) throws IOException { Lock readLock = config.getLock().readLock(); readLock.lock(); try { stream.write(b); } finally { readLock.unlock(); } }
@Override public void rotate(RotationPolicy policy, LocalDateTime dateTime) { boolean acquired = rotationLock.tryLock(); if (!acquired) { config.getCallback().onConflict(policy, dateTime); } else { try { unsafeRotate(policy, dateTime); } catch (Exception error) { String message = String.format("rotation failure {dateTime=%s}", dateTime); RuntimeException extendedError = new RuntimeException(message); config.getCallback().onFailure(policy, dateTime, null, extendedError); } finally { rotationLock.unlock(); } } }
private void startPolicies() { for (RotationPolicy policy : config.getPolicies()) { policy.start(this); } }
@Override public void start(Rotatable rotatable) { TimerTask timerTask = createTimerTask(rotatable); rotatable.getConfig().getTimer().schedule(timerTask, 0, checkIntervalMillis); }
public RotationConfig build() { prepare(); validate(); return new RotationConfig(this); }
@Override public String toString() { return MoreObjects.toStringHelper(this) .add("file", rotationConfig.getFile()) .add("charset", charset) .toString(); }
@Override public void write(byte[] b) throws IOException { Lock readLock = config.getLock().readLock(); readLock.lock(); try { stream.write(b); } finally { readLock.unlock(); } }
@Override public void run() { getLogger().debug("triggering {triggerDateTime={}}", triggerDateTime); config.getCallback().onTrigger(TimeBasedRotationPolicy.this, triggerDateTime); rotatable.rotate(TimeBasedRotationPolicy.this, triggerDateTime); start(rotatable); } };
public HttpRequestRecordWriterRotatingFileTarget(RotationConfig rotationConfig, Charset charset) { this.rotationConfig = checkNotNull(rotationConfig, "rotationConfig"); this.charset = checkNotNull(charset, "charset"); this.writer = createWriter(rotationConfig, charset); LOGGER.trace("instantiated (file={}, charset={})", rotationConfig.getFile(), charset); }
@Override public void write(byte[] b, int off, int len) throws IOException { Lock readLock = config.getLock().readLock(); readLock.lock(); try { stream.write(b, off, len); } finally { readLock.unlock(); } }
private static BufferedWriter createWriter(RotationConfig rotationConfig, Charset charset) { try { OutputStream outputStream = new RotatingFileOutputStream(rotationConfig); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, charset); return new BufferedWriter(outputStreamWriter); } catch (Exception error) { String message = String.format("failed opening file (file=%s, charset=%s)", rotationConfig.getFile(), charset); throw new RuntimeException(message, error); } }
@Override public void flush() throws IOException { Lock readLock = config.getLock().readLock(); readLock.lock(); try { stream.flush(); } finally { readLock.unlock(); } }