-
-
Save sometowngeek/38782d12ffb7195dae3071dc86a49cdc to your computer and use it in GitHub Desktop.
Custom Log Factory
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package my.logger; | |
import java.text.SimpleDateFormat; | |
import java.util.Date; | |
import org.apache.logging.log4j.Level; | |
import org.apache.logging.log4j.LogManager; | |
import org.apache.logging.log4j.Logger; | |
import org.apache.logging.log4j.core.Filter.Result; | |
import org.apache.logging.log4j.core.appender.ConsoleAppender; | |
import org.apache.logging.log4j.core.config.Configurator; | |
import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder; | |
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder; | |
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory; | |
import org.apache.logging.log4j.core.config.builder.api.LoggerComponentBuilder; | |
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration; | |
public class CustomLogFactory { | |
/** | |
* Instantiates a new CustomLogFactory | |
*/ | |
private CustomLogFactory() { | |
// No-arg constructor | |
} | |
/** The Constant LOG_PATTERN. */ | |
private static final String LOG_PATTERN = "[%d{MM/dd/yyyy HH:mm:ss.SSS zzz}] [%t] [%-5level] %logger{36} Line %L: %M - %msg%n"; | |
/** The Constant LOG_DIRECTORY. */ | |
private static final String LOG_DIRECTORY = System.getenv("MY_LOG_DIRECTORY"); | |
/** The Constant DATE_STAMP. */ | |
private static final Object DATE_STAMP = (new SimpleDateFormat("yyyyMMdd")).format(new Date()); | |
/** | |
* Gets the logger. | |
* | |
* @param clazz the class. | |
* @return the logger | |
*/ | |
public static Logger getLogger(Class<?> clazz) { | |
configure(clazz); | |
return LogManager.getLogger(clazz); | |
} | |
private static void configure(Class<?> clazz) { | |
ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder(); | |
builder.setStatusLevel(Level.INFO); | |
/* | |
* Base config | |
*/ | |
// Set configuration name | |
String name = getRootPackageName(clazz); | |
builder.setConfigurationName(name); | |
/* | |
* Appenders | |
*/ | |
configureConsoleAppenders(builder); | |
// Add Class Appender | |
String regularFileName = clazz.getSimpleName(); | |
String className = clazz.getCanonicalName(); | |
String fileName = String.format("%s/%sLog_%s.log", GCLogFactory.LOG_DIRECTORY, regularFileName, GCLogFactory.DATE_STAMP); | |
AppenderComponentBuilder fileAppender = builder.newAppender(className, "FILE"); | |
fileAppender.addAttribute("fileName", fileName); | |
fileAppender.add(builder.newFilter("ThresholdFilter", Result.DENY, Result.ACCEPT).addAttribute("level", "ERROR")); | |
configurePatternBuilder(builder, fileAppender); | |
builder.add(fileAppender); | |
String errorFileName = String.format("%serror", regularFileName); | |
String classNameError = String.format("%s_error", className); | |
String fileNameError = String.format("%s/%sLogError_%s.log", GCLogFactory.LOG_DIRECTORY, errorFileName, GCLogFactory.DATE_STAMP); | |
AppenderComponentBuilder errorFileAppender = builder.newAppender(classNameError, "FILE"); | |
errorFileAppender.addAttribute("fileName", fileNameError); | |
errorFileAppender.add(builder.newFilter("ThresholdFilter", Result.ACCEPT, Result.DENY).addAttribute("level", "ERROR")); | |
configurePatternBuilder(builder, errorFileAppender); | |
builder.add(errorFileAppender); | |
/* | |
* Loggers | |
*/ | |
// Add Logger | |
LoggerComponentBuilder logger = builder.newLogger(className, Level.INFO); | |
// Add console appender ref | |
logger.add(builder.newAppenderRef("Stdout")); | |
// Add class appender refs | |
logger.add(builder.newAppenderRef(className)); | |
logger.add(builder.newAppenderRef(classNameError)); | |
builder.add(logger); | |
// Add Root Logger | |
builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stderr"))); | |
// Initialize configuration | |
Configurator.initialize(builder.build()); | |
} | |
private static void configureConsoleAppenders(ConfigurationBuilder<BuiltConfiguration> builder) { | |
// Set Console appender | |
AppenderComponentBuilder appenderBuilder = builder.newAppender("Stdout", "CONSOLE"); | |
appenderBuilder.addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT); | |
configurePatternBuilder(builder, appenderBuilder); | |
appenderBuilder.add(builder.newFilter("ThresholdFilter", Result.DENY, Result.ACCEPT).addAttribute("level", "ERROR")); | |
builder.add(appenderBuilder); | |
// Set Console "ERROR" appender | |
AppenderComponentBuilder appenderBuilderErr = builder.newAppender("Stderr", "CONSOLE"); | |
appenderBuilderErr.addAttribute("target", ConsoleAppender.Target.SYSTEM_ERR); | |
configurePatternBuilder(builder, appenderBuilderErr); | |
appenderBuilderErr.add(builder.newFilter("ThresholdFilter", Result.ACCEPT, Result.DENY).addAttribute("level", "ERROR")); | |
builder.add(appenderBuilderErr); | |
} | |
private static void configurePatternBuilder(ConfigurationBuilder<BuiltConfiguration> builder, | |
AppenderComponentBuilder appenderBuilder) { | |
appenderBuilder.add(builder.newLayout("PatternLayout").addAttribute("pattern", GCLogFactory.LOG_PATTERN)); | |
} | |
private static String getRootPackageName(Class<?> clazz) { | |
clazz.getPackage(); | |
return Package.getPackages()[0].getName(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment