Filepath in Log4j2 in Docker Container

MarekLanger

Mitglied
Hallo,
ich habe mal eine Frage zu Log4j2 in Docker Container. Mein Backend soll verschiedene Events loggen und das funktioniert derzeit auch local.
Ich habe bisher ein image meiner application erstellt und jetzt läuft auch der Container. Ich habe nur das Problem, dass keine LogFiles gespeichert werden.
Ich hatte jetzt erstmal versucht, dass die LogFiles trotzdem auf meinem localen System gespeichert werden, aber ich möchte eigentlich, dass die LogFiles in einem Volume im Container gespeichert wird.
Ich habe aber keine Ahnung, wie ich das in meinen Log4j2.properties festlege, dass er das in dem Volume speichert.

[CODE lang="java" title="Dockerfile"]FROM openjdk:12
ADD target/eventpusher.jar eventpusher.jar
EXPOSE 8090
VOLUME //C:/Users/MAREKL/Desktop/Logfiles
ENTRYPOINT ["java","-jar","eventpublisherbackend.jar"][/CODE]

[CODE lang="java" title="Log4j2.properties"]status = error
name=PropertiesConfig

property.filename = C:\\Users\\MarekL\\Desktop\\Logfiles
appenders = file, console

appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n

#error appender
appender.file.type = RollingFile
appender.file.name = RollingFile
appender.file.fileName= ${filename}/error.log
appender.file.filePattern = ${filename}/error.log -%d{MM-dd-yy-HH-mm-ss}-%i.log.gz
appender.file.layout.type=PatternLayout
appender.file.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
appender.file.policies.type = Policies
appender.file.policies.size.type = SizeBasedTriggeringPolicy
appender.file.policies.size.size= 1 kb
appender.rolling.strategy.type = DefaultRolloverStrategy

#using LevelRangeFilter to only log error levels.
appender.file.filter.threshold.type = LevelRangeFilter
appender.file.filter.threshold.minLevel = error
appender.file.filter.threshold.maxLevel = error

# creating only one logger, we can use this with multiple appenders.
loggers=file
# this is package name. This package and all of it's child packages will use this logger
logger.file.name=de.osp.eventmanagerbackend
# logger base level
logger.file.level = error
logger.file.appenderRefs = RollingFile
logger.file.additivity = false
logger.file.appenderRef.file.ref = RollingFile

rootLogger.level = error
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT[/CODE]
 

MarekLanger

Mitglied
Du musst im FileAppender in Log4j einen Linux-Pfad angeben, (also z.B. /app/logs) und diesen Pfad dann als host-volume mounten.
Vielen Dank für die schnelle Antwort. Habe da jetzt trotzdem noch meine Probleme. Ich habe jetzt folgendes gemacht:
[CODE lang="java" title="Log4j2.properties"]property.filename = /mnt/c/Users/marekl/logfiles[/CODE]
Das ist der Linux Pfad zum Ordner auf meinem Desktop.

[CODE lang="java" title="docker command"]
docker run -v /mnt/c/Users/marekl/logfiles -p 8090:8090 eventmanager
[/CODE]

In dem Ordner werden jedoch keine Logfiles gespeichert. Ich sehe aber im Terminal, dass meine Events erfolgreich geschickt werden; nur das speichern funktioniert nicht.
Ich dachte eigentlich, dass ich im Dockerfile meinen Zielort für das Speichern von Logfiles gesetzt hatte.
 

httpdigest

Top Contributor
So funktioniert das leider nicht. In dem Docker-Container hast du _keinen_ Zugriff auf das Dateisystem des Hosts (bzw. des Linux Subsystem for Windows). Ein Dockercontainer hat sein eigenes völlig vom Host abgeschottetes Dateisystem. Man _kann_ aber explizit ein Host-Verzeichnis mounten. Das musst du aber explizit tun beim Starten des Docker-Containers. Schau dir hierzu mal die Doku an. Suche zum Beispiel mal nach "Docker mount host filesystem".
 

MarekLanger

Mitglied
Ok ich glaube ich komme langsam dahinter. Nur um kurz mal Feedback einzuholen, ob ich es auch richtig verstanden habe.
Ich erstelle aus meiner Springboot-Applikation ein Image und lasse dies dann in einem Docker Container laufen. Meine Applikation läuft dann quasi in einer virtuellen Maschine mit eigenem Filesystem. In den log4j2.properties wurde ein gewisser Speicherpfad für die Logfile angegeben, der aber nur bezogen auf der lokalen Maschine läuft. ich muss also erstmal festlegen, wo die logfiles in der vm gespeichert werden soll. Wie du vorhin schon geschrieben hast /app/log .

Jetzt habe ich folgendes gemacht:
docker run -v c:\users\marekl\desktop\log4j2logger:/app/log -p 8090:8090 eventopener

Ich gebe links also den Pfad an von meinem localen System (Ziel) und rechts den Pfad von meinem Container, der die Daten an mein locales Filesystem schickt.

Ist das so grob richtig von der Funktionalität?

Vielen Dank für die Geduld!
 

mrBrown

Super-Moderator
Mitarbeiter
Warum willst du denn in eine Datei loggen? Mit Docker ist's meist deutlich einfacher, nur auf STDOUT und STDERR zu loggen, und das Schreiben in eine Datei wenn nötig "von außerhalb" zu machen
 

MarekLanger

Mitglied
Warum willst du denn in eine Datei loggen? Mit Docker ist's meist deutlich einfacher, nur auf STDOUT und STDERR zu loggen, und das Schreiben in eine Datei wenn nötig "von außerhalb" zu machen
Die Thematik hat mich interessiert, da ich es schon eine weile mit log4j2 mache. Außerdem möchte ich alles in ein Volume/Folder schreiben, damit ich später die logfiles mithilfe von logstash an ELK schicken möchte
 

MarekLanger

Mitglied
Kurze Frage:
Wenn ich die Logfiles in einem docker volume speichern will würde ich folgendes machen:

[CODE lang="java" title="Volume erstellen"]docker volume create --name LogfileFolder[/CODE] mit

[CODE lang="java" title="docker inspect LogfileFolder"][
{
"CreatedAt": "2021-01-14T14:48:50Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/LogfileFolder/_data",
"Name": "LogfileFolder",
"Options": {},
"Scope": "local"
}
][/CODE]

und dann:

[CODE lang="java" title="docker command"]docker run -v /var/lib/docker/volumes/LogfileFolder:/app/log -p 8090:8090 eventopener[/CODE]

Als nächstes würde ich gerne Filebeat an das volume anknüpfen und die Daten sollen an ELK gesendet werden. Habe ich den Pfad für das erstellte Volume richtig angegeben?
 

mrBrown

Super-Moderator
Mitarbeiter
Die Thematik hat mich interessiert, da ich es schon eine weile mit log4j2 mache.
log4j2 kann auch auf Konsole loggen, das macht für Log4j2 keinen Unterschied :)

Außerdem möchte ich alles in ein Volume/Folder schreiben, damit ich später die logfiles mithilfe von logstash an ELK schicken möchte
Als nächstes würde ich gerne Filebeat an das volume anknüpfen und die Daten sollen an ELK gesendet werden

Das kann docker afaik direkt über log-driver, mit syslog gehts direkt an Logstash, ohne Filebeat dazwischen.


Habe ich den Pfad für das erstellte Volume richtig angegeben?
Das Volumen gibt man direkt an, ohne den Pfad:
docker run -v LogfileFolder:/app/log -p 8090:8090 eventopener
 

mrBrown

Super-Moderator
Mitarbeiter

Ähnliche Java Themen

Neue Themen


Oben