2015-06-17 32 views
20

Come configurare log4j 2.3 con console appender in modo programmatico (nessun file di configurazione di alcun formato)?Come configurare log4j 2.x puramente a livello di programmazione?

Fondamentalmente sto cercando 2.x versione di questo 1.x code.

Nelle mie classi Vorrei quindi utilizzare

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

senza alcuna configurazione Sono (come previsto) di fronte

ERRORE StatusLogger Nessun file di configurazione log4j2 trovato. Utilizzo della configurazione predefinita: registrazione degli errori nella console.

Mentre l'utilizzo dei file di configurazione sembra essere properly documented, non sono riuscito a trovare un buon esempio di caso solo codice bare-bone.

Il più vicino che ho ricevuto è this article che utilizza ancora un file fittizio.

Ecco il mio migliore (anche se completamente senza successo) un tiro di:

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

Ho perso qualcosa?

Se si tratta ancora di un caso RTFM, indicarlo nella direzione corretta.

+0

log4j2 direttamente, senza alcuna slf4j? –

+0

@SotiriosDelimanolis - Sì, quello era l'intento. –

+1

Anche la configurazione programmatica pura mancava dal logback fino a poco tempo fa. Vedi http://stackoverflow.com/questions/22335441/configure-logback-to-defer-to-java-configuration-aka-plain-java-configuration-of. . C'è un collegamento log4j2 in quel post SO che non potrei mai ottenere log4j2 per l'avvio usando il mio codice di init ma l'ultimo logback ti consentirà di controllare il processo di init. –

risposta

2

È possibile personalizzare il proprio ConfigurationFactory in log4j. Pls si riferiscono a https://logging.apache.org/log4j/2.x/manual/customconfig.html. Sembra che possa soddisfare le tue necessità.


Ci scusiamo per questo. In questo modo soddisfa le tue esigenze? Ho appena testato e funziona bene anche se viene ancora visualizzato il messaggio di errore che hai menzionato sopra.

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"); 
+0

Credo che tu abbia frainteso la mia domanda. Stavo chiedendo come creare una semplice configurazione da zero che non si basa sull'esistenza di alcun file di configurazione. –

+0

Ho bisogno di 'ConsoleAppender' configurato in un modo che non causi problemi quando uso' LogManager.getLogger() 'nel mio codice principale. –

+0

Il primo cast di LoggerContext sembra ridondante perché tale metodo ne restituisce già uno. Ma anche LoggerContext non ha un metodo chiamato getConfiguration(). – Trejkaz

14
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"); 


    } 
} 

Non sono sicuro se questo è quello che stai cercando. Questo crea una configurazione predefinita e aggiunge un logger di console. Tuttavia, LogManager.getLogger() non funziona e utilizza LogManager.getContext(). GetLogger() non consente la gerarchia del logger. Onestamente non raccomando l'approccio programmatico, Log4j2 è allergico ad esso.

3

se lo si desidera per console appender, c'è un modo molto semplice se si utilizza Maven, basta mettere queste 2 dipendenze nel tuo pom.xml e tutte le cose verranno stampate sulla tua console. niente di necessario ... nessun file log4j.properties. slf4j estende log4j e ha così tante ricche funzionalità.

  <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> 
-3

La risposta di Yiping è in gran parte corretta. La risposta suggerisce che Log4j 2 non è progettato per questo o che SLF4J dovrebbe essere usato. Ho aggiunto un esempio a Log4j per dimostrare come farlo. Si prega di dare un'occhiata al progetto di esempio a https://git-wip-us.apache.org/repos/asf?p=logging-log4j2.git;a=tree;f=log4j-samples/configuration

+1

Si dovrebbe inserire il codice nella risposta anziché (o in aggiunta a) il collegamento a un sito. Quando finalmente sono arrivato a una pagina con codice, sono stato sconfitto sulla linea 1 da un riferimento a una classe che non sembra esistere in log4j ... – Trejkaz

+0

Ho postato il link perché è utile per gli altri essere in grado per scaricare e utilizzare il codice ed è un progetto con un test unitario che può essere verificato. Non sono sicuro di cosa stai vedendo nella riga 1, poiché non menzioni il nome della classe che stavi guardando e la riga 1 di tutti i file Java è l'inizio dell'intestazione della licenza Apache. – rgoers

+1

Il tuo link sarà ancora utile in futuro quando la pagina è sparita e qualcuno viene a cercare una soluzione e trova la tua risposta? – Trejkaz

4

Ecco un esempio completo per log4j 2.8 a livello di programmazione. Dispone di 3 appendici: RollingFile, JDBC e SMTP.

Esistono 1 classe e un file di configurazione delle proprietà per registrare la classe come log4j2 configurationFactory.

Class # 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); 
       } 
      } 
     } 
    } 
} 

Config del file: src/main/resources/log4j2.component.properties

log4j.configurationFactory=com.websitester.config.MPLoggingConfiguration$MPConfigurationFactory 

Nel mio caso, ho impostato tutte le proprietà (accessibili a MPLoggingConfiguration tramite System.getProperty) in altre classi, ad esempio:

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

Quando si chan ged alcune proprietà e vuole riconfigurare log4j2, è necessario effettuare questa chiamata:

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

Spero che questo aiuti

Problemi correlati