package com.sohu.cache.jmx;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import com.google.common.util.concurrent.AtomicLongMap;
import com.sohu.cache.log.statistic.ErrorStatisticsAppender;
import org.slf4j.LoggerFactory;
import java.util.*;
/**
* Created by yijunzhang on 14-2-19.
*/
public class ErrorLoggerWatcher implements ErrorLoggerWatcherMBean {
private final org.slf4j.Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* 初始化logback 自定义appender
*/
public void init() {
logger.warn("ErrorStatisticsAppender init begin!");
if (LoggerFactory.getILoggerFactory() instanceof LoggerContext) {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
Logger rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
ErrorStatisticsAppender errorStatisticsAppender = new ErrorStatisticsAppender();
errorStatisticsAppender.setContext(loggerContext);
errorStatisticsAppender.start();
rootLogger.addAppender(errorStatisticsAppender);
logger.warn("ErrorStatisticsAppender init Done!");
} else {
logger.error("ErrorStatisticsAppender init failed , LoggerFactory.getILoggerFactory()={}", LoggerFactory.getILoggerFactory());
}
}
@Override
public long getTotalErrorCount() {
AtomicLongMap<String> atomicLongMap = ErrorStatisticsAppender.ERROR_NAME_VALUE_MAP;
return atomicLongMap.sum();
}
@Override
public Map<String, Long> getErrorInfos() {
Map<String, Long> longMap = ErrorStatisticsAppender.ERROR_NAME_VALUE_MAP.asMap();
Map<String, Long> resultMap = new LinkedHashMap<String, Long>();
//排序
SortedMap<Long, List<String>> sortedMap = new TreeMap<Long, List<String>>();
for (Map.Entry<String, Long> entry : longMap.entrySet()) {
String key = entry.getKey();
Long num = entry.getValue();
if (num == 0L) {
continue;
}
if (sortedMap.containsKey(num)) {
sortedMap.get(num).add(key);
} else {
List<String> keys = new ArrayList<String>();
keys.add(key);
sortedMap.put(num, keys);
}
}
List<Long> keys = new ArrayList<Long>(sortedMap.keySet());
Collections.reverse(keys);
for (Long num : keys) {
for (String key : sortedMap.get(num)) {
resultMap.put(key, num);
}
}
return resultMap;
}
@Override
public void clear() {
ErrorStatisticsAppender.ERROR_NAME_VALUE_MAP.clear();
}
}