example java log4j log4j2

java - log4j2 json configuration example



¿Cómo configurar log4j 2.x de forma puramente programática? (4)

¿Cómo configuro log4j 2.3 con console appender puro programáticamente (sin archivos de configuración de ningún formato)?

Básicamente estoy buscando la versión 2.x de este código 1.x.

En mis clases yo usaría

private static final Logger logger = LogManager.getLogger(); // // some method logger.debug(someString);

Sin ninguna configuración estoy (como se esperaba) enfrentando

ERROR StatusLogger No se encontró el archivo de configuración log4j2. Usando la configuración por defecto: registrando solo errores en la consola.

Si bien el uso de los archivos de configuración parece estar bien documentado , no pude encontrar un buen ejemplo de un caso de código único.

Lo más cercano que obtuve es este artículo que todavía usa un archivo ficticio.

Aquí está mi mejor (aunque completamente fracasado) tiro:

private static void configureLog4J() { PatternLayout layout = PatternLayout.createDefaultLayout(); ConsoleAppender appender = ConsoleAppender.createDefaultAppenderForLayout(layout); LoggerConfig loggerConfig = new LoggerConfig(); loggerConfig.addAppender(appender, DEBUG, null); }

¿Me he perdido algo?

Si todavía es un caso RTFM, indíqueme la dirección correcta.


Aquí hay un ejemplo completo para la configuración de log4j 2.8 programáticamente. Tiene 3 agregadores: RollingFile, JDBC y SMTP.

Hay 1 clase y 2 archivos de configuración de propiedades, uno para registrar la clase como log4j2 configurationFactory y el otro para establecer propiedades como el directorio del archivo de registro.

Clase # 1: MPLoggingConfiguration

