2009-02-23 11 views
5

In weblogic posso configurare nella console per Serverlog l'uso di log4j invece della registrazione JDK predefinita.Utilizzo di log4j registrazione in weblogic 9/10

Tuttavia il serverlog non utilizza un file log4j.properties, ma sembra utilizzare la configurazione in config.xml Anche se il file log4j.properties è nel classpath e ho impostato queste proprietà:

set JAVA_OPTIONS=%JAVA_OPTIONS% -Dlog4j.configuration=file:<path>/log4j.properties 
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger 
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dweblogic.log.Log4jLoggingEnabled=true 

È possibile utilizzare la configurazione log4j.properties per Weblogic Server Logging o posso solo modificare la configurazione di log4j con il codice java?

risposta

6

Non so nulla di WebLogic in particolare, ma aggiungendo -Dlog4j.debug causerà log4j per dirti dove sta cercando la sua configurazione. Ho trovato che è prezioso quando si rintraccia i problemi di registrazione in Tomcat in precedenza.

Controllare i documenti per PropertyConfigurator e DOMConfigurator per i dettagli sulla procedura di configurazione di log4j.

+0

dovrei aggiungere il -Dlog4j.debug? – rayman

+1

L'opzione '-Dlog4j.debug' dovrebbe essere aggiunta ai parametri della riga di comando di java. Per WebLogic questo si trova in Server//Avvio/Argomenti server. –

0

Se si inserisce log4j.xml nel classpath, WebLogic lo preleva. Io uso Apache Commons logging con log4j in WebLogic, ed è una cosa facile da fare. Non c'è bisogno di quelle opzioni Java.

+0

Questo non funziona. Con l'opzione java descritta, le applicazioni già registrano correttamente utilizzando la configurazione log4j.properties, ma quello che voglio è configurare BEA SERVER LOGGING. Apparentemente la registrazione del server bea non esamina log4j.xml nel classpath. – Edwin

0

Dove stai impostando le opzioni sopra? Prova a mettere l'opzione -Dlog4j nelle opzioni di avvio del server per ogni server gestito che utilizzerà log4j

+0

Le opzioni di cui sopra impostate nello script di avvio (startweblogic.cmd). Vedo che log4.properties viene utilizzato dal codice personalizzato I deploy, ma non è utilizzato da Serverlog (e poiché i registri di Aqualogic per il log aqualogic di Serverlog non sta utilizzando la configurazione log4j.properties) – Edwin

0

Per specificare la registrazione ad un Log4j Logger invece della registrazione di default Java:

* When you start the Administration Server, include the following Java option in the weblogic.Server command: 

    -Dweblogic.log.Log4jLoggingEnabled=true 

Da: http://edocs.bea.com/wls/docs103/logging/config_logs.html#wp1014610

+0

L'ho già provato e persino documentato nella domanda. (terza opzione java). Questo è incluso nelle opzioni java del mio server admin ma non ha l'effetto che volevo. – Edwin

+0

Hai cambiato le impostazioni in config.xml? – jon077

+0

Il file config.xml è stato modificato in base alle modifiche apportate nella console. Sembra che le impostazioni di config.xml annullino le impostazioni di log4j.properties, quindi la registrazione è configurata in config.xml e non so come modificarla nella configurazione di log4j.properties. – Edwin

0

Non ho mai funzionato come ho intented.

Quello che alla fine ho fatto è stato creare una sorta di work-around. Registrazione un gestore che ascolta il log del server Weblogic. Da questo gestore faccio il mio log in log4j. Quella registrazione può essere reindirizzata per fare tutto ciò che voglio.

creare un logHandler personalizzato:

public class CustomLogHandler extends Handler { 
.. 

    public CustomLogHandler() throws SecurityException, IOException, 
      NamingException { 

     String log4jConfig = LogFilterConfiguration.getLog4jDirectory(); 
     classlogger.info("log4j configured for file"+ log4jConfig); 
     PropertyConfigurator.configure(log4jConfig); 
     logFilterConfiguration = new LogFilterConfiguration(); 
    } 

    public void publish(LogRecord record) { 
     WLLogRecord rec = (WLLogRecord) record; 
     if (!isLoggable(rec)) 
      return; 
     if (getLoggerName().. is something i want to log) { 
         // do my own log4j logging 
        } 

quindi creare un ApplicationLifecycleListener. con un metodo postStart:

public void postStart(ApplicationLifecycleEvent evt) { 
    Logger logger = LoggingHelper.getServerLogger(); 
    Handler oldHandler = null; 
    Handler[] currentHandlers = logger.getHandlers(); 

       .. code to remove an old custom handler if exists... 
    with something like logger.removeHandler(oldHandler); 

    // add custom handler to serverlogger. 
    CustomLogHandler h = null;  
    try { 
     h = new CustomLogHandler(); 
     // If handler was removed we can add a new version. 
     if (!(unRemovedHandlerClasses.contains(h.getClass()))){ 
      logger.addHandler(h); 
      registerMBean(h) ; 
     } 
    } catch (Exception nmex) { 
    classLogger.error("Error adding CustomLogHandler to serverlogger " 
       + nmex.getMessage()); 
     logger.removeHandler(h); 
    } 


}