/******************************************************************************* * Copyright 2017 Capital One Services, LLC and Bitwise, Inc. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ package hydrograph.ui.joblogger; import hydrograph.ui.joblogger.logger.AbstractJobLogger; import hydrograph.ui.joblogger.logger.ConsoleLogger; import hydrograph.ui.joblogger.logger.FileLogger; import hydrograph.ui.joblogger.utils.JobLoggerUtils; import hydrograph.ui.logging.factory.LogFactory; import org.apache.commons.lang.StringUtils; import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; /** * The Class JobLogger. * <p> * Manages Job logging. Job logs will be displayed in console as well as written in the log file. For each job run, it * will log system information of the client machine. * * @author Bitwise */ public class JobLogger { private static final Logger logger = LogFactory.INSTANCE.getLogger(JobLogger.class); private static final String EXECUTION_TRACKING_LOG_FILE_EXTENTION = ".track.log"; private List<AbstractJobLogger> loggers; private String projectName; private String jobName; private String jobRunId; public JobLogger(String projectName, String jobName,String jobRunId){ this.projectName = projectName; this.jobName = jobName; this.jobRunId = jobRunId; registerLoggers(); logger.debug("Registered all loggers"); } private void registerLoggers(){ loggers = new ArrayList<>(); loggers.add(new FileLogger(projectName, jobName, jobRunId)); logger.debug("Registred file logger"); loggers.add(new ConsoleLogger(projectName, jobName)); logger.debug("Registered Console logger"); } /** * * log system information * */ public void logSystemInformation(){ for(AbstractJobLogger jobLogger: loggers){ jobLogger.logWithNoTimeStamp("System Properties: "); logSystemProperties(jobLogger); logRuntimeInformation(jobLogger); jobLogger.logWithNoTimeStamp("--------------------------------------------\n"); logger.debug("Logged System information on {}", jobLogger.getClass().getName()); } } /** * * Logs runtime properties * * @param jobLogger */ private void logRuntimeInformation(AbstractJobLogger jobLogger) { Runtime runtime = Runtime.getRuntime(); long maxMemory = runtime.maxMemory(); jobLogger.logWithNoTimeStamp("Max Memory: " + Long.toString(maxMemory / 1024)); long allocatedMemory = runtime.totalMemory(); jobLogger.logWithNoTimeStamp("Allocated Memory: " + Long.toString(allocatedMemory / 1024)); long freeMemory = runtime.freeMemory(); jobLogger.logWithNoTimeStamp("Free Memory: " + Long.toString(freeMemory / 1024)); jobLogger.logWithNoTimeStamp("Total free memory: " + Long .toString((freeMemory + (maxMemory - allocatedMemory)) / 1024)); long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); jobLogger.logWithNoTimeStamp("Used Memory : " + Long.toString(used)); } /** * Log system properties * * @param jobLogger */ private void logSystemProperties(AbstractJobLogger jobLogger) { jobLogger.logWithNoTimeStamp("Operating System : " + System.getProperty("os.name")); jobLogger.logWithNoTimeStamp("JVM : " + System.getProperty("java.vm.name")); jobLogger.logWithNoTimeStamp("Java specification version : " + System.getProperty("java.specification.version")); jobLogger.logWithNoTimeStamp("Java Version : " + System.getProperty("java.version")); jobLogger.logWithNoTimeStamp("Osgi OS : " + System.getProperty("osgi.os")); jobLogger.logWithNoTimeStamp("Operating System Version : " + System.getProperty("os.version")); jobLogger.logWithNoTimeStamp("Operating System Architecture : " + System.getProperty("os.arch")); } /** * * log message * * @param message */ public void logMessage(String message){ for(AbstractJobLogger jobLogger: loggers){ if(StringUtils.isNotBlank(message)){ message = StringUtils.trim(message); jobLogger.log(message); } logger.debug("Logged message {} on {}", message, jobLogger.getClass().getName()); } } /** * * Log job start information * */ public void logJobStartInfo(String jobRunId){ for(AbstractJobLogger jobLogger: loggers){ jobLogger.logWithNoTimeStamp("===================================================================="); jobLogger.logWithNoTimeStamp("Job Start Timestamp: " + JobLoggerUtils.getTimeStamp()); jobLogger.logWithNoTimeStamp("Job Name: " + jobLogger.getFullJobName()); jobLogger.logWithNoTimeStamp("Job Id: " + getJobId(jobRunId)); jobLogger.logWithNoTimeStamp("Run Id: " + jobRunId); jobLogger.logWithNoTimeStamp("===================================================================="); logger.debug("Logged job start info on {}",jobLogger.getClass().getName()); } } /** * * Log job end information * */ public void logJobEndInfo(String jobRunId, String trackingFilePath){ for(AbstractJobLogger jobLogger: loggers){ jobLogger.logWithNoTimeStamp("===================================================================="); jobLogger.logWithNoTimeStamp("Job End Timestamp: " + JobLoggerUtils.getTimeStamp()); jobLogger.logWithNoTimeStamp("Job Name: " + jobLogger.getFullJobName()); if(StringUtils.isNotBlank(trackingFilePath)){ jobLogger.logWithNoTimeStamp("Job Tracking log File on local: " + trackingFilePath + jobRunId + EXECUTION_TRACKING_LOG_FILE_EXTENTION); } jobLogger.logWithNoTimeStamp("Job Id: " + getJobId(jobRunId)); jobLogger.logWithNoTimeStamp("Run Id: " + jobRunId); jobLogger.logWithNoTimeStamp("===================================================================="); jobLogger.logWithNoTimeStamp("\n\n"); logger.debug("Logged job end info on {}",jobLogger.getClass().getName()); } } /** * @param jobRunId * @return Job Id */ private String getJobId(String jobRunId){ String id[] = jobRunId.split("_"); jobRunId = id[0]; for(int i = 1; i < id.length-1; i++){ jobRunId = jobRunId + "_" + id[i]; } return jobRunId; } /** * Release used resources * */ public void close(){ for(AbstractJobLogger jobLogger: loggers){ jobLogger.close(); logger.debug("Closed logger - {}",jobLogger.getClass().getName()); } } }