package com.websitester.config; import java.io.Serializable; import java.nio.charset.Charset; import java.util.zip.Deflater; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.appender.RollingFileAppender; import org.apache.logging.log4j.core.appender.SmtpAppender; import org.apache.logging.log4j.core.appender.db.ColumnMapping; import org.apache.logging.log4j.core.appender.db.jdbc.ColumnConfig; import org.apache.logging.log4j.core.appender.db.jdbc.ConnectionSource; import org.apache.logging.log4j.core.appender.db.jdbc.DataSourceConnectionSource; import org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender; import org.apache.logging.log4j.core.appender.rolling.CompositeTriggeringPolicy; import org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy; import org.apache.logging.log4j.core.appender.rolling.OnStartupTriggeringPolicy; import org.apache.logging.log4j.core.appender.rolling.SizeBasedTriggeringPolicy; import org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy; import org.apache.logging.log4j.core.config.AppenderRef; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.ConfigurationFactory; import org.apache.logging.log4j.core.config.ConfigurationSource; import org.apache.logging.log4j.core.config.DefaultConfiguration; import org.apache.logging.log4j.core.config.LoggerConfig; import org.apache.logging.log4j.core.config.Order; import org.apache.logging.log4j.core.config.Property; import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.layout.HtmlLayout; import org.apache.logging.log4j.core.layout.PatternLayout; public class MPLoggingConfiguration { public static final String WEBSITESTER_LOGGER_NAME = "com.websitester"; public static final String FILE_PATTERN_LAYOUT = "%n[%d{yyyy-MM-dd HH:mm:ss}] [%-5p] [%l]%n/t%m%n%n"; public static final String LOG_FILE_NAME = "awmonitor.log"; public static final String LOG_FILE_NAME_PATTERN = "awmonitor-%i.log"; /** * Just to make JVM visit this class to initialize the static parts. */ public static void configure() { } @Plugin(category = ConfigurationFactory.CATEGORY, name = "MPConfigurationFactory") @Order(15) public static class MPConfigurationFactory extends ConfigurationFactory { public static final String[] SUFFIXES = new String[] {".json", "*"}; @Override protected String[] getSupportedTypes() { return SUFFIXES; } @Override public Configuration getConfiguration(LoggerContext arg0, ConfigurationSource arg1) { return new Log4j2Configuration(arg1); } } private static class Log4j2Configuration extends DefaultConfiguration { public Log4j2Configuration(ConfigurationSource source) { super.doConfigure(); setName("mp-log4j2"); String logFilePath = "/log/weblogic/wl-moniport/"; // LOGGERS // com.websitester AppenderRef[] refs = new AppenderRef[] {}; Property[] properties = new Property[] {}; LoggerConfig websitesterLoggerConfig = LoggerConfig.createLogger(true, Level.INFO, WEBSITESTER_LOGGER_NAME, "true", refs, properties, this, null); addLogger(WEBSITESTER_LOGGER_NAME, websitesterLoggerConfig); // APPENDERS final Charset charset = Charset.forName("UTF-8"); // MP ROLLING FILE TriggeringPolicy mpFileCompositePolicy = CompositeTriggeringPolicy.createPolicy( SizeBasedTriggeringPolicy.createPolicy("3 M"), OnStartupTriggeringPolicy.createPolicy(1)); final DefaultRolloverStrategy mpFileRolloverStrategy = DefaultRolloverStrategy.createStrategy("9", "1", "max", Deflater.NO_COMPRESSION + "", null, true, this); Layout<? extends Serializable> mpFileLayout = PatternLayout.newBuilder() .withPattern(FILE_PATTERN_LAYOUT) .withPatternSelector(null) .withConfiguration(this) .withRegexReplacement(null) .withCharset(charset) .withAlwaysWriteExceptions(isShutdownHookEnabled) .withNoConsoleNoAnsi(isShutdownHookEnabled) .withHeader(null) .withFooter(null) .build(); Appender mpFileAppender = RollingFileAppender.newBuilder() .withAdvertise(Boolean.parseBoolean(null)) .withAdvertiseUri(null) .withAppend(true) .withBufferedIo(true) .withBufferSize(8192) .setConfiguration(this) .withFileName(logFilePath + LOG_FILE_NAME) .withFilePattern(logFilePath + LOG_FILE_NAME_PATTERN) .withFilter(null) .withIgnoreExceptions(true) .withImmediateFlush(true) .withLayout(mpFileLayout) .withCreateOnDemand(false) .withLocking(false) .withName("error_file_web") .withPolicy(mpFileCompositePolicy) .withStrategy(mpFileRolloverStrategy) .build(); mpFileAppender.start(); addAppender(mpFileAppender); getLogger(WEBSITESTER_LOGGER_NAME).addAppender(mpFileAppender, Level.DEBUG, null); // JDBC if (System.getProperty("log4jjdbcjndiName") != null){ ColumnConfig[] columnConfigs = new ColumnConfig[] { ColumnConfig.newBuilder() .setConfiguration(this) .setName("DATED") .setPattern(null) .setLiteral(null) .setEventTimestamp(true) .setUnicode(false) .setClob(false) .build(), ColumnConfig.newBuilder() .setConfiguration(this) .setName("LOGGER") .setPattern("%logger") .setLiteral(null) .setEventTimestamp(false) .setUnicode(false) .setClob(false) .build(), ColumnConfig.newBuilder() .setConfiguration(this) .setName("LOG_LEVEL") .setPattern("%level") .setLiteral(null) .setEventTimestamp(false) .setUnicode(false) .setClob(false) .build(), ColumnConfig.newBuilder() .setConfiguration(this) .setName("MESSAGE") .setPattern("%message") .setLiteral(null) .setEventTimestamp(false) .setUnicode(false) .setClob(false) .build(), ColumnConfig.newBuilder() .setConfiguration(this) .setName("NODE") .setPattern("" + System.getProperty("log4jmpserverid")) .setLiteral(null) .setEventTimestamp(false) .setUnicode(false) .setClob(false) .build() }; ConnectionSource dataSourceConnectionSource = DataSourceConnectionSource.createConnectionSource(System.getProperty("log4jjdbcjndiName")); if (dataSourceConnectionSource != null){ Appender jdbcAppender = JdbcAppender.newBuilder() .setBufferSize(0) .setColumnConfigs(columnConfigs) .setColumnMappings(new ColumnMapping[]{}) .setConnectionSource(dataSourceConnectionSource) .setTableName("MTDTLOGS") .withName("databaseAppender") .withIgnoreExceptions(true) .withFilter(null) .build(); jdbcAppender.start(); addAppender(jdbcAppender); getLogger(WEBSITESTER_LOGGER_NAME).addAppender(jdbcAppender, Level.WARN, null); } }; // SMTP if (System.getProperty("log4jemailSubject") != null){ if (System.getProperty("log4jemailLevel").equalsIgnoreCase("error")) { Layout<? extends Serializable> mpHtmlLayout = HtmlLayout.createLayout(false, "Monitor de Portales", null, null, "x-small", null); Appender smtpAppender = SmtpAppender.createAppender( this, "SMTP", System.getProperty("log4jemailTo"), System.getProperty("log4jemailcc"), System.getProperty("log4jemailbcc"), System.getProperty("log4jemailFrom"), System.getProperty("log4jemailreplyTo"), System.getProperty("log4jemailSubject"), System.getProperty("log4jemailProtocol"), System.getProperty("log4jemailHost"), System.getProperty("log4jemailPort"), System.getProperty("log4jemailUserName"), System.getProperty("log4jemailPassword"), "false", "50", mpHtmlLayout, null, "true"); smtpAppender.start(); addAppender(smtpAppender); getLogger(WEBSITESTER_LOGGER_NAME).addAppender(smtpAppender, Level.ERROR, null); } } } } }

Archivo de configuración: src / main / resources / log4j2.component.properties

log4j.configurationFactory=com.websitester.config.MPLoggingConfiguration$MPConfigurationFactory log4j.configurationFile=log4j2websitester.json

Archivo de configuración: src / main / resources / log4j2websitester.json

{"logFilePath" : "/log/weblogic/wl-moniport/"}

En mi caso, configuré todas las propiedades (a las que se accedió en MPLoggingConfiguration a través de System.getProperty) en otras clases, por ejemplo:

System.setProperty("log4jjdbcjndiName", "weblogic-monitor");

Cuando cambió algunas propiedades y desea reconfigurar log4j2, debe hacer esta llamada:

final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); ctx.reconfigure();

Espero que esto ayude


Puedes personalizar tu propia ConfigurationFactory en log4j. Por favor, consulte https://logging.apache.org/log4j/2.x/manual/customconfig.html . Parece que puede satisfacer su necesidad.

Lo siento por eso. ¿De esta manera satisface su necesidad? Acabo de realizar una prueba y funciona bien aunque todavía muestre el mensaje de error que mencionó anteriormente.

LoggerContext ctx = (LoggerContext) LogManager.getContext(false); final Configuration config = ctx.getConfiguration(); Layout<? extends Serializable> layout = PatternLayout.createLayout(PatternLayout.SIMPLE_CONVERSION_PATTERN, config, null, null,true, true,null,null); Appender appender = FileAppender.createAppender("/tmp/log4jtest.txt", "false", "false", "File", "true", "false", "false", "4000", layout, null, "false", null, config); appender.start(); config.addAppender(appender); AppenderRef ref = AppenderRef.createAppenderRef("File", null, null); AppenderRef[] refs = new AppenderRef[] {ref}; LoggerConfig loggerConfig = LoggerConfig.createLogger("false", Level.INFO, "org.apache.logging.log4j", "true", refs, null, config, null ); loggerConfig.addAppender(appender, null, null); config.addLogger("simpleTestLogger", loggerConfig); ctx.updateLoggers(); Logger l = ctx.getLogger("simpleTestLogger"); l.info("message of info level shoud be output properly"); l.error("error message");


Si lo desea para la consola appender, hay una forma muy sencilla de utilizar maven, simplemente coloque estas 2 dependencias en su pom.xml y todas las cosas se imprimirán en su consola. no se necesita nada ... no hay ningún archivo log4j.properties. slf4j extiende log4j y tiene muchas características ricas.

<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.5</version> </dependency>


package com; 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.LoggerContext; import org.apache.logging.log4j.core.appender.ConsoleAppender; 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.layout.PatternLayout; import java.nio.charset.Charset; public class MyLoggerTest { public static void main(String[] args){ LoggerContext context= (LoggerContext) LogManager.getContext(); Configuration config= context.getConfiguration(); PatternLayout layout= PatternLayout.createLayout("%m%n", null, null, Charset.defaultCharset(),false,false,null,null); Appender appender=ConsoleAppender.createAppender(layout, null, null, "CONSOLE_APPENDER", null, null); appender.start(); AppenderRef ref= AppenderRef.createAppenderRef("CONSOLE_APPENDER",null,null); AppenderRef[] refs = new AppenderRef[] {ref}; LoggerConfig loggerConfig= LoggerConfig.createLogger("false", Level.INFO,"CONSOLE_LOGGER","com",refs,null,null,null); loggerConfig.addAppender(appender,null,null); config.addAppender(appender); config.addLogger("com", loggerConfig); context.updateLoggers(config); Logger logger=LogManager.getContext().getLogger("com"); logger.info("HELLO_WORLD"); } }

No estoy seguro si esto es lo que estás buscando. Esto crea una configuración predeterminada y agrega un registrador de consola. Sin embargo, LogManager.getLogger () no funciona y el uso de LogManager.getContext (). GetLogger () no permite la jerarquía del registrador. Sinceramente, no recomiendo el enfoque programático, Log4j2 es alérgico a él.