Tomcat 7/8 logolása (event és access) syslogba valamint exception logolás

Fórumok

Sziasztok,

Kis segítséget szeretnék kérni tőletek Tomcat-be pakolt alkalmazások logolásával kapcsolatban. Eddig log4j/logback/log4j2 keretrendszereket próbáltam ki a témában, amivel sikerült az alkalmazások és Tomcat (event és access) logokat fájlba írni. Syslogba logolás azonban itt-ott problémás volt, az access logokat meg nem is sikerült ilyen módon logolni. Amit találtam a témában: https://pastebin.com/JLEBDmt2

A log4j-nál ezekkel a beállításokkal mentem:

log4j.appender.SYSLOG = org.apache.log4j.net.SyslogAppender
log4j.appender.SYSLOG.Header=true
log4j.appender.SYSLOG.syslogHost = (server)
log4j.appender.SYSLOG.layout = org.apache.log4j.PatternLayout
log4j.appender.SYSLOG.layout.ConversionPattern = tomcat %c{2} %x %m%n
log4j.appender.SYSLOG.Facility = LOCAL0

Itt nagyjából jó logokat kaptam, exceptionokkal probléma van (több sorban jelennek meg). Access logokat a syslog-ba nem tudtam irányítani.

logback-nál ezt használtam:

<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
<syslogHost>(server)</syslogHost>
<port>601</port>
<facility>SYSLOG</facility>
<suffixPattern>tomcat: [%thread] rId:%X{requestID} user:%X{userID} %msg [%logger{36}]</suffixPattern>
</appender>

A fájlok írása itt is jó. Access logokat a syslog-ba nem tudtam irányítani, így próbáltam:

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

<property name="max.retention.days" value="60" />
<property name="max.file.size" value="20MB" />

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.access.PatternLayoutEncoder">
<pattern>%t{yyyy-MM-dd HH:mm:ss.SSS} %h %i{X-Forwarded-For} %l %u "%r" %s %b "%i{Referer}" "%i{User-Agent}"</pattern>
</encoder>
</appender>

<appender name="ACCESS-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${catalina.base}/logs/localhost-access.log</file>
<append>true</append>
<encoder class="ch.qos.logback.access.PatternLayoutEncoder">
<charset>utf-8</charset>
<pattern>%t{yyyy-MM-dd HH:mm:ss.SSS} %h %i{X-Forwarded-For} %l %u "%r" %s %b "%i{Referer}" "%i{User-Agent}"</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${catalina.base}/logs/archive/localhost-access-%d{yyyyMMdd}-%i.log.zip</fileNamePattern>
<maxHistory>${max.retention.days}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${max.file.size}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>

<appender name="ACCESS-SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
<syslogHost>(server)</syslogHost>
<port>601</port>
<facility>SYSLOG</facility>
<encoder class="ch.qos.logback.access.PatternLayoutEncoder">
<pattern>tomcat/access: %h %i{X-Forwarded-For} %l %u "%r" %s %b "%i{Referer}" "%i{User-Agent}"</pattern>
<pattern>common</pattern>
</encoder>
</appender>.

<appender-ref ref="ACCESS-LOG" />
<appender-ref ref="ACCESS-SYSLOG" />

</configuration>

log4j2 esetében: Itt nagyjából jó logokat kaptam, exceptionokat tudtam kezelni. Access logokat a syslog-ba nem tudtam irányítani.

A fő kérdés az lenne, hogy mi a megfelelő eljárás az access logok syslogba irányításánál Tomcat esetében? Log4j2-nél erre tényleg nincs lehetőség, csak külső modul fordításával? (https://stackoverflow.com/questions/18056682/tomcat-access-logging-thro…, https://marcoscorner.walther-family.org/2012/06/apache-tomcat-access-lo…) Az exceptionok kezelésének mi a jó megoldása syslogszerver esetén log4j2-t vagy logback-et használva?

Hozzászólások

Esetleg ezt nézd meg, nem túl friss cucc, de működhet.
https://github.com/CloudBees-community/cloudbees-web-container-extras/b…

Itt le tudod tölteni bináris formában a libet, hogy ne kelljen fordítani:
https://github.com/CloudBees-community/cloudbees-web-container-extras/r…

És akkor a server.xml-be org.apache.catalina.valves.AccessLogValve helyett com.cloudbees.tomcat.valves.SyslogAccessLogValve működhet ha látja a libet a Tomcat.

A default valve azt tudja amit itt látsz: https://tomcat.apache.org/tomcat-8.0-doc/api/org/apache/catalina/valves…
Ott látod a leszármazottjai a "Direct Known Subclasses" alatt. JDBC-be pl tud logolni.

Érdemes lenne azt is megnézni, hogy van-e valami tool amivel egyszerűen át tudod tenni kb. realtime syslogba fájlból, talán az a legegyszerűbb út.

log4j2 tud syslogba logolni, viszont szerintem a log4j2-vel nem tudod logolni az access logot.

♲♻♲