diff --git a/java/BUILD.bazel b/java/BUILD.bazel
index 126ad5e43..fb638c6f8 100644
--- a/java/BUILD.bazel
+++ b/java/BUILD.bazel
@@ -74,6 +74,7 @@ define_java_module(
"@maven//:com_typesafe_config",
"@maven//:commons_io_commons_io",
"@maven//:de_ruedigermoeller_fst",
+ "@maven//:log4j_log4j",
"@maven//:net_java_dev_jna_jna",
"@maven//:org_apache_commons_commons_lang3",
"@maven//:org_msgpack_msgpack_core",
diff --git a/java/runtime/pom.xml b/java/runtime/pom.xml
index 3f58e53eb..f7f81e866 100644
--- a/java/runtime/pom.xml
+++ b/java/runtime/pom.xml
@@ -52,6 +52,11 @@
fst
2.57
+
+ log4j
+ log4j
+ 1.2.17
+
net.java.dev.jna
jna
diff --git a/java/runtime/src/main/java/io/ray/runtime/DefaultRayRuntimeFactory.java b/java/runtime/src/main/java/io/ray/runtime/DefaultRayRuntimeFactory.java
index be74d6abb..5aa47cd58 100644
--- a/java/runtime/src/main/java/io/ray/runtime/DefaultRayRuntimeFactory.java
+++ b/java/runtime/src/main/java/io/ray/runtime/DefaultRayRuntimeFactory.java
@@ -4,6 +4,8 @@ import io.ray.api.runtime.RayRuntime;
import io.ray.api.runtime.RayRuntimeFactory;
import io.ray.runtime.config.RayConfig;
import io.ray.runtime.config.RunMode;
+import io.ray.runtime.generated.Common.WorkerType;
+import io.ray.runtime.util.LoggingUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -12,12 +14,21 @@ import org.slf4j.LoggerFactory;
*/
public class DefaultRayRuntimeFactory implements RayRuntimeFactory {
- private static final Logger LOGGER = LoggerFactory.getLogger(DefaultRayRuntimeFactory.class);
-
@Override
public RayRuntime createRayRuntime() {
RayConfig rayConfig = RayConfig.getInstance();
+ LoggingUtil.setupLogging(rayConfig);
+ Logger logger = LoggerFactory.getLogger(DefaultRayRuntimeFactory.class);
+
+ if (rayConfig.workerMode == WorkerType.WORKER) {
+ // Handle the uncaught exceptions thrown from user-spawned threads.
+ Thread.setDefaultUncaughtExceptionHandler((Thread t, Throwable e) -> {
+ logger.error(String.format("Uncaught worker exception in thread %s", t), e);
+ });
+ }
+
try {
+ logger.debug("Initializing runtime with config: {}", rayConfig);
AbstractRayRuntime innerRuntime = rayConfig.runMode == RunMode.SINGLE_PROCESS
? new RayDevRuntime(rayConfig)
: new RayNativeRuntime(rayConfig);
@@ -27,7 +38,7 @@ public class DefaultRayRuntimeFactory implements RayRuntimeFactory {
runtime.start();
return runtime;
} catch (Exception e) {
- LOGGER.error("Failed to initialize ray runtime", e);
+ logger.error("Failed to initialize ray runtime, with config " + rayConfig, e);
throw new RuntimeException("Failed to initialize ray runtime", e);
}
}
diff --git a/java/runtime/src/main/java/io/ray/runtime/RayNativeRuntime.java b/java/runtime/src/main/java/io/ray/runtime/RayNativeRuntime.java
index fca562ad2..393cc6fea 100644
--- a/java/runtime/src/main/java/io/ray/runtime/RayNativeRuntime.java
+++ b/java/runtime/src/main/java/io/ray/runtime/RayNativeRuntime.java
@@ -96,7 +96,7 @@ public final class RayNativeRuntime extends AbstractRayRuntime {
objectStore = new NativeObjectStore(workerContext);
taskSubmitter = new NativeTaskSubmitter();
- LOGGER.info("RayNativeRuntime started with store {}, raylet {}",
+ LOGGER.debug("RayNativeRuntime started with store {}, raylet {}",
rayConfig.objectStoreSocketName, rayConfig.rayletSocketName);
}
@@ -114,7 +114,7 @@ public final class RayNativeRuntime extends AbstractRayRuntime {
gcsClient = null;
}
RayConfig.reset();
- LOGGER.info("RayNativeRuntime shutdown");
+ LOGGER.debug("RayNativeRuntime shutdown");
}
// For test purpose only
diff --git a/java/runtime/src/main/java/io/ray/runtime/config/RayConfig.java b/java/runtime/src/main/java/io/ray/runtime/config/RayConfig.java
index fd8b9da37..48be365ca 100644
--- a/java/runtime/src/main/java/io/ray/runtime/config/RayConfig.java
+++ b/java/runtime/src/main/java/io/ray/runtime/config/RayConfig.java
@@ -6,6 +6,7 @@ import com.google.common.collect.ImmutableList;
import com.typesafe.config.Config;
import com.typesafe.config.ConfigException;
import com.typesafe.config.ConfigFactory;
+import com.typesafe.config.ConfigRenderOptions;
import com.typesafe.config.ConfigValue;
import io.ray.api.id.JobId;
import io.ray.runtime.generated.Common.WorkerType;
@@ -18,8 +19,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* Configurations of Ray runtime.
@@ -27,8 +26,6 @@ import org.slf4j.LoggerFactory;
*/
public class RayConfig {
- private static final Logger LOGGER = LoggerFactory.getLogger(RayConfig.class);
-
public static final String DEFAULT_CONFIG_FILE = "ray.default.conf";
public static final String CUSTOM_CONFIG_FILE = "ray.conf";
@@ -48,7 +45,6 @@ public class RayConfig {
private JobId jobId;
public String sessionDir;
public String logDir;
- public final boolean redirectOutput;
public final List libraryPath;
public final List classpath;
public final List jvmParameters;
@@ -136,8 +132,6 @@ public class RayConfig {
if (isDriver) {
if (!resources.containsKey("CPU")) {
int numCpu = Runtime.getRuntime().availableProcessors();
- LOGGER.warn("No CPU resource is set in configuration, "
- + "setting it to the number of CPU cores: {}", numCpu);
resources.put("CPU", numCpu * 1.0);
}
}
@@ -153,8 +147,6 @@ public class RayConfig {
// Object store configurations.
objectStoreSize = config.getBytes("ray.object-store.size");
- // Redirect output.
- redirectOutput = config.getBoolean("ray.redirect-output");
// Library path.
libraryPath = config.getStringList("ray.library.path");
// Custom classpath.
@@ -219,11 +211,10 @@ public class RayConfig {
numWorkersPerProcess = config.getInt("ray.raylet.config.num_workers_per_process_java");
gcsServiceEnabled = System.getenv("RAY_GCS_SERVICE_ENABLED") == null ||
- System.getenv("RAY_GCS_SERVICE_ENABLED").toLowerCase().equals("true");
+ System.getenv("RAY_GCS_SERVICE_ENABLED").toLowerCase().equals("true");
// Validate config.
validate();
- LOGGER.debug("Created config: {}", this);
}
public void setRedisAddress(String redisAddress) {
@@ -269,27 +260,45 @@ public class RayConfig {
return sessionDir;
}
+ public Config getInternalConfig() {
+ return config;
+ }
+
+ /**
+ * Renders the config value as a HOCON string.
+ */
+ public String render() {
+ // These items might be dynamically generated or mutated at runtime.
+ // Explicitly include them.
+ Map dynamic = new HashMap<>();
+ dynamic.put("ray.session-dir", sessionDir);
+ dynamic.put("ray.raylet.socket-name", rayletSocketName);
+ dynamic.put("ray.object-store.socket-name", objectStoreSocketName);
+ dynamic.put("ray.raylet.node-manager-port", nodeManagerPort);
+ dynamic.put("ray.redis.address", redisAddress);
+ dynamic.put("ray.job.resource-path", jobResourcePath);
+ Config toRender = ConfigFactory.parseMap(dynamic).withFallback(config);
+ return toRender.root().render(ConfigRenderOptions.concise());
+ }
+
private void updateSessionDir() {
// session dir
- String localSessionDir = System.getProperty("ray.session-dir");
if (workerMode == WorkerType.DRIVER) {
- Preconditions.checkState(localSessionDir == null);
final int minBound = 100000;
final int maxBound = 999999;
final String sessionName = String.format("session_%s_%d", DATE_TIME_FORMATTER.format(
LocalDateTime.now()), RANDOM.nextInt(maxBound - minBound) + minBound);
sessionDir = String.format("%s/%s", DEFAULT_TEMP_DIR, sessionName);
} else if (workerMode == WorkerType.WORKER) {
- Preconditions.checkState(localSessionDir != null);
- sessionDir = removeTrailingSlash(localSessionDir);
+ sessionDir = removeTrailingSlash(config.getString("ray.session-dir"));
} else {
throw new RuntimeException("Unknown worker type.");
}
// Log dir.
String localLogDir = null;
- if (config.hasPath("ray.log-dir")) {
- localLogDir = removeTrailingSlash(config.getString("ray.log-dir"));
+ if (config.hasPath("ray.logging.dir")) {
+ localLogDir = removeTrailingSlash(config.getString("ray.logging.dir"));
}
if (Strings.isNullOrEmpty(localLogDir)) {
logDir = String.format("%s/logs", sessionDir);
@@ -323,29 +332,7 @@ public class RayConfig {
@Override
public String toString() {
- return "RayConfig{"
- + ", nodeIp='" + nodeIp + '\''
- + ", workerMode=" + workerMode
- + ", runMode=" + runMode
- + ", resources=" + resources
- + ", jobId=" + jobId
- + ", logDir='" + logDir + '\''
- + ", redirectOutput=" + redirectOutput
- + ", libraryPath=" + libraryPath
- + ", classpath=" + classpath
- + ", jvmParameters=" + jvmParameters
- + ", redisAddress='" + redisAddress + '\''
- + ", redisIp='" + redisIp + '\''
- + ", redisPort=" + redisPort
- + ", headRedisPort=" + headRedisPort
- + ", numberRedisShards=" + numberRedisShards
- + ", objectStoreSocketName='" + objectStoreSocketName + '\''
- + ", objectStoreSize=" + objectStoreSize
- + ", rayletSocketName='" + rayletSocketName + '\''
- + ", rayletConfigParameters=" + rayletConfigParameters
- + ", jobResourcePath='" + jobResourcePath + '\''
- + ", pythonWorkerCommand='" + pythonWorkerCommand + '\''
- + '}';
+ return render();
}
/**
@@ -357,16 +344,14 @@ public class RayConfig {
public static RayConfig create() {
ConfigFactory.invalidateCaches();
Config config = ConfigFactory.systemProperties();
- String configPath = System.getProperty("ray.config");
+ String configPath = System.getProperty("ray.config-file");
if (Strings.isNullOrEmpty(configPath)) {
- LOGGER.info("Loading config from \"ray.conf\" file in classpath.");
config = config.withFallback(ConfigFactory.load(CUSTOM_CONFIG_FILE));
} else {
- LOGGER.info("Loading config from " + configPath + ".");
config = config.withFallback(ConfigFactory.parseFile(new File(configPath)));
}
config = config.withFallback(ConfigFactory.load(DEFAULT_CONFIG_FILE));
- return new RayConfig(config);
+ return new RayConfig(config.withOnlyPath("ray"));
}
}
diff --git a/java/runtime/src/main/java/io/ray/runtime/runner/RunManager.java b/java/runtime/src/main/java/io/ray/runtime/runner/RunManager.java
index 1e156b4d3..7290bedaa 100644
--- a/java/runtime/src/main/java/io/ray/runtime/runner/RunManager.java
+++ b/java/runtime/src/main/java/io/ray/runtime/runner/RunManager.java
@@ -10,18 +10,18 @@ import io.ray.runtime.util.BinaryFileUtil;
import io.ray.runtime.util.ResourceUtil;
import java.io.File;
import java.io.IOException;
+import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -34,17 +34,12 @@ public class RunManager {
private static final Logger LOGGER = LoggerFactory.getLogger(RunManager.class);
- private static final DateTimeFormatter DATE_TIME_FORMATTER =
- DateTimeFormatter.ofPattern("YYYY-MM-dd_HH-mm-ss");
-
private static final String WORKER_CLASS = "io.ray.runtime.runner.worker.DefaultWorker";
private static final String SESSION_LATEST = "session_latest";
private RayConfig rayConfig;
- private Random random = new Random();
-
private List> processes;
private static final int KILL_PROCESS_WAIT_TIMEOUT_SECONDS = 1;
@@ -84,7 +79,7 @@ public class RunManager {
}
numAttempts++;
}
- LOGGER.info("Process {} is now terminated.", name);
+ LOGGER.debug("Process {} is now terminated.", name);
}
/**
@@ -117,6 +112,22 @@ public class RunManager {
}
}
+ /**
+ * @return Log files for stdout and stderr.
+ */
+ private Pair getLogFiles(String logDir, String processName) {
+ int suffixIndex = 0;
+ while (true) {
+ String suffix = suffixIndex == 0 ? "" : "." + suffixIndex;
+ File stdout = new File(String.format("%s/%s%s.out", logDir, suffix, processName));
+ File stderr = new File(String.format("%s/%s%s.err", logDir, suffix, processName));
+ if (!stdout.exists() && !stderr.exists()) {
+ return ImmutablePair.of(stdout, stderr);
+ }
+ suffixIndex += 1;
+ }
+ }
+
/**
* Start a process.
*
@@ -134,15 +145,11 @@ public class RunManager {
String stdout = "";
String stderr = "";
- if (rayConfig.redirectOutput) {
- // Set stdout and stderr paths.
- int logId = random.nextInt(10000);
- String date = DATE_TIME_FORMATTER.format(LocalDateTime.now());
- stdout = String.format("%s/%s-%s-%05d.out", rayConfig.logDir, name, date, logId);
- stderr = String.format("%s/%s-%s-%05d.err", rayConfig.logDir, name, date, logId);
- builder.redirectOutput(new File(stdout));
- builder.redirectError(new File(stderr));
- }
+ // Set stdout and stderr paths.
+ Pair logFiles = getLogFiles(rayConfig.logDir, name);
+ builder.redirectOutput(logFiles.getLeft());
+ builder.redirectError(logFiles.getRight());
+
// Set environment variables.
if (env != null && !env.isEmpty()) {
builder.environment().putAll(env);
@@ -164,18 +171,14 @@ public class RunManager {
if (!p.isAlive()) {
String message = String.format("Failed to start %s. Exit code: %d.",
name, p.exitValue());
- if (rayConfig.redirectOutput) {
- message += String.format(" Logs are redirected to %s and %s.", stdout, stderr);
- }
+ message += String.format(" Logs are redirected to %s and %s.", stdout, stderr);
throw new RuntimeException(message);
}
processes.add(Pair.of(name, p));
- if (LOGGER.isInfoEnabled()) {
+ if (LOGGER.isDebugEnabled()) {
String message = String.format("%s process started.", name);
- if (rayConfig.redirectOutput) {
- message += String.format(" Logs are redirected to %s and %s.", stdout, stderr);
- }
- LOGGER.info(message);
+ message += String.format(" Logs are redirected to %s and %s.", stdout, stderr);
+ LOGGER.debug(message);
}
}
@@ -185,7 +188,7 @@ public class RunManager {
* @param isHead Whether this node is the head node. If true, redis server will be started.
*/
public void startRayProcesses(boolean isHead) {
- LOGGER.info("Starting ray processes @ {}.", rayConfig.nodeIp);
+ LOGGER.debug("Starting ray processes @ {}.", rayConfig.nodeIp);
try {
if (isHead) {
startGcs();
@@ -243,7 +246,7 @@ public class RunManager {
String.format("--config_list=%s",
rayConfig.rayletConfigParameters.entrySet().stream()
.map(entry -> entry.getKey() + "," + entry.getValue()).collect(Collectors
- .joining(","))),
+ .joining(","))),
String.format("--redis_password=%s", redisPasswordOption)
);
startProcess(command, null, "gcs_server");
@@ -274,7 +277,7 @@ public class RunManager {
command.add(password);
}
- String name = shard == null ? "redis" : "redis-" + shard;
+ String name = shard == null ? "redis" : "redis-shard_" + shard;
startProcess(command, null, name);
try (Jedis client = new Jedis("127.0.0.1", port)) {
@@ -291,7 +294,7 @@ public class RunManager {
return ip + ":" + port;
}
- private void startRaylet() {
+ private void startRaylet() throws IOException {
int hardwareConcurrency = Runtime.getRuntime().availableProcessors();
int maximumStartupConcurrency = Math.max(1,
Math.min(rayConfig.resources.getOrDefault("CPU", 0.0).intValue(), hardwareConcurrency));
@@ -336,7 +339,7 @@ public class RunManager {
return stream.filter(s -> !s.contains(" ")).collect(Collectors.joining(":"));
}
- private String buildWorkerCommand() {
+ private String buildWorkerCommand() throws IOException {
List cmd = new ArrayList<>();
cmd.add("java");
cmd.add("-classpath");
@@ -348,41 +351,11 @@ public class RunManager {
));
cmd.add(classpath);
- // library path
- String libraryPath = concatPath(rayConfig.libraryPath.stream());
- cmd.add("-Djava.library.path=" + libraryPath);
-
- // session path
- cmd.add("-Dray.session-dir=" + rayConfig.sessionDir);
-
- // logging path
- if (rayConfig.redirectOutput) {
- cmd.add("-Dray.logging.stdout=org.apache.log4j.varia.NullAppender");
- cmd.add("-Dray.logging.file=org.apache.log4j.FileAppender");
- int logId = random.nextInt(10000);
- String date = DATE_TIME_FORMATTER.format(LocalDateTime.now());
- String logFile = String.format("%s/worker-%s-%05d.out", rayConfig.logDir, date, logId);
- cmd.add("-Dray.logging.file.path=" + logFile);
- }
-
- if (!Strings.isNullOrEmpty(rayConfig.jobResourcePath)) {
- cmd.add("-Dray.job.resource-path=" + rayConfig.jobResourcePath);
- }
-
- // socket names
- cmd.add("-Dray.raylet.socket-name=" + rayConfig.rayletSocketName);
- cmd.add("-Dray.object-store.socket-name=" + rayConfig.objectStoreSocketName);
-
- cmd.add("-Dray.raylet.node-manager-port=" + rayConfig.getNodeManagerPort());
-
- // Config overwrite
- cmd.add("-Dray.redis.address=" + rayConfig.getRedisAddress());
-
- // redis password
- if (!Strings.isNullOrEmpty(rayConfig.headRedisPassword)) {
- cmd.add("-Dray.redis.password=" + rayConfig.headRedisPassword);
- }
-
+ // Write current config to a file, and set the file path as Java worker's config file.
+ // This allows users to set worker config by setting driver's system properties.
+ File workerConfigFile = new File(rayConfig.sessionDir + "/java_worker.conf");
+ FileUtils.write(workerConfigFile, rayConfig.render(), Charset.defaultCharset());
+ cmd.add("-Dray.config-file=" + workerConfigFile.getAbsolutePath());
cmd.add("RAY_WORKER_RAYLET_CONFIG_PLACEHOLDER");
diff --git a/java/runtime/src/main/java/io/ray/runtime/runner/worker/DefaultDriver.java b/java/runtime/src/main/java/io/ray/runtime/runner/worker/DefaultDriver.java
deleted file mode 100644
index 1495efa16..000000000
--- a/java/runtime/src/main/java/io/ray/runtime/runner/worker/DefaultDriver.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package io.ray.runtime.runner.worker;
-
-import io.ray.api.Ray;
-
-/**
- * The main function of DefaultDriver.
- */
-public class DefaultDriver {
-
- //
- // " --node-ip-address=" + ip
- // + " --redis-address=" + redisAddress
- // + " --driver-class" + className
- //
- public static void main(String[] args) {
- try {
- System.setProperty("ray.worker.mode", "DRIVER");
- Ray.init();
-
- String driverClass = null;
- String driverArgs = null;
- Class> cls = Class.forName(driverClass);
- String[] argsArray = (driverArgs != null) ? driverArgs.split(",") : (new String[] {});
- cls.getMethod("main", String[].class).invoke(null, (Object) argsArray);
- } catch (Throwable e) {
- e.printStackTrace();
- System.exit(-1);
- }
- }
-}
diff --git a/java/runtime/src/main/java/io/ray/runtime/runner/worker/DefaultWorker.java b/java/runtime/src/main/java/io/ray/runtime/runner/worker/DefaultWorker.java
index 349072bcd..5f79172b4 100644
--- a/java/runtime/src/main/java/io/ray/runtime/runner/worker/DefaultWorker.java
+++ b/java/runtime/src/main/java/io/ray/runtime/runner/worker/DefaultWorker.java
@@ -2,30 +2,18 @@ package io.ray.runtime.runner.worker;
import io.ray.api.Ray;
import io.ray.runtime.RayRuntimeInternal;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* Default implementation of the worker process.
*/
public class DefaultWorker {
- private static final Logger LOGGER = LoggerFactory.getLogger(DefaultWorker.class);
-
public static void main(String[] args) {
- try {
- System.setProperty("ray.worker.mode", "WORKER");
- // Set run-mode to `CLUSTER` explicitly, to prevent the DefaultWorker to receive
- // a wrong run-mode parameter through jvm options.
- System.setProperty("ray.run-mode", "CLUSTER");
- Thread.setDefaultUncaughtExceptionHandler((Thread t, Throwable e) -> {
- LOGGER.error("Uncaught worker exception in thread {}: {}", t, e);
- });
- Ray.init();
- LOGGER.info("Worker started.");
- ((RayRuntimeInternal) Ray.internal()).run();
- } catch (Exception e) {
- LOGGER.error("Failed to start worker.", e);
- }
+ // Set run-mode to `CLUSTER` explicitly, to prevent the DefaultWorker to receive
+ // a wrong run-mode parameter through jvm options.
+ System.setProperty("ray.run-mode", "CLUSTER");
+ System.setProperty("ray.worker.mode", "WORKER");
+ Ray.init();
+ ((RayRuntimeInternal) Ray.internal()).run();
}
-}
+}
\ No newline at end of file
diff --git a/java/runtime/src/main/java/io/ray/runtime/util/LoggingUtil.java b/java/runtime/src/main/java/io/ray/runtime/util/LoggingUtil.java
new file mode 100644
index 000000000..29f3bd75a
--- /dev/null
+++ b/java/runtime/src/main/java/io/ray/runtime/util/LoggingUtil.java
@@ -0,0 +1,48 @@
+package io.ray.runtime.util;
+
+import com.typesafe.config.Config;
+import io.ray.runtime.config.RayConfig;
+import io.ray.runtime.generated.Common.WorkerType;
+import org.apache.log4j.ConsoleAppender;
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+import org.apache.log4j.PatternLayout;
+import org.apache.log4j.RollingFileAppender;
+import org.apache.log4j.WriterAppender;
+
+public class LoggingUtil {
+
+ private static boolean setup = false;
+
+ public static synchronized void setupLogging(RayConfig rayConfig) {
+ if (setup) {
+ return;
+ }
+ setup = true;
+
+ WriterAppender appender;
+ Config config = rayConfig.getInternalConfig();
+ if (rayConfig.workerMode == WorkerType.DRIVER) {
+ // Logs of drivers are printed to console.
+ appender = new ConsoleAppender();
+ appender.setName("console");
+ } else {
+ // Logs of workers are printed to files.
+ RollingFileAppender rfAppender = new RollingFileAppender();
+ appender = rfAppender;
+
+ rfAppender.setName("file");
+ String logPath = rayConfig.logDir + "/java-worker-" + SystemUtil.pid() + ".log";
+ rfAppender.setFile(logPath);
+ rfAppender.setMaxFileSize(config.getString("ray.logging.max-file-size"));
+ rfAppender.setMaxBackupIndex(config.getInt("ray.logging.max-backup-files"));
+ }
+ Level level = Level.toLevel(config.getString("ray.logging.level"));
+ appender.setThreshold(level);
+ PatternLayout patternLayout = new PatternLayout(config.getString("ray.logging.pattern"));
+ appender.setLayout(patternLayout);
+ appender.activateOptions();
+ Logger.getLogger("io.ray").addAppender(appender);
+ }
+
+}
diff --git a/java/runtime/src/main/java/io/ray/runtime/util/SystemUtil.java b/java/runtime/src/main/java/io/ray/runtime/util/SystemUtil.java
index f3aacdf60..a8423e2d6 100644
--- a/java/runtime/src/main/java/io/ray/runtime/util/SystemUtil.java
+++ b/java/runtime/src/main/java/io/ray/runtime/util/SystemUtil.java
@@ -3,45 +3,15 @@ package io.ray.runtime.util;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.util.concurrent.locks.ReentrantLock;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* some utilities for system process.
*/
public class SystemUtil {
- private static final Logger LOGGER = LoggerFactory.getLogger(SystemUtil.class);
-
static final ReentrantLock pidlock = new ReentrantLock();
static Integer pid;
- public static String userHome() {
- return System.getProperty("user.home");
- }
-
- public static String userDir() {
- return System.getProperty("user.dir");
- }
-
- public static boolean startWithJar(Class> cls) {
- return cls.getResource(cls.getSimpleName() + ".class").getFile().split("!")[0].endsWith(".jar");
- }
-
- public static boolean startWithJar(String clsName) {
- Class> cls;
- try {
- cls = Class.forName(clsName);
- return cls.getResource(cls.getSimpleName() + ".class").getFile().split("!")[0]
- .endsWith(".jar");
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- LOGGER.error("error at SystemUtil startWithJar", e);
- return false;
- }
- }
-
public static int pid() {
if (pid == null) {
pidlock.lock();
diff --git a/java/runtime/src/main/resources/log4j.properties b/java/runtime/src/main/resources/log4j.properties
deleted file mode 100644
index 2d28a3ca0..000000000
--- a/java/runtime/src/main/resources/log4j.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-ray.logging.level=info
-
-ray.logging.stdout=org.apache.log4j.ConsoleAppender
-ray.logging.file=org.apache.log4j.varia.NullAppender
-
-log4j.rootLogger=${ray.logging.level}, stdout, file
-
-log4j.appender.stdout=${ray.logging.stdout}
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %p %c{1} [%t]: %m%n
-
-# Set the file appender to null by default. If `ray.redirect-output` config is set to true,
-# this appender will be set to a real file appender.
-log4j.appender.file=${ray.logging.file}
-log4j.appender.file.File=${ray.logging.file.path}
-log4j.appender.file.layout=org.apache.log4j.PatternLayout
-log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %p %c{1} [%t]: %m%n
diff --git a/java/runtime/src/main/resources/ray.default.conf b/java/runtime/src/main/resources/ray.default.conf
index 2a12eaaac..43df8234a 100644
--- a/java/runtime/src/main/resources/ray.default.conf
+++ b/java/runtime/src/main/resources/ray.default.conf
@@ -31,13 +31,20 @@ ray {
resource-path: ""
}
- // Root dir of log files.
- // If this is not set, the default log-dir will be `${temp-dir}/session_xxx/logs`.
- log-dir: ""
-
- // If true, output of worker processes will be redirected to log files.
- // Otherwise, output will be printed to console.
- redirect-output: true
+ // Configurations about logging.
+ logging {
+ // Level of logging for Java workers.
+ level: INFO
+ // Pattern of log messages.
+ pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS} %p %c{1} [%t]: %m%n"
+ // Root directory of the log files.
+ // If this is not set, the default one will be `${temp-dir}/session_xxx/logs`.
+ dir: ""
+ // Maximum size that a log file is allowed to reach before being rolled over to backup files.
+ max-file-size: 500MB
+ // Maximum number of backup files to keep around.
+ max-backup-files: 10
+ }
// Custom worker jvm parameters.
worker.jvm-parameters: []
diff --git a/java/test/src/main/java/io/ray/api/TestProgressListener.java b/java/test/src/main/java/io/ray/api/TestProgressListener.java
index b41549a4b..55c0b20cc 100644
--- a/java/test/src/main/java/io/ray/api/TestProgressListener.java
+++ b/java/test/src/main/java/io/ray/api/TestProgressListener.java
@@ -22,7 +22,6 @@ public class TestProgressListener implements IInvokedMethodListener, ITestListen
@Override
public void beforeInvocation(IInvokedMethod method, ITestResult testResult) {
- printInfo("INVOKE METHOD", getFullTestName(testResult));
}
@Override
diff --git a/java/tutorial/src/main/resources/ray.conf b/java/tutorial/src/main/resources/ray.conf
index e79b1d232..d4c2ca1cd 100644
--- a/java/tutorial/src/main/resources/ray.conf
+++ b/java/tutorial/src/main/resources/ray.conf
@@ -1,4 +1,3 @@
ray {
run-mode: CLUSTER
- redirect-output: false
}