diff --git a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java index a97393aa5..b1c22283c 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -18,6 +18,8 @@ * - true or false, if true, print timestamps for every log line. Defaults to false. * @param tail * - `all` or ``, Output specified number of lines at the end of logs + * @param since + * - UNIX timestamp (integer) to filter logs. Specifying a timestamp will only output log-entries since that timestamp. Default: 0 (unfiltered) */ public interface LogContainerCmd extends AsyncDockerCmd { @@ -33,6 +35,8 @@ public interface LogContainerCmd extends AsyncDockerCmd public boolean hasStderrEnabled(); + public int getSince(); + public LogContainerCmd withContainerId(String containerId); /** @@ -63,6 +67,8 @@ public interface LogContainerCmd extends AsyncDockerCmd public LogContainerCmd withTail(int tail); + public LogContainerCmd withSince(int since); + public static interface Exec extends DockerCmdAsyncExec { } diff --git a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java index a9d923635..afc6a0754 100644 --- a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java @@ -18,6 +18,8 @@ * - true or false, if true, print timestamps for every log line. Defaults to false. * @param tail * - `all` or ``, Output specified number of lines at the end of logs + * @param since + * - UNIX timestamp (integer) to filter logs. Specifying a timestamp will only output log-entries since that timestamp. Default: 0 (unfiltered) */ public class LogContainerCmdImpl extends AbstrAsyncDockerCmd implements LogContainerCmd { @@ -27,6 +29,8 @@ public class LogContainerCmdImpl extends AbstrAsyncDockerCmd 0 ? "--since=" + since : "") + .append(containerId).toString(); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java index 0ab3da7a5..b2c1691b6 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java @@ -31,6 +31,7 @@ protected AbstractCallbackNotifier callbackNotifier(LogContainerCmd comma .queryParam("stdout", command.hasStdoutEnabled() ? "1" : "0") .queryParam("stderr", command.hasStderrEnabled() ? "1" : "0") .queryParam("follow", command.hasFollowStreamEnabled() ? "1" : "0") + .queryParam("since", command.getSince()) .queryParam("tail", command.getTail() < 0 ? "all" : "" + command.getTail()); LOGGER.trace("GET: {}", webTarget); diff --git a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java index 2e2dedb45..16b0266ac 100644 --- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java @@ -62,6 +62,7 @@ public void asyncLogContainer() throws Exception { LogContainerTestCallback loggingCallback = new LogContainerTestCallback(); + //this essentially test the since=0 case dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(loggingCallback); loggingCallback.awaitCompletion(); @@ -69,6 +70,8 @@ public void asyncLogContainer() throws Exception { assertTrue(loggingCallback.toString().contains(snippet)); } + + @Test public void asyncLogNonExistingContainer() throws Exception { @@ -135,4 +138,30 @@ public void asyncMultipleLogContainer() throws Exception { assertTrue(loggingCallback.toString().contains(snippet)); } + @Test + public void asyncLogContainerWithSince() throws Exception { + String snippet = "hello world"; + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("/bin/echo", snippet) + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(); + + assertThat(exitCode, equalTo(0)); + + LogContainerTestCallback loggingCallback = new LogContainerTestCallback(); + + int oneMinuteIntoFuture = (int)(System.currentTimeMillis()/1000) + 60; + dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().withSince(oneMinuteIntoFuture).exec(loggingCallback); + + loggingCallback.awaitCompletion(); + + assertFalse(loggingCallback.toString().contains(snippet)); + } + }