# log4j gibt kein trace aus



## nieselfriem (3. Feb 2021)

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

```
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 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>
```


----------



## LimDul (3. Feb 2021)

Pack deine Klasse mal in ein benanntes Package und pass entsprechend den Logger-Namen an.


----------



## ThommyK (3. Feb 2021)

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.


----------



## mrBrown (3. Feb 2021)

ThommyK hat gesagt.:


> 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 Beispiel mit Root=Error und explizitem Logger für ein Package mit Trace kommt so in der offiziellen Doku vor:


			Log4j – Configuring Log4j 2


----------



## ThommyK (3. Feb 2021)

mrBrown hat gesagt.:


> Das Beispiel mit Root=Error und explizitem Logger für ein Package mit Trace kommt so in der offiziellen Doku vor:
> 
> 
> Log4j – Configuring Log4j 2


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.


----------



## nieselfriem (4. Feb 2021)

Ich habe jetzt folgende änderungen gemacht:



```
<?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


----------



## mrBrown (4. Feb 2021)

Wird die Config vielleicht einfach nicht gefunden?


----------



## nieselfriem (4. Feb 2021)

mrBrown hat gesagt.:


> 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


----------



## LimDul (4. Feb 2021)

Wie heißt die XML-Datei? Welches Build-System verwendest du? Maven?


----------



## nieselfriem (4. Feb 2021)

LimDul hat gesagt.:


> Wie heißt die XML-Datei? Welches Build-System verwendest du? Maven?


Ich baue mit gradle und die Datei heißt log4j2.xml


----------



## nieselfriem (4. Feb 2021)

Ich bin ja ein bisschen verzweifelt und probiere einiges aus.

Zur Zeit sieht meine Struktur wie folgt aus:




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 (4. Feb 2021)

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




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]


----------



## mrBrown (4. Feb 2021)

logger.rolling.additivity dürfte dafür sorgen


----------

