brainbaking/content/wiki/code/java/logging.md

50 lines
1.5 KiB
Markdown
Raw Normal View History

2017-02-26 13:28:18 +01:00
+++
title = "logging"
draft = false
tags = [
"code",
"java",
"logging"
]
date = "2013-03-12"
+++
# code:java >> Logging
## Log4j Gebruiken over verschillende threads heen
**Probleem**: JMS handlers die bijvoorbeeld tegelijk starten en loggen naar éénzelfde file met `Logger.getLogger(x)`. Als een thread crasht en de andere afwerkt, maar we de volgorde van wegschrijven niet kunnen garanderen, hoe kunnen we dan dit onerscheid maken?
Oplossing: met `NDC` (Nested Diagnostic Context) - zie http://logging.apache.org/log4j/1.2/manual.html
Voorbeeld:
```java
protected static final Logger jmsLogger = Logger.getLogger("jmsLogger");
private void log(String message) {
jmsLogger.info("Incoming JMS Message (" + getClass().getSimpleName() + "): " + message);
}
@Override
public void doHandle(String textMessage) {
try {
String usernameFromTextMessage = getUsernameFromTextMessage(textMessage);
NDC.push(currentThread().getName() + "#" + currentThread().getId() + "@" + usernameFromTextMessage);
log("Started handling: " + textMessage);
VacatureSecurityInitializer.initConsulentUserInContext(usernameFromTextMessage);
handleTextMessage(textMessage);
log("Completed handling");
} finally {
resetSecurityContext();
NDC.pop();
}
}
```
`NDC.push()` zou een unieke parameter moeten binnen pakken, dit wordt geprepend aan de log ouput:
```
[INFO ] 23/03/2012 15:19:07 jmsLogger - JZAMAN - Incoming JMS Message (VerwijzingVersieVerhoogdHandler): Completed handling
```