Frage zum Loggen

Joob

Top Contributor
meine IDE legt mir beim automatischen generieren von try and catch folgenden Logger an.

Logger.getLogger(YouController.class.getName()).log(Level.SEVERE, null, ex);

Ich denke das hat seinen Sinn.
Da ich aber nirgends ein Log finde, und auch in der Konsole nichts angezeigt wird,
habe ich mir meinen eigenen Logger geschrieben, der funktioniert auch.

Ich würde nur gerne den Sinn verstehen warum die IDE das so macht.
 
Sowas hab ich noch nirgends gesehen. Zumindest nicht bei Eclipse, NetBeans oder IntelliJ IDEA (mit default-Einstellungen).
Kann natürlich sein, dass du entsprechende Code Templates in der IDE angelegt/angepasst hast, damit das so passiert.
Aber vielleicht verrätst du uns auch mal den Namen "deiner" IDE?
 
Das macht netbeans.

Soll ich mich noch damit beschäftigen oder meinst du ich sollte einfach meinen Logger benutzen.
Der schreibt alles schön in eine Datei und auch die Dateigröße und Anzahl sind festgelegt,
damit habe ich so wie ich das sehe alles was ich brauche um ggf. Fehlern nachzugehen.

Übersehe ich da einen Aspekt ?
 
Was ist "dein" Logger? Grundsätzlich macht es schon Sinn ein Loggingframwork einzusetzen und korrekt zu konfigurieren. Ist halt auch ein bisschen Aufwand sich da ei zulesen. Mmn lohnt sich der aber.

Auch dann im Hinblick auf Tools wie Fluentd, Splunk o.ä.
 
Was ist denn dein Logger? Hast du da eigene Klassen geschrieben?
Da eigene Klassen zu haben halte ich nicht für sinnvoll. Es gibt genug Frameworks und dann auch Lösungen, die das vereinheitlichen (wenn benutzte Module unterschiedlich loggen sollten).
 
Der Logger speichert die Nachrichten (ex) , die während eines Programmabstutzes zur Laufzeit im runtime Stack abgelegt werden, weil man die Aufrufkaskade post-mortem nicht mehr zurückverfolgen kann.

 
Das ist die Looger Class

Java:
public class VTLoggerClass {

    public Logger vtlog;
    FileHandler fh;
    
    public VTLoggerClass (String fileName)  {
        
        try {
            
            File f = new File(fileName);
            if ( ! (f.exists())) {
                f.createNewFile();
            }
            
            fh = new FileHandler( fileName, 5000000, 5, true);
            
            vtlog = Logger.getLogger("org.joobsoft.vt.APP");
            vtlog.addHandler(fh);
            SimpleFormatter formatterlog = new SimpleFormatter();
            fh.setFormatter(formatterlog);
            
            
        } catch (IOException | SecurityException ex) {
            System.err.println("VTLoggerClass see error");
            System.out.println(ex);
        }
    }
}


Und so schreibe ich rein

Java:
// im Deklarationsteil der Klasse
VTLoggerClass  vtl   = new VTLoggerClass("testvt.log");

// Das eigentliche loggin
vtl.vtlog.log(Level.SEVERE, "Inject YouController ");
 
Was meinst du damit. Wie soll das aussehen.

Ich muss morgen auch noch testen was passiert wenn verschiedene Thread zur gleichen Zeit in das File schreiben wollen.
Weiß das jemand, regelt das der Filehandler oder führt das zu einem Fehler ?
 
[CODE lang="java" title="VTLoggerClass"]import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import java.util.logging.FileHandler;
import java.io.File;
import java.io.IOException;
public class VTLoggerClass {
private Logger vtlog;
FileHandler fh;
public Logger getLogger() {
return vtlog;
}
public VTLoggerClass (String fileName) {
try {
File f = new File(fileName);
if ( ! (f.exists())) {
f.createNewFile();
}
fh = new FileHandler( fileName, 5000000, 5, true);
vtlog = Logger.getLogger("org.joobsoft.vt.APP");
vtlog.addHandler(fh);
SimpleFormatter formatterlog = new SimpleFormatter();
fh.setFormatter(formatterlog);

} catch (IOException | SecurityException ex) {
System.err.println("VTLoggerClass see error");
System.out.println(ex);
}
}
}[/CODE]
[CODE lang="java" title="VTLoggerClassTest"]import java.util.logging.Level;
public class VTLoggerClassTest {
public static void main(String[] args) {
// im Deklarationsteil der Klasse
VTLoggerClass vtl = new VTLoggerClass("testvt.log");
// Das eigentliche loggin
vtl.getLogger().log(Level.SEVERE, "Inject YouController ");
}
}[/CODE]

Des weiteren sind alle Logger-Methoden multi thread-safe.
 
Zuletzt bearbeitet:
Des weiteren sind alle Logger-Methoden multi thread-safe.
BTW: in dem genannten Fall ist das nur Thread-Safe, weil der File-Handler die Datei auf Dateisystem-Ebene lock't.
Ich bin allerdings nicht tief genug drin um zu beurteilen, ob es da mit zwei File-Handlern eine Race-Condition gibt, und einer dann u.U. endlos blockiert ist.
 
Ja, das habe ich heute auch überlegt.

Ich wollte jetzt so vorgehen das ich in den logging Manger eine angepasste Konfig einlese.
Die notwendigen Befehle habe ich mir rausgesucht.
Dann kann ich über Stammdateneinstellungen verschieden loggingConfs einstellen.


Allerdings weiß ich nicht so recht wo ich die propertiesdatei speichern soll.
Wäre ein Unterverzeichnis im Resourcenverzeichnis da richtig ?
 
Tschuldigung, aber ich finde den Fehler nicht.

Java findet die Datei nicht, obwohl der Pfad richtig ist.

Java:
            LogManager lmanager = LogManager.getLogManager();
            
            try {
 
                lmanager.readConfiguration(new FileInputStream(getClass().getResource("/PROPS/logging.properties").toString()));
                System.out.println("looging erreicht");
            } catch (IOException | SecurityException ex) {
                System.err.println("LogManger Error : " + ex);
            }

Java:
LogManger Error : java.io.FileNotFoundException: file:\C:\Users\Jupp\Documents\NetBeansProjects\VTDESKTOP\build\resources\main\PROPS\logging.properties (Die Syntax f�r den Dateinamen, Verzeichnisnamen oder die Datentr�gerbezeichnung ist falsch)

1608318992667.png

1608319038665.png
 
Ich habs jetzt richtig eingestellt, so das er nun auf der Console und im File loggt

Java:
# loggin for console and file

handlers = java.util.logging.ConsoleHandler, java.util.logging.FileHandler
.level = INFO

# File Handler
java.util.logging.FileHandler.pattern = %h/vtlog%u.log
java.util.logging.FileHandler.limit = 100000
java.util.logging.FileHandler.count = 4
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
java.util.logging.FileHandler.append = true

# Console Handler
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

Java:
            LogManager lmanager = LogManager.getLogManager();
           
            try {
               
                lmanager.readConfiguration(getClass().getResourceAsStream("/PROPS/logging.properties"));
               
            } catch (IOException | SecurityException ex) {
                System.err.println("LogManger Error : " + ex);
            }

so haut das erst mal hin, jetzt mal weiter
Erst mal danke für eure Hilfe
 

Zurück
Oben