Log4j integrieren, wie?

TM69

Bekanntes Mitglied
Hier ein Auszug aus einer meiner Funktionen

Java:
        logger.debug("CountryService::createCountry(" + creator + ", " + country + ")");
        
        if (creator == null) {
            String message = "CountryService::createCountry(" + creator + ", " + country + "): The creator must not be null";
            logger.error(message);
            throw new NotDefinedException(message);
        }

        if (country == null) {
            String message = "CountryService::createCountry(" + creator + ", " + country + "): The adding country must not be null";
            logger.error(message);           
            throw new NotDefinedException(message);
        }
        
           userRepository.findById(creator.getId())
                .orElseThrow(() -> new ResourceNotFoundException("CountryService::createCountry(" + creator + ", " + country + "): Creator not found with the id :: " + creator.getId()));

ich würde gerne auch eine log aufzeichung von
Code:
userRepository.findById(creator.getId())
                .orElseThrow(() -> new ResourceNotFoundException("CountryService::createCountry(" + creator + ", " + country + "): Creator not found with the id :: " + creator.getId()));

haben, aber wie integriere ich Log4j an dieser Stelle am besten? Oder muss ich auf diese Schreibweise versichten und es wie folgt machen?
Code:
if ( userRepository.findById(creator.getId()) == null ) {
       String message = "xxxx"
       logger.error(message);
       throw new ResourceNotFoundException(message);
}
 
Nachtrag: Eine Überrlegung dir mir gerad durch den Kopf geschossen ist, wäre folgende (ungefähre) Alternative

Java:
public class ResourceNotFoundException extends Exception{

    private static final long serialVersionUID = 1L;

    public ResourceNotFoundException(String message){
        logger.error(message);
        super(message);
    }
}
 
Hi, wenn die Exception geworfen wird, dann wird sie auch irdgendwann gefangen, wenn es Sinn macht.

Hier im Catch block würde ich die Exception mindestens loggen, dann muss ich das nicht überall sonst machen.
 
Das ist übrigens ein "bad practice":
Java:
        if (creator == null) {
            String message = "CountryService::createCountry(" + creator + ", " + country + "): The creator must not be null";
            logger.error(message);
            throw new NotDefinedException(message);
        }
entweder man loggt eine Nachricht oder wirft eine Exception - aber nicht beides. Ist das Logging richtig konfiguriert wird die Exception sowieso geloggt oder eben behandelt und eine Nachricht wird geloggt.
 
Das ist übrigens ein "bad practice":
Java:
        if (creator == null) {
            String message = "CountryService::createCountry(" + creator + ", " + country + "): The creator must not be null";
            logger.error(message);
            throw new NotDefinedException(message);
        }
entweder man loggt eine Nachricht oder wirft eine Exception - aber nicht beides. Ist das Logging richtig konfiguriert wird die Exception sowieso geloggt oder eben behandelt und eine Nachricht wird geloggt.
Was müsste ich wo wie einstellen / ergänzen?
 
Was müsste ich wo wie einstellen / ergänzen?
Ich weiß nicht genau was du erreichen willst. Soll der Client informiert werden, dann erfolgt das normalerweise per HTTP-Status:
return new ResponseEntity<>("eine Nachricht", HttpStatus.EIN_STATUS_CODE);
So kann der Client eine Meldung ausgeben oder irgendwie regieren. Die Methode muss nicht mit einer Exception verlassen werden, da du ja genau weißt was los ist, kannst du ja auch gleich zurückgeben was los ist.. Exception's dienen nicht der Programmsteuerung.
Im Normalfall/Erfolg dann: return ResponseEntity.ok(einResultat);
Java:
        if (creator == null) {
            String message = "CountryService::createCountry(" + creator + ", " + country + "): The creator must not be null";
            logger.error(message);
            return new ResponseEntity<>(message, HttpStatus....)
        }
Du zeigst aber zu wenig Code um wirklich genau zu antworten.
 
Ich weiß nicht genau was du erreichen willst. Soll der Client informiert werden, dann erfolgt das normalerweise per HTTP-Status:
return new ResponseEntity<>("eine Nachricht", HttpStatus.EIN_STATUS_CODE);
So kann der Client eine Meldung ausgeben oder irgendwie regieren. Die Methode muss nicht mit einer Exception verlassen werden, da du ja genau weißt was los ist, kannst du ja auch gleich zurückgeben was los ist.. Exception's dienen nicht der Programmsteuerung.
Im Normalfall/Erfolg dann: return ResponseEntity.ok(einResultat);
Java:
        if (creator == null) {
            String message = "CountryService::createCountry(" + creator + ", " + country + "): The creator must not be null";
            logger.error(message);
            return new ResponseEntity<>(message, HttpStatus....)
        }
Du zeigst aber zu wenig Code um wirklich genau zu antworten.
Also es soll beim werfen einer Exception, ein Error Log aufgezeichnet werden und anhand der Konfiguration ausgegeben werden. Es soll im Einsatz das nachverfolgen von Ursachen ermöglichen. Zur Zeit (Erstellung) wird das log in eine Datei geschrieben und auf der Console ausgegeben.
 

Zurück
Oben