/* * Copyright © 2014 Cask Data, 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 co.cask.cdap.logging; import com.google.common.base.Objects; import com.google.common.base.Splitter; import com.google.common.collect.Lists; import java.util.Iterator; import java.util.List; import java.util.concurrent.TimeUnit; /** * Logging configuration helper. */ public final class LoggingConfiguration { // Common between Distributed and Single Node public static final String LOG_PATTERN = "log.pattern"; public static final String LOG_BASE_DIR = "log.base.dir"; public static final String LOG_FILE_SYNC_INTERVAL_BYTES = "log.file.sync.interval.bytes"; // Used only in Distributed mode public static final String NUM_PARTITIONS = "log.publish.num.partitions"; public static final String KAFKA_SEED_BROKERS = "kafka.seed.brokers"; public static final String LOG_SAVER_EVENT_BUCKET_INTERVAL_MS = "log.saver.event.bucket.interval.ms"; public static final String LOG_SAVER_MAXIMUM_INMEMORY_EVENT_BUCKETS = "log.saver.event.max.inmemory.buckets"; public static final String LOG_SAVER_INACTIVE_FILE_INTERVAL_MS = "log.saver.inactive.file.interval.ms"; public static final String LOG_SAVER_CHECKPOINT_INTERVAL_MS = "log.saver.checkpoint.interval.ms"; public static final String LOG_SAVER_TOPIC_WAIT_SLEEP_MS = "log.saver.topic.wait.sleep.ms"; public static final String LOG_RETENTION_DURATION_DAYS = "log.retention.duration.days"; public static final String LOG_MAX_FILE_SIZE_BYTES = "log.max.file.size.bytes"; public static final String KAFKA_PRODUCER_TYPE = "kafka.producer.type"; public static final String KAFKA_PROCUDER_BUFFER_MS = "kafka.producer.buffer.ms"; public static final String LOG_CLEANUP_RUN_INTERVAL_MINS = "log.cleanup.run.interval.mins"; // Constants // Table used to store log metadata public static final String LOG_META_DATA_TABLE = "log.meta"; // Defaults public static final String DEFAULT_LOG_PATTERN = "%d{ISO8601} - %-5p [%t:%c{1}@%L] - %m%n"; public static final String DEFAULT_KAFKA_PRODUCER_TYPE = "async"; public static final long DEFAULT_KAFKA_PROCUDER_BUFFER_MS = 1000; public static final String DEFAULT_NUM_PARTITIONS = "10"; public static final int DEFAULT_LOG_CLEANUP_RUN_INTERVAL_MINS = 24 * 60; public static final long DEFAULT_LOG_SAVER_EVENT_BUCKET_INTERVAL_MS = 1 * 1000; public static final long DEFAULT_LOG_SAVER_MAXIMUM_INMEMORY_EVENT_BUCKETS = 8; public static final long DEFAULT_LOG_SAVER_INACTIVE_FILE_INTERVAL_MS = 60 * 60 * 1000; public static final long DEFAULT_LOG_SAVER_CHECKPOINT_INTERVAL_MS = 60 * 1000; public static final long DEFAULT_LOG_RETENTION_DURATION_DAYS = 30; public static final long DEFAULT_LOG_SAVER_TOPIC_WAIT_SLEEP_MS = TimeUnit.MILLISECONDS.convert(10, TimeUnit.SECONDS); private LoggingConfiguration() {} /** * Given a string of format "host1:port1,host2:port2", the function returns a list of Kafka hosts. * @param seedBrokers String to parse the host/port list from. * @return list of Kafka hosts. */ public static List<KafkaHost> getKafkaSeedBrokers(String seedBrokers) { List<KafkaHost> kafkaHosts = Lists.newArrayList(); for (String hostPort : Splitter.on(",").trimResults().split(seedBrokers)) { Iterable<String> hostPortList = Splitter.on(":").trimResults().split(hostPort); Iterator<String> it = hostPortList.iterator(); kafkaHosts.add(new KafkaHost(it.next(), Integer.parseInt(it.next()))); } return kafkaHosts; } /** * Represents a Kafka host with hostname and port. */ public static class KafkaHost { private final String hostname; private final int port; public KafkaHost(String hostname, int port) { this.hostname = hostname; this.port = port; } public String getHostname() { return hostname; } public int getPort() { return port; } @Override public String toString() { return Objects.toStringHelper(this) .add("hostname", hostname) .add("port", port) .toString(); } } }