Logging mit log4j2 in verschiedene Dateien?

Diskutiere Logging mit log4j2 in verschiedene Dateien? im Allgemeine Java-Themen Bereich.
M

MiMa

Ich setze zum logging log4j2 ein und soweit funktioniert es ganz gut.
Jedoch erhalte ich eine ziemlich lange Logdatei und mir ist der Gedanke gekommen diese Logs auf zu teilen, da ich diese an verschiedenen Stellen benötige.

Kennt jemand eine Möglichkeit, das ich ein Log erstellen kann welches den Namen der zu untersuchenden Datei erhält jedoch mit der Endung .log.
Dann würde ich aus einer anderen Klasse die Logs in eine separate Datei Speichern.

Meine Konfigurationsdatei
XML:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="log" fileName="logs/Logger.log" immediateFlush="false" append="false">
            <PatternLayout pattern="%logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <!-- <AppenderRef ref="Console" /> -->
            <AppenderRef ref="log"/>
        </Root>
    </Loggers>
</Configuration>
Danke
Mi
 
T

thecain

Ich würde einen speziellen Appender für diese Klasse konfigurieren.
Vielleicht gibts noch andere Lösungen, aber das wäre mein Ansatz
 
M

MiMa

In den Appender sind die Namen und der Speicherort der Logdatei fest eingebunden.
Mich würde interessieren ob und wie man das dynamisch machen kann?
Der Name und Speicherort der Logdatei soll sich ständig ändern damit diese nicht überschrieben werden
 
M

MiMa

Danke,
kann ich überhaupt einen Dateipfad die während der Laufzeit erstellt werden an eine LOG-Konfigurationsdatei übergeben?
XML:
fileName="${LOG_DIR}/application.log"
Ich weis nicht wie ich das lösen könnte.
 
M

MiMa

Die Logdateien sollen zu den zu Überprüften Dateien geschrieben werden.
Das bedeutet, das die Zielverzeichnisse unterschiedlich sind und der Name sich auch ständig ändert.
 
M

MiMa

Meine Konfiguration
XML:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <File name="LogDatei" fileName="${sys:logDateiName}">
            <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="LogDatei"/>
        </Root>
    </Loggers>
</Configuration>
Java Klasse
Java:
package log4j;

import java.util.Properties;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Logging {

    public static Properties prop = new Properties(System.getProperties());
    
     // Erstellt ein LoggerObjekt
    private static Logger LOG = LogManager.getLogger(Logging.class);

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        
        prop.setProperty("logDateiName", "B:\\Logging.log");
        LOG = LogManager.getLogger(Logging.class);
        
        LOG.info("Erster Informations Log");
        LOG.warn("Erster Warn Log");
    } // main
} // Logging
Fehlermeldung
Code:
2020-06-14 13:40:26,586 main ERROR FileManager (${sys:logDateiName}) java.io.IOException: Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch java.io.IOException: Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch
    at java.base/java.io.WinNTFileSystem.canonicalize0(Native Method)
 
T

thecain

Du wirst wohl B:\\\\ nehmen müssen um die \ zu escapen.

oder / stattdessen verwenden.
 
M

MiMa

Habe es geändert, die Fehlermeldung ist aber dennoch die gleiche?
Java:
prop.setProperty("logDateiName", "B:/Logging.log");
Das mit den vier Backslashes habe ich leider auch ohne Erfolgt auch probiert??
 
Zuletzt bearbeitet:
J

JustNobody

Ähm, du willst ein System Property Setzen? Du erstellst eine Instanz und setzt in der eine Property. Das ändert aber nicht die System Property.

Daher wird die gesetzte Property im Logger nie ankommen. System.setProperty müsste dazu aufgerufen werden.

Und ich bin mir unsicher, ob er das erst danach liest oder ob die config Datei nicht schon früher gelesen wird und ob die statische Initialisierung zu entfernen erwas bringt. Aber das wird dein Test dann ja zeigen.
 
M

MiMa

Naja, wirklich funktioniert es nicht.
Ich habe gelesen, das die XML Konfiguration den Dateinamen aus den System Preferenzen holt
Code:
${sys:logDateiName}">
Dann muss die aber vorher dort gespeichert werden und das habe ich setProperty versucht.
Da der die Werte vor dem aufruf drin sein muss, habe ich danach den LogManager nochmal geholt.
Irgendwie scheint es aber nicht zu funktionieren???

Gibt es vielleicht noch eine andere Möglichkeit während der Laufzeit in andere Logdateien zu schreiben mit unterschiedlichen Lognamen?
 
Zuletzt bearbeitet:
J

JustNobody

Hast Du denn die Initialisierung bei der Deklaration auch raus genommen?

private static Logger LOG = LogManager.getLogger(Logging.class)

Das ist aber ggf. auch nicht ausreichend. Ich weiss nicht sicher, wann Log4j die Datei auswertet. Wenn das direkt beim Laden der Klassen passiert, dann dürfte Dein Vorhaben schwer machbar sein.

Aber ich verstehe den Usecase auch nicht wirklich. Woher kommt der Dateiname? Zur Laufzeit? Dann kannst Du den Appender ja im Config-File weg lassen und komplett in Code hinzu fügen. (https://logging.apache.org/log4j/2.x/manual/customconfig.html könnte da etwas hilfreich sein - wurde ja schon verlinkt! Wichtig ist: Du machst die Configuration dann im vor allem im Code! ).

Wenn es aus einer Konfigurationsdatei kommen soll: Dazu hast Du ja die log4j2.xml. Da kann es dann entsprechend vermerkt sein. Oder Du nutzt eigene Config-Files und machst es damit im Code (Eher schlecht - würde ich von abraten, da Du Dich damit stark einschränkst).

Sorry, wenn ich daher nicht wirklich helfen kann - aber mir war im Code halt das Setzen der Property aufgefallen, was eben keine System-Property setzt...
 
T

thecain

Du musst das property vor dem Start setzen mit -DlogDateiName=C:/temp/test.log während der Laufzeit funktioniert es nicht. Habe das eben getestet.

Was ich aber eigentlich gemeint habe, wäre sowas: (de.java.Logging ist meine Testklasse, für die speziell geloggt werden soll)

XML:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="STDOUT">
            <PatternLayout pattern="%C{1.} %m %level MDC%X%n"/>
        </Console>
        <File name="LogDatei" fileName="c:/temp/test.log">
            <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Logger  name="de.java.Logging" level="DEBUG">
            <AppenderRef ref="LogDatei"/>
        </Logger>
        <Root level="INFO">
            <AppenderRef ref="STDOUT" />
        </Root>
    </Loggers>
</Configuration>
 
M

MiMa

Der Dateiname der Logdatei wird während der Laufzeit generiert.
So in etwa sollte es aussehen am Beispiel einer eBook-PDF Datei:
B:\Postfach\Der Java Profi.pdf -> Ursprungsdatei und wird danach verschoben nach B:\Bibliothek\Informatik\Java\DerJavaProfi.pdf
B:\Bibliothek\Informatik\Java\DerJavaProfi.log -> Logdatei
B:\Bibliothek\Informatik\Java\DerJavaProfi.xml -> Metadaten
B:\Fehlermeldungen.log -> alle Problemmeldungen
 
M

MiMa

Alternative die mir einfallen würde, wäre das schreibe einer Textdatei an der ich die Meldungen einfach anhänge??
 
M

MiMa

Habe das Problem gelöst indem ich mir eine eigene Logging Methode geschrieben habe, die mir je nach Art
eine eigene LOG-Datei zur Laufzeit erzeugt.
 
Thema: 

Logging mit log4j2 in verschiedene Dateien?

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben