Java Tinylog in der exe Log wird nicht geschrieben

Mystery1988

Ensign
Registriert
März 2015
Beiträge
204
Guten Morgen alle zusammen,

ich habe ein Problem das mir keine Log Dateien in der compilierten Exe erstellt werden, aber aus der IDE heraus schon.
Rahmenbedingungen:
Java Version:
openjdk version "15.0.1" 2020-10-20
Tinylog Properties:
writer1 = console
writer1.level = debug

writer2 = file
writer2.level = debug
writer2.file = ${userprofile}/Documents/My Games/example/log.txt
writer2.append = true
writer2.format = {date}: {message}
writer2.latest = current.log
writer2.policies = size: 5MB
writer2.backup = 5


XML:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>de.twimbee</groupId>
    <artifactId>example</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.release>11</maven.compiler.release>
        <javafx.version>13</javafx.version>
        <jlink.runtime-image.name>example-runtime-image</jlink.runtime-image.name>
        <executable.name>example_program</executable.name>
    </properties>

    <dependencies>
        <!-- gson used for config (de-)serialization -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.6</version>
        </dependency>
        <!-- JavaFX -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <!-- Logging -->
        <dependency>
            <groupId>org.tinylog</groupId>
            <artifactId>tinylog-api</artifactId>
            <version>2.2.0-RC1</version>
        </dependency>
        <dependency>
            <groupId>org.tinylog</groupId>
            <artifactId>tinylog-impl</artifactId>
            <version>2.2.0-RC1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-clean-plugin</artifactId>
                <version>2.5</version>
                <configuration>
                    <filesets>
                        <fileset>
                            <directory>${executable.name}</directory>
                        </fileset>
                    </filesets>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <release>${maven.compiler.release}</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.4</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>jlink</goal>
                        </goals>
                        <phase>package</phase>
                    </execution>
                </executions>
                <configuration>
                    <release>${maven.compiler.release}</release>
                    <jlinkImageName>${jlink.runtime-image.name}</jlinkImageName>
                    <mainClass>gui.Main</mainClass>
                    <workingDirectory>${project.basedir}</workingDirectory>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>3.0.0</version>
                <executions>
                    <execution>
                        <id>compiler</id>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                        <phase>install</phase>
                        <configuration>
                            <executable>jpackage</executable>
                            <arguments>
                                <argument>--type</argument>
                                <argument>app-image</argument>
                                <argument>-n</argument>
                                <argument>${executable.name}</argument>
                                <argument>-m</argument>
                                <argument>modmanager/gui.Main</argument>
                                <argument>--icon</argument>
                                <argument>src/main/resources/icon.ico</argument>
                                <argument>--runtime-image</argument>
                                <argument>${project.build.directory}/${jlink.runtime-image.name}</argument>
                            </arguments>
                        </configuration>
                    </execution>
                    <execution>
                        <id>write-protection-remove</id>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                        <phase>install</phase>
                        <configuration>
                            <executable>attrib</executable>
                            <arguments>
                                <argument>-R</argument>
                                <argument>${project.basedir}\example_program\${executable.name}.exe</argument>
                            </arguments>
                        </configuration>
                    </execution>
                    <execution>
                        <id>adminrights</id>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                        <phase>install</phase>
                        <configuration>
                            <executable>${project.basedir}\mt.exe</executable>
                            <arguments>
                                <argument>-manifest</argument>
                                <argument>${project.basedir}\example_program.exe.manifest</argument>
                                <argument>-outputresource:${project.basedir}\example_program\${executable.name}.exe;1</argument>
                            </arguments>
                        </configuration>
                    </execution>
                    <execution>
                        <id>write-protection-add</id>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                        <phase>install</phase>
                        <configuration>
                            <executable>attrib</executable>
                            <arguments>
                                <argument>+R</argument>
                                <argument>${project.basedir}\example_program\${executable.name}.exe</argument>
                            </arguments>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Was habe ich bisher alles versucht:
Verschiedenste Pfade, absolut, ohne Pfade, direkt in einem Ordner in C
In der IDE werden alle Pfade genutzt, aber in der kompilierten Exe nicht.
Hat jemand noch eine Idee was ich falsch konfiguriert habe?

Danke und Gruß =)
 
  • Gefällt mir
Reaktionen: Geisi
Hast du wirklich eine .exe oder meinst du eine ausführbare .jar?
 
Lade dir doch mal den Process Monitor runter und filtere nach deiner .exe. Dort kannst du sehen ob die Anwendung tatsächlich einen Dsteizugriff macht und wenn ja, welcher Pfad verwendet wird. Dort sähe man beispielsweise auch einen Fehler, wenn das Schreiben der Datei mangels Zugriffsrechte blockiert wird. Heißt: Vielleicht will die exe ja schreiben, dsrf es aber nicht.
 
DaysShadow schrieb:
Hast du wirklich eine .exe oder meinst du eine ausführbare .jar?
Ja ich meine wirklich die .exe

