private Agent createAgent(final Properties props) throws IOException, AdminException { DistributionManager.isDedicatedAdminVM = true; SystemFailure.setExitOK(true); final AgentConfigImpl config = createAgentConfig(props); // see bug 43760 if (config.getLogFile() == null || "".equals(config.getLogFile().trim())) { config.setLogFile(AgentConfigImpl.DEFAULT_LOG_FILE); } logger = config.getLogWriter(); OSProcess.redirectOutput( new File(config.getLogFile())); // redirect output to the configured log file return AgentFactory.getAgent(config); }
/** * Creates the log writer appender for a distributed system based on the system's parsed * configuration. The initial banner and messages are also entered into the log by this method. * * @param isLoner Whether the distributed system is a loner or not * @param isSecurity Whether a log for security related messages has to be created * @param config The DistributionConfig for the target distributed system * @param logConfig if true log the configuration * @throws GemFireIOException if the log file can't be opened for writing */ static LogWriterAppender createLogWriterAppender( final boolean appendToFile, final boolean isLoner, final boolean isSecurity, final LogConfig config, final boolean logConfig) { final boolean isDistributionConfig = config instanceof DistributionConfig; final DistributionConfig dsConfig = isDistributionConfig ? (DistributionConfig) config : null; File logFile = config.getLogFile(); String firstMsg = null; boolean firstMsgWarning = false; AlertAppender.getInstance().setAlertingDisabled(isLoner); // security-log-file is specified in DistributionConfig if (isSecurity) { if (isDistributionConfig) { File tmpLogFile = dsConfig.getSecurityLogFile(); if (tmpLogFile != null && !tmpLogFile.equals(new File(""))) { logFile = tmpLogFile; } } else { throw new IllegalArgumentException("DistributionConfig is expected for SecurityLogWriter"); } } // log-file is NOT specified in DistributionConfig if (logFile == null || logFile.equals(new File(""))) { // out = System.out; return null; } // log-file is specified in DistributionConfig // if logFile exists attempt to rename it for rolling if (logFile.exists()) { final boolean useChildLogging = config.getLogFile() != null && !config.getLogFile().equals(new File("")) && config.getLogFileSizeLimit() != 0; final boolean statArchivesRolling = isDistributionConfig && dsConfig.getStatisticArchiveFile() != null && !dsConfig.getStatisticArchiveFile().equals(new File("")) && dsConfig.getArchiveFileSizeLimit() != 0 && dsConfig.getStatisticSamplingEnabled(); if (!appendToFile || useChildLogging || statArchivesRolling) { // check useChildLogging for bug 50659 final File oldMain = ManagerLogWriter.getLogNameForOldMainLog( logFile, isSecurity || useChildLogging || statArchivesRolling); final boolean succeeded = LogFileUtils.renameAggressively(logFile, oldMain); if (succeeded) { firstMsg = LocalizedStrings.InternalDistributedSystem_RENAMED_OLD_LOG_FILE_TO_0 .toLocalizedString(oldMain); } else { firstMsgWarning = true; firstMsg = LocalizedStrings.InternalDistributedSystem_COULD_NOT_RENAME_0_TO_1.toLocalizedString( new Object[] {logFile, oldMain}); } } } // create a FileOutputStream to the logFile FileOutputStream fos; try { fos = new FileOutputStream(logFile, true); } catch (FileNotFoundException ex) { String s = LocalizedStrings.InternalDistributedSystem_COULD_NOT_OPEN_LOG_FILE_0.toLocalizedString( logFile); throw new GemFireIOException(s, ex); } final PrintStream out = new PrintStream(fos); // create the ManagerLogWriter that LogWriterAppender will wrap ManagerLogWriter mlw = null; String logWriterLoggerName = null; if (isSecurity) { mlw = new SecurityManagerLogWriter(dsConfig.getSecurityLogLevel(), out, config.getName()); logWriterLoggerName = LogService.SECURITY_LOGGER_NAME; } else { mlw = new ManagerLogWriter(config.getLogLevel(), out, config.getName()); logWriterLoggerName = LogService.MAIN_LOGGER_NAME; } mlw.setConfig(config); // if (mlw.infoEnabled()) { -- skip here and instead do this in LogWriterFactory when // creating the LogWriterLogger // if (!isLoner /* do this on a loner to fix bug 35602 */ // || !Boolean.getBoolean(InternalLocator.INHIBIT_DM_BANNER)) { // mlw.info(Banner.getString(null)); // } // } AppenderContext[] appenderContext = new AppenderContext[1]; if (isSecurity) { appenderContext[0] = LogService.getAppenderContext(LogService.SECURITY_LOGGER_NAME); } else { appenderContext[0] = LogService.getAppenderContext(); // ROOT or gemfire.logging.appenders.LOGGER } // create the LogWriterAppender that delegates to ManagerLogWriter; final LogWriterAppender appender = LogWriterAppender.create(appenderContext, logWriterLoggerName, mlw, fos); // remove stdout appender from MAIN_LOGGER_NAME only if isUsingGemFireDefaultConfig -- see // #51819 if (!isSecurity && LogService.MAIN_LOGGER_NAME.equals(logWriterLoggerName) && LogService.isUsingGemFireDefaultConfig()) { LogService.removeConsoleAppender(); } // log the first msg about renaming logFile for rolling if it pre-existed final InternalLogWriter logWriter = mlw; if (firstMsg != null) { if (firstMsgWarning) { logWriter.warning(firstMsg); } else { logWriter.info(firstMsg); } } // log the config if (logConfig) { if (isLoner) { logWriter.info( LocalizedStrings .InternalDistributedSystem_RUNNING_IN_LOCAL_MODE_SINCE_MCASTPORT_WAS_0_AND_LOCATORS_WAS_EMPTY); } else { // LOG:CONFIG: changed from config to info logWriter.info( LocalizedStrings.InternalDistributedSystem_STARTUP_CONFIGURATIONN_0, config.toLoggerString()); } } // LOG: do NOT allow redirectOutput if (ALLOW_REDIRECT) { // fix #46493 by moving redirectOutput invocation here if (ProcessLauncherContext.isRedirectingOutput()) { try { OSProcess.redirectOutput(config.getLogFile()); } catch (IOException e) { logWriter.error(e); // throw new GemFireIOException("Unable to redirect output to " + config.getLogFile(), e); } } } return appender; }