top of page

Layered Log

  • taolius
  • Feb 23, 2018
  • 2 min read

import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Filter.Result; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.config.AppenderRef; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.LoggerConfig; import org.apache.logging.log4j.core.filter.TimeFilter; import org.joda.time.DateTime; import org.springframework.stereotype.Service; @Service public class LoggerServiceImpl implements LoggerService { private static final Logger logger = LogManager.getLogger(LoggerServiceImpl.class); private static DateFormat uiDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private static Map<String, MeridianLogger> currentLoggers = new HashMap<>(); public Collection<MeridianLogger> getLoggers() { return currentLoggers.values(); } public Collection<MeridianLogger> updateLogger(MeridianLogger meridianLogger, String action) { try { final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); final Configuration config = ctx.getConfiguration(); if (action.equalsIgnoreCase("clear")) { config.removeLogger(meridianLogger.getLoggerName()); ctx.updateLoggers(); currentLoggers.remove(meridianLogger.getLoggerName()); return currentLoggers.values(); } else if (action.equalsIgnoreCase("add") || action.equalsIgnoreCase("apply")) { Map<String, Object> loggerInfo = parseuserInput(meridianLogger); if (loggerInfo == null) return null; // if (action.equalsIgnoreCase("apply")) { // do it for both "add" and "apply" config.removeLogger(meridianLogger.getLoggerName()); ctx.updateLoggers(); // } Appender rolling = config.getAppender("ROLLING"); AppenderRef ref = AppenderRef.createAppenderRef("ROLLING", null, null); AppenderRef[] refs = new AppenderRef[] { ref }; TimeFilter timeFilter = TimeFilter.createFilter((String) loggerInfo.get("startTime"), (String) loggerInfo.get("endTime"), null, Result.NEUTRAL, Result.DENY); LoggerConfig loggerConfig = LoggerConfig.createLogger("false", (Level) loggerInfo.get("logLevel"), (String) loggerInfo.get("loggerName"), null, refs, null, config, timeFilter); loggerConfig.addAppender(rolling, null, null); config.addLogger((String) loggerInfo.get("loggerName"), loggerConfig); ctx.updateLoggers(); currentLoggers.put(meridianLogger.getLoggerName(), meridianLogger); return currentLoggers.values(); } else return null; } catch (Exception e) { logger.error("can not update logger: " + e.getMessage()); return null; } } private Map<String, Object> parseuserInput(MeridianLogger meridianLogger) { Map<String, Object> loggerInfo = new HashMap<>(); try { String loggerName = meridianLogger.getLoggerName(); loggerInfo.put("loggerName", loggerName); int timeout = meridianLogger.getTimeout(); loggerInfo.put("timeout", new Integer(timeout)); Level logLevel = getLogLevel(meridianLogger.getLogLevel()); if (logLevel == null) { return null; } loggerInfo.put("logLevel", logLevel); DateTime current = new DateTime(); Date startDate = current.toDate(); String timeString = uiDateFormat.format(startDate); int length = timeString.length(); String start = timeString.substring(10, length); loggerInfo.put("startTime", start); Date endDate = current.plusHours(timeout).toDate(); timeString = uiDateFormat.format(endDate); meridianLogger.setExpiration(timeString); currentLoggers.put(loggerName, meridianLogger); String end = timeString.substring(10, length); loggerInfo.put("endTime", end); } catch (Exception e) { logger.error("parsing user input exception: " + e.getMessage()); loggerInfo = null; } return loggerInfo; } private Level getLogLevel(String level) { if (level == null) return null; String tmp = level.toUpperCase(); switch (tmp) { case "OFF": return Level.OFF; case "FATAL": return Level.FATAL; case "ERROR": return Level.ERROR; case "WARN": return Level.WARN; case "INFO": return Level.INFO; case "DEBUG": return Level.DEBUG; case "TRACE": return Level.TRACE; case "ALL": return Level.ALL; default: return null; } } } --------

public class MeridianLogger { private String loggerName; private String logLevel; private int timeout; // in second private String expiration; public String getLoggerName() { return loggerName; } public void setLoggerName(String loggerName) { this.loggerName = loggerName; } public String getLogLevel() { return logLevel; } public void setLogLevel(String logLevel) { this.logLevel = logLevel; } public int getTimeout() { return timeout; } public void setTimeout(int timeout) { this.timeout = timeout; } public String getExpiration() { return expiration; } public void setExpiration(String expiration) { this.expiration = expiration; } }


 
 
 

Commenti


© 2023 by BI World. Proudly created with Wix.com

  • Facebook Basic Black
  • Twitter Basic Black
  • YouTube Basic Black
bottom of page