Ich habe mich bisher mit Logging nicht so tiefschürfend beschäftigt, sondern habe mich irgendwie durchgemogelt. Jetzt muss ich eine Logging-Strategie für eine kleine Web-Applikation erstellen, wo “einfach ein bisschen rumprobieren” wohl nicht mehr ausreicht.
Voraussetzungen:
- Jetty-Server, nicht embedded
- Spark-Framework, über SparkFilter in web.xml gestartet
- Java 8 Applikation, verwendet aktuell Log4j2 (ist mir aber im Grund egal)
- z.Z. verwende ich Maven, soll aber auf Gradle umgestellt werden
- Logging innerhalb der Anwendung mit entsprechender log4j2.properties funktioniert bereits, das Zeugs geht zur Konsole und zu einem “rollenden” Log-File
Meine log4j2.properties sehen z.Z. so aus:
status = error
name = PropertiesConfig
property.filename = logs/application.log
filters = threshold
filter.threshold.type = ThresholdFilter
filter.threshold.level = debug
appenders = console, rolling
appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %N %d{HH:mm:ss} %-5p %c{1}:%L - %m%n
appender.rolling.type = RollingFile
appender.rolling.name = rolling
appender.rolling.fileName = ${filename}
appender.rolling.filePattern = logs/application-%d{MM-dd-yy}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %N %d{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.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 20
rootLogger.level = debug
rootLogger.appenderRef.rolling.ref = rolling
rootLogger.appenderRef.console.ref = console
Ich hätte lieber Properties als XML oder so, aber da bin ich flexibel
Ich möchte folgendes erreichen:
- alle Log-Messages außerhalb meines Applications-Packages sollen in ein separates rollendes Log-File server.log
- alle “normalen” Log-Messages innerhalb meines Applications-Packages sollen in ein separates rollendes Log-File application.log
- bestimmte Log-Messages (ich habe was von Markern gelesen, ist das das richtige?) sollen in ein separates rollendes Log-File tracking.log
- natürlich möchte ich die Log-Level für die einzelnen Files separat setzen können
- alle Log-Messages, die in die Files gehen, sollen auch in der Konsole angezeigt werden (eventuell mit anderem Pattern)
Die Haupt-Schwierigkeiten sind für mich:
- wie es aussieht, brauche ich SLF4J, um die Jetty- (und wohl auch die Spark-) Messages abzufangen, und mir ist nicht klar, welche Dependencies und Settings ich dafür brauche
- mir ist nicht so richtig klar, wie ich die Messages geeignet aufteile (Application oder nicht, und innerhalb der Applikation die separaten Tracking-Messages)
- Ich weiß nicht, ob es praktikabel ist, in der Applikation weiter direkt Log4j2 zu verwenden, oder ob ich auch da besser zu SLF4J wechseln sollte
Wäre cool wenn mir jemand grob skizzieren könnte, wie ich das alles hinbekomme.