@Raijin Stimmt das kann ich noch mal überprüfen. Danke für den Tipp.

Man sollte noch anmerken, das die exe nach erhöhten (administrativen) Rechten fragt, die IDE wird immer mit administrativen Rechten gestartet
 
Die Frage war nicht ganz ohne Grund. Habe die pom aber heute morgen nicht vollständig gelesen, war wohl noch zu früh. Es ist jedenfalls nicht selten so, dass Pfade nicht mehr funktionieren sobald man eine ausführbare .jar hat und/oder diese dann auch noch anderweitig in eine .exe verpackt hat.

Ggf. einfach mal ein paar Logs auf Stdout hauen mit den Pfaden wo hingeloggt werden sollte. Manchmal passen die einfach nicht mehr. Wobei du ja schreibst, dass selbst absolute Pfade nicht funktionieren...hm.

Das war jetzt auch mehr Brainstorming als wirkliche Hilfe :D

Hast du eine Möglichkeit zu prüfen, dass das Logging überhaupt loggen will? writer1 z.B. tut was er soll?
 
Wenn writer1 nicht tun würde was er soll, würde es doch auch beim Debuggen in der IDE nicht funktionieren, oder irre ich mich da? Ich denke schon, dass er seine Aufgabe erledigt, aber es scheitert vermutlich an Zugriffsrechten, o.ä.
Gerade das müsste man eigentlich im Process Monitor sehen. Ich benutze den ganz gerne beim Debuggen von Anwendungen. So kann man zB auch versteckte INI-Dateien oder Registry-Einträge finden.
 
Na, ich meinte ja ob writer1 auch seinen Dienst tut, wenn er es als .exe verpackt und laufen hat. Nicht, dass hinterher überhaupt nicht mehr geloggt wird und man bekommt's nicht mit.
Zugriffsrechte kann natürlich sein, aber wenn das Programm mit Adminrechten läuft sollte das doch eigentlich keine Probleme darstellen.

Bin gespannt was es letztlich ist. In den meisten Fällen verursacht die Ursache solcher Dinge eine Hand-vor-die-Stirn Bewegung, wenn man sie dann endlich gefunden hat :D
 
DaysShadow schrieb:
Bin gespannt was es letztlich ist. In den meisten Fällen verursacht die Ursache solcher Dinge eine Hand-vor-die-Stirn Bewegung, wenn man sie dann endlich gefunden hat :D
Das unterschreibe ich sofort. Also zurücklehnen und Bi.. Tee trinken :schluck:
 
Also ich erwarte das es so ein Moment werden wird :D

Also ich habe mit Process monitor drauf geschaut und er schreibt Config Dateien, etc.
Die Log-Datei wird, aber nicht mal versucht zu lesen/schreiben oder zu erstellen.

Wenn ich per CMD/Powershell die exe starte, kommt sofort wieder der Eingabepromt.

Ich muss mal schauen, das ich die POM umschreibe und eine jar baue.

Also kurz zur exe, ich liefere die notwendigen java runtime Elemente mit unter runtime/modules wird auch tinylog aufgeführt.

Bezüglich Pfade habe ich alles mögliche ausprobiert: //, \\, /, \, "" oder ' '
Langsam gehen mir die Ideen aus :D
 
Das ist interessant. Ich würde zum Testen einfach mal mit einem FileWriter gucken ob die exe überhaupt eine Datei schreiben kann. Einfach hallo welt in eine txt schreiben oder so.




Wobei:
Mystery1988 schrieb:
Wenn ich per CMD/Powershell die exe starte, kommt sofort wieder der Eingabepromt.
Das wiederum deutet darauf hin, dass eine Exception nicht abgefangen wurde und die Anwendung sofort wieder beendet wird. Prüfe insbesondere den Initialisierungsteil deiner Anwendung auf ausreichende Try Catch Behandlung. Wenn die Anwendung nämlich sofort beendet wird, ist es ja durchaus denkbar, dass dies schon vor der ersten Logmeldung passiert -> keine Logdatei.
 
Da das Programm schreibt externe Dateien ohne Probleme.

Da habe ich mich falsch ausgedrückt.
Das Programm startet erfolgreich und kann ohne Probleme genutzt werden.

Was das Programm grob macht ist.
Ordner auslesen, zip dateien verschieben und symlinks anlegen.
Zu welchen Zip ein symlink angelegt werden soll, wird in separaten Konfig-Dateien hinterlegt.
 
So jetzt kommt der Kopf -> Tisch moment.
Ich habe mich mit den Java Modulen noch nicht wirklich auseinander gesetzt und das einen Mitentwickler machen lassen.

Tjoa wenn man in der modules-info.java nur ein requires org.tinylog.api; macht und nicht noch dazu requires org.tinylog.impl; dann kann es nicht funktionieren -.-
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: DaysShadow
Zurück
Oben