log4j gibt kein trace aus

nieselfriem

Bekanntes Mitglied
Hallochen,

ich versuche mich mal an log4j. Dabei versuche ich das Beispiel durchzupielen bzw. für mich zu adaptieren. Die Error-Message wird ausgeben aber das Trace scheitert. Nur verstehe ch das nicht. Ich hatte doch für die Traceausgabe einen Logger konfiguriert.

Was ist da falsch?


Meine Main-Klasse
Java:
import dbutil.Database;
import javafx.application.*;
import javafx.scene.*;
import javafx.stage.*;
import javafx.fxml.FXMLLoader;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;


public class AbuMain extends Application {
    static final Logger logger = LogManager.getLogger(AbuMain.class);
    private Database database = new Database();

        public static void main(String[] args) {
            logger.trace("Entering application.");
            logger.error("Didn't do it.");
            launch(args);
            logger.trace("Exiting application.");

        }

    @Override
    public void start(Stage primaryStage) throws Exception {

        Parent root = FXMLLoader.load(getClass().getResource("fxml/MainWindow.fxml"));
        boolean dbConnection = database.open();
        System.out.println(dbConnection);
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Login");
        primaryStage.setResizable(false);
        primaryStage.show();


    }
}

Meine log4j-Config für diese Klasse
XML:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="AbuMain" level="trace">
            <AppenderRef ref="Console"/>
        </Logger>
        <Root level="error">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>
 

ThommyK

Neues Mitglied
Hallo nieselfriem,

es liegt sehr wahrscheinlich an der log4.xml.

Zeile 12 das root level von ERROR auf TRACE ändern,
Achtung es müssen Großbuchstaben sein!

Für die einzelnen AppenderRef (Console, Dateien, Mail) lassen sich unterschiedliche Level festlegen. Also bspw. in der Console nur Fehler zeigen und in Dateien tracen.

Das Root level gilt für alle AppenderRef und bestimmt, bis zu welchen Detailgrad maximal protokolliert werden soll.
Da bei dir das Root level "ERROR" ist, wird niemals eine Info, DEBUG, TRACE in der Console ankommen.

In der zweiten Zeile "Configuration Status=DEBUG" ist übrigens nur für Start interessant und log4 zeigt entsprechend detailliert, welche Startparameter für log4 selbst eingestellt sind. Dies hat jedoch keinen Einfluss auf die Protokollierung des eigentlichen Programms. "Status=Info" genügt hier meistens.


Übrigens ist der Parameter "monitorInterval" sehr genial, wenn deine Programme dauerhaft laufen, und das logging-level ohne Neustart angepasst werden soll.
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Zeile 12 das root level von ERROR auf TRACE ändern,
Achtung es müssen Großbuchstaben sein!

Für die einzelnen AppenderRef (Console, Dateien, Mail) lassen sich unterschiedliche Level festlegen. Also bspw. in der Console nur Fehler zeigen und in Dateien tracen.

Das Root level gilt für alle AppenderRef und bestimmt, bis zu welchen Detailgrad maximal protokolliert werden soll.
Da bei dir das Root level "ERROR" ist, wird niemals eine Info, DEBUG, TRACE in der Console ankommen.
Das Beispiel mit Root=Error und explizitem Logger für ein Package mit Trace kommt so in der offiziellen Doku vor:
 

ThommyK

Neues Mitglied
Das Beispiel mit Root=Error und explizitem Logger für ein Package mit Trace kommt so in der offiziellen Doku vor:
mrBrown,
ich bin mir sehr sicher, dass die Doku an dieser Stelle nicht ganz korrekt ist.
Habe selbst Mal mehrere mühsame Stunden damit verbracht, herauszufinden wie die Einstellungen genau funktionieren.

Wie geschrieben, gibt das root level den minimalen Detailgrad für alle AppenderRef vor.
 
Zuletzt bearbeitet:

nieselfriem

Bekanntes Mitglied
Ich habe jetzt folgende änderungen gemacht:


XML:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="abu.AbuMain" level="TRACE">
            <AppenderRef ref="Console"/>
        </Logger>
        <Root level="TRACE">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

und habe meine AbuMain in das Package abu gepackt (Antwort 1.)

Leider werden immer nur errors ausgeben

VG
 

nieselfriem

Bekanntes Mitglied
Wird die Config vielleicht einfach nicht gefunden?
Das könnte sein. Ich habe mal das Pattern für den Timestmp geändert und er ändert es nicht in der Ausgabe. Das spricht wohl für die default Konfiguration. Aktuell liegt die xml einfach im gleichen Verzeichnis wie die Main. Ich guck mal weiter, was ich da vergessen habe. danke für den Hinweis. wenn ich nicht weiter komme. melde ich mich.

VG
 

nieselfriem

Bekanntes Mitglied
Ich bin ja ein bisschen verzweifelt und probiere einiges aus.

Zur Zeit sieht meine Struktur wie folgt aus:

1612458572568.png


Die log4j2.properties sieht wie folgt aus:


[CODE title="log4j2.properties"]status = error
name = PropertiesConfig

#Make sure to change log file path as per your need
property.filename = /home/georg/debug.log

filters = threshold

filter.threshold.type = ThresholdFilter
filter.threshold.level = debug

appenders = rolling

appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${filename}
appender.rolling.filePattern = /home/georg/Previous/debug-backup-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=10MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 20

loggers = rolling

#Make sure to change the package structure as per your application

logger.rolling.name = com.gog.logFourJTwo
logger.rolling.level = debug
logger.rolling.additivity = true
logger.rolling.appenderRef.rolling.ref = RollingFile[/CODE]

Und die AbuMain jetzt so:


[CODE lang="java" title="AbuMain"] public static void main(String[] args) {
String path = System.getProperty("java.class.path");
System.out.println(path);
System.setProperty("blub","sdasd");
Logger logger = LogManager.getLogger(AbuMain.class.getName());
String message = "Hello there!";
logger.error("Error Message Logged !!!", new NullPointerException("NullError"));


launch(args);



}[/CODE]

Das interessante ist, er erzeugt die debug.log. Schreibt aber nichts rein und der ganze Kram wird weiter auf der Console ausgegeben. 😖
 

nieselfriem

Bekanntes Mitglied
So, habe einen neuen Stand.

Der Fehler im letzten st war logger.rolling.name = com.gog.logFourJTwo. Es muss natürlich llogger.rolling.name = abu heißen.
Dazu habe ich meine Projektruktur noch etwas geändert

1612467475352.png


Nun landen die Einträge auch in dem definierten logfile.

ABER: in der Klasse Database werden die logeinträge doppelt in die Logdatei geschrieben:



[CODE lang="java" title="Database"]package abu.dbutil;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

import abu.AbuMain;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;

public class Database {
public static final String DBNAME = "abu.sqlite";
public static final String PATH = "src/main/data/abu.sqlite";
public static final String CONNECTION_STRING = "jdbc:sqlite:"+PATH;
private Connection connection;
private Statement statement;

public boolean open() {
Logger logger = LogManager.getLogger(Database.class);
System.out.println(System.getProperty("user.dir"));
try {
logger.info("Oeffnen der Datenbank");
connection = DriverManager.getConnection(CONNECTION_STRING);
statement = connection.createStatement();
return true;
}catch(SQLException e) {
e.printStackTrace();
return false;
}
}

public Connection getConnection() {
return connection;
}

public Statement getStatement() {
return statement;
}
}[/CODE]
 

Ähnliche Java Themen

Neue Themen


Oben