diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/LogsCLI.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/LogsCLI.java index 833e779be4..4d67ce8178 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/LogsCLI.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/LogsCLI.java @@ -100,6 +100,7 @@ public class LogsCLI extends Configured implements Tool { private static final String APP_OWNER_OPTION = "appOwner"; private static final String AM_CONTAINER_OPTION = "am"; private static final String PER_CONTAINER_LOG_FILES_OPTION = "log_files"; + private static final String PER_CONTAINER_LOG_FILES_OLD_OPTION = "logFiles"; private static final String PER_CONTAINER_LOG_FILES_REGEX_OPTION = "log_files_pattern"; private static final String LIST_NODES_OPTION = "list_nodes"; @@ -202,6 +203,12 @@ private int runCommand(String[] args) throws Exception { } if (commandLine.hasOption(PER_CONTAINER_LOG_FILES_OPTION)) { logFiles = commandLine.getOptionValues(PER_CONTAINER_LOG_FILES_OPTION); + } else { + // For backward compatibility, we need to check for the old form of this + // command line option as well. New form takes precedent. + if (commandLine.hasOption(PER_CONTAINER_LOG_FILES_OLD_OPTION)) { + logFiles = commandLine.getOptionValues(PER_CONTAINER_LOG_FILES_OLD_OPTION); + } } if (commandLine.hasOption(PER_CONTAINER_LOG_FILES_REGEX_OPTION)) { logFilesRegex = commandLine.getOptionValues( @@ -937,6 +944,12 @@ private Options createCommandOpts() { logFileOpt.setArgs(Option.UNLIMITED_VALUES); logFileOpt.setArgName("Log File Name"); opts.addOption(logFileOpt); + Option oldLogFileOpt = new Option(PER_CONTAINER_LOG_FILES_OLD_OPTION, true, + "Deprecated name for log_files, please use log_files option instead"); + oldLogFileOpt.setValueSeparator(','); + oldLogFileOpt.setArgs(Option.UNLIMITED_VALUES); + oldLogFileOpt.setArgName("Log File Name"); + opts.addOption(oldLogFileOpt); Option logFileRegexOpt = new Option(PER_CONTAINER_LOG_FILES_REGEX_OPTION, true, "Specify comma-separated value " + "to get matched log files by using java regex. Use \".*\" to " diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestLogsCLI.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestLogsCLI.java index d422a2a486..80f39b8f90 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestLogsCLI.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestLogsCLI.java @@ -529,6 +529,48 @@ public ContainerReport getContainerReport(String containerIdStr) createEmptyLog("empty"))); sysOutStream.reset(); + // Check backward compatibility for -logFiles + exitCode = cli.run(new String[] {"-applicationId", appId.toString(), + "-logFiles", "stdout"}); + assertTrue("Failed with -logFiles", exitCode == 0); + assertFalse("Failed with -logFiles", sysOutStream.toString().contains( + logMessage(containerId1, "syslog"))); + assertFalse("Failed with -logFiles", sysOutStream.toString().contains( + logMessage(containerId2, "syslog"))); + assertFalse("Failed with -logFiles", sysOutStream.toString().contains( + logMessage(containerId3, "syslog"))); + assertTrue("Failed with -logFiles", sysOutStream.toString().contains( + logMessage(containerId3, "stdout"))); + assertFalse("Failed with -logFiles", sysOutStream.toString().contains( + logMessage(containerId3, "stdout1234"))); + assertFalse("Failed with -logFiles", sysOutStream.toString().contains( + createEmptyLog("empty"))); + sysOutStream.reset(); + + // Check -log_files supercedes -logFiles + exitCode = cli.run(new String[] {"-applicationId", appId.toString(), + "-log_files", "stdout", "-logFiles", "syslog"}); + assertTrue("Failed with -logFiles and -log_files", exitCode == 0); + assertFalse("Failed with -logFiles and -log_files", + sysOutStream.toString().contains( + logMessage(containerId1, "syslog"))); + assertFalse("Failed with -logFiles and -log_files", + sysOutStream.toString().contains( + logMessage(containerId2, "syslog"))); + assertFalse("Failed with -logFiles and -log_files", + sysOutStream.toString().contains( + logMessage(containerId3, "syslog"))); + assertTrue("Failed with -logFiles and -log_files", + sysOutStream.toString().contains( + logMessage(containerId3, "stdout"))); + assertFalse("Failed with -logFiles and -log_files", + sysOutStream.toString().contains( + logMessage(containerId3, "stdout1234"))); + assertFalse("Failed with -logFiles and -log_files", + sysOutStream.toString().contains( + createEmptyLog("empty"))); + sysOutStream.reset(); + exitCode = cli.run(new String[] {"-applicationId", appId.toString(), "-log_files_pattern", "std*"}); assertTrue(exitCode == 0);