2016-10-14 4 views
0

Gibt es eine Möglichkeit, Log4j2 zu konfigurieren, Appender-Attribute aus beispielsweise einer Frühlingsbohne zu lesen? Ich bin besonders neugierig in JmsAppender, um sein Ziel Ziel basierend auf einem Parameter dynamisch aus der Datenbank und nicht aus JNDI-Kontext zu setzen.log4j2 Warteschlange/Topic-Konfiguration bis zum Frühjahr

BR Zoltán

Antwort

0

Ihre beste Chance ist, die JMSAppender zu verlängern und die append Methoden im Logger außer Kraft setzen. Ein gutes Beispiel ist here

In diesem Fall erweitert die Klasse und verwendet AMQ, um diese Nachrichten zu veröffentlichen. Sie sollten in der Lage sein, dies von der DB zu erweitern und APIs zu verwenden, um eine Kennung für die Warteschlange oder das Thema zu erhalten und damit zu beginnen, Nachrichten an sie anzuhängen. Dies setzt voraus, dass Sie über die richtigen Clientbibliotheken und Berechtigungen verfügen, um eine Verbindung zum Messaginganbieter (z. B. in WMQ, QM-Name, Warteschlange, Host, Port) aus der Datenbank herzustellen (in Ihrem Fall). Der erweiterte JMS-Appender kann dann in Ihrer LOG4J2-Konfiguration zum Senden von Protokollmeldungen verwendet werden.

+0

Danke für die Antwort, in diesem Fall muss ich die vollständige Logging-Konfiguration zum Beispiel in einer Spring-Config-Java-Klasse rein programmatisch definieren oder kann ich irgendwie auf diese Erweiterungs-Klasse in log4j2.xml verweisen? – Zoltan

0

Es scheint, dass ich ein Hybrid soution gefunden, die sehr nützlich ist, kundenspezifische JmsAppender mit Feder Kontext kombiniert:

@Plugin(name = "OwnJmsAppender", category = "Core", elementType = "appender", printObject = true) 
public class OwnJmsAppender extends AbstractAppender { 

private final Lock lock = new ReentrantLock(); 
private Session session; 
private Connection connection; 
private Destination destination; 
private MessageProducer producer; 

protected OwnJmsAppender(String name, Filter filter, Layout<? extends Serializable> layout, final boolean ignoreExceptions) { 
    super(name, filter, layout, ignoreExceptions); 
    init(); 
} 

@Override 
public void append(LogEvent le) { 
    this.lock.lock(); 
    try { 
     if (connection == null) { 
      init(); 
     } 
     byte[] bytes = getLayout().toByteArray(le); 
     TextMessage message = session.createTextMessage(new String(bytes, Charset.forName("UTF-8"))); 
     producer.send(message); 
    } catch (JMSException e) { 
     LOGGER.error(e); 
    } finally { 
     this.lock.unlock(); 
    } 
} 

@Override 
public void stop() { 
    super.stop(); 
    try { 
     session.close(); 
     connection.close(); 
    } catch (JMSException e) { 
     LOGGER.error(e); 
    } 

} 

/** 
* Reading attributes from log4j2.xml configuration by {@link PluginElement} 
* annotation. Also initiates the logger. 
* 
* @param name 
* @param layout 
* @param filter 
* @return 
*/ 
@PluginFactory 
public static OwnJmsAppender createAppender(@PluginAttribute("name") String name, 
     @PluginElement("PatternLayout") Layout<? extends Serializable> layout, @PluginElement("Filter") final Filter filter) { 
    if (name == null) { 
     LOGGER.error("No name provided for OwnJmsAppender"); 
     return null; 
    } 

    return new OwnJmsAppender(name, filter, getLayout(layout), true); 
} 

private static Layout<? extends Serializable> getLayout(Layout<? extends Serializable> layout) { 
    Layout<? extends Serializable> finalLayout = layout; 
    if (finalLayout == null) { 
     finalLayout = PatternLayout.createDefaultLayout(); 
    } 
    return finalLayout; 
} 

private void init() { 
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(CommonDbConfig.class); 
    ParameterStorage parameterStorage = (DatabaseParameterStorage) context.getBean("databaseParameterStorage"); 
    // the parameterStorage springbean reads params from database 
    String brokerUri = parameterStorage.getStringValue("broker.url"); 
    String queueName = "logQueue"; 
    context.close(); 

    try { 
     ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerUri); 
     connection = connectionFactory.createConnection(); 
     connection.start(); 
     session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     destination = session.createQueue(queueName); 
     producer = session.createProducer(destination); 
     producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 
    } catch (JMSException e) { 
     LOGGER.error(e); 
    } 
} 

}

Und es aus log4j2.xml nennen:

<Configuration> 
    <Appenders> 
     <OwnJmsAppender name="jmsQueue"> 
      <PatternLayout pattern="%maxLen{%d{DEFAULT} [%p] - %m %xEx%n}{500}" /> 
     </OwnJmsAppender> 
</Appenders> 
<Loggers> 
    <Logger name="com.your.package" level="info" additivity="false"> 
     <AppenderRef ref="jmsQueue" /> 
    </Logger> 
</Loggers> 
</Configuration> 
Verwandte Themen