void (String[] args, DataCollectorDebugLogger logger, ExternalEventsLogger eventsLogger) { logger.info("Process started with '" + String.join(" ", args) + "'"); logger.info("Classpath:" + System.getProperty("java.class.path")); eventsLogger.logSendingLogsStarted(); if (args.length == 0) { logger.warn("No arguments were found"); eventsLogger.logSendingLogsFinished("NO_ARGUMENTS"); return; } Map<String, String> options = EventLogUploaderCliParser.parseOptions(args); EventLogApplicationInfo appInfo = newApplicationInfo(options, logger, eventsLogger); if (appInfo == null) { logger.warn("Failed creating application info from arguments"); eventsLogger.logSendingLogsFinished("NO_APPLICATION_CONFIG"); return; } List<EventLogExternalSendConfig> configs = EventLogExternalSendConfig.parseSendConfigurations(options, (recorder, error) -> { logger.warn("[" + recorder + "] Failed creating send config from arguments because " + error.getType().name()); eventsLogger.logSendingLogsFinished(recorder, error.getType().name()); }); if (!waitForIde(logger, options, 20)) { logger.warn("Cannot send logs because IDE didn't close during " + (20 * WAIT_FOR_IDE_MS) + "ms"); eventsLogger.logSendingLogsFinished("IDE_NOT_CLOSING"); return; } ExecutorService service = Executors.newFixedThreadPool(configs.size()); for (EventLogExternalSendConfig config : configs) { service.execute(() -> sendLogsByRecorder(appInfo, config, logger, eventsLogger)); } service.shutdown(); try { service.awaitTermination(5, TimeUnit.MINUTES); } catch (InterruptedException e) { // ignore } }