Skip to content

Instantly share code, notes, and snippets.

@sometowngeek
Last active December 12, 2019 01:15
Show Gist options
  • Save sometowngeek/38782d12ffb7195dae3071dc86a49cdc to your computer and use it in GitHub Desktop.
Save sometowngeek/38782d12ffb7195dae3071dc86a49cdc to your computer and use it in GitHub Desktop.
Custom Log Factory
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