/* * Copyright (c) 2014 EMC Corporation * All Rights Reserved */ package com.emc.storageos.systemservices.impl.logsvc.merger; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.systemservices.impl.logsvc.LogMessage; import com.emc.storageos.systemservices.impl.logsvc.LogSvcPropertiesLoader; import com.emc.storageos.systemservices.impl.logsvc.stream.LogFileStream; import com.emc.storageos.systemservices.impl.logsvc.util.LogFileFinder; import com.emc.vipr.model.sys.logging.LogRequest; /** * This class is responsible to read one line from each logstream and sort them based on timestamp. * This is done on per host basis. * */ public class LogStreamMerger extends AbstractLogStreamMerger { // Logger reference. private static final Logger logger = LoggerFactory.getLogger(LogStreamMerger.class); private AtomicLong sizeCounter = new AtomicLong(0); /** * Merges all logs on this node based on time stamp * * @param req * @param propertiesLoader */ public LogStreamMerger(LogRequest req, LogSvcPropertiesLoader propertiesLoader) { logger.trace("LogStreamMerger()"); this.request = req; LogFileFinder fileFinder = new LogFileFinder(propertiesLoader.getLogFilePaths(), propertiesLoader.getExcludedLogFilePaths()); Map<String, List<File>> groupedLogFiles = fileFinder.findFilesGroupedByBaseName(); List<String> groups = req.getBaseNames(); if (groups == null || groups.isEmpty()) { // default set to all kinds of svcs groups = new ArrayList<>(groupedLogFiles.keySet()); } logger.debug("log names: {}", groups); if (groups.retainAll(groupedLogFiles.keySet())) { logger.info("log names after filter: {}", groups); // TODO: what if groups become empty after filter // TODO: also this should probably go to log service } int size = groups.size(); logStreamList = new LogFileStream[size]; logHeads = new LogMessage[size]; for (int i = 0; i < size; i++) { String service = groups.get(i); logStreamList[i] = new LogFileStream(service, groupedLogFiles.get(service), req, status); logHeads[i] = null;// so that read next will continue } } protected void addFinishedStream(int i) { super.addFinishedStream(i); sizeCounter.addAndGet(((LogFileStream) logStreamList[i]).getTotalSizeCount()); } public LogFileStream[] getStreamList() { LogFileStream[] logFileStreams = new LogFileStream[logStreamList.length]; for (int i = 0; i < logStreamList.length; i++) { logFileStreams[i] = (LogFileStream) logStreamList[i]; } return logFileStreams; } public long getFileSize() { return this.sizeCounter.get(); } }