AWS Elastic Beanstalk Application Logging with Logback

Nov 26 2020

EDYCJA: Dodano obraz (problem wygląda na to, że pliki dziennika nie są zapisywane)

Uruchamiam wiosenny plik mvc (NIE springboot) WAR na AWS Elastic Beanstalk na środowisku „Tomcat 8.5 z Corretto 11 działającym na 64-bitowym systemie Amazon Linux 2 / 4.1.3”.

Wszystko działa zgodnie z oczekiwaniami Z WYJĄTKIEM dzienników aplikacji, które piszę za pomocą slf4j / logback.

Poniżej znajduje się mój plik konfiguracyjny logback.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE xml>
<configuration debug="true">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                %d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>
    <appender name="APPLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/var/log/java.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>/var/log/java_%d{yyyy-MM-dd}_%i.log</FileNamePattern>
            <!-- keep 14 days' worth of history -->
            <maxHistory>14</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- or whenever the File size reaches 10MB -->
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} [%thread][%X{remoteHost}] %-5level %c{1} - %msg%n</pattern>
            <!-- <pattern>%d %-5p %c{1} - %m%n</pattern> -->
        </encoder>
    </appender>
    <logger name="com.personal.service.layer.mongodb" level="INFO"
        additivity="false">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="APPLOG" />
    </logger>

    <logger name="org.springframework" level="INFO"
        additivity="false">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="APPLOG" />
    </logger>

    <logger name="spring.web" level="INFO" additivity="false">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="APPLOG" />
    </logger>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="APPLOG" />
    </root>

</configuration>

Po przeszukaniu google / stackoverflow dodałem folder ebextensions z plikiem konfiguracyjnym, aby uwzględnić moje dzienniki z dziennikami końcowymi i pakietem w następujący sposób:

files:
  "/opt/elasticbeanstalk/tasks/bundlelogs.d/applogs.conf" :
    mode: "000755"
    owner: root
    group: root
    content: |
      /var/log/*.log

  "/opt/elasticbeanstalk/tasks/taillogs.d/applogs.conf" :
    mode: "000755"
    owner: root
    group: root
    content: |
      /var/log/*.log

Po kilku poszukiwaniach w Internecie wypróbowałem inne kombinacje. Na przykład próbowałem ustawić plik dziennika w logback.xml jako /var/app/current/logs/applog.logiw używanych plikach conf /var/log/current/logs/*.log, zamiast tego, co pokazano powyżej, ale one też nie działały. Więc czuję, że brakuje mi czegoś na temat logowania do AWS za pomocą Logback.

Jestem również otwarty na (działające) sugestie dotyczące logowania za pomocą czegoś innego (log4j, logowanie java itp.).

EDYCJA: Wreszcie odkryłem bałagan w aws / eb i byłem w stanie ssh do środowiska. Nie widzę pliku java.log utworzonego w folderze var / log (ani w jakimkolwiek innym folderze z tą sprawą).

Dlaczego logback nie zapisywałby dzienników? Czy tej ścieżki dziennika /var/log/java.lognie można używać?

Odpowiedzi

TonyScott Nov 28 2020 at 03:05

To działa teraz dla mnie, dzięki zaakceptowanej odpowiedzi w Logback with Elastic Beanstalk , o którą również zapytałem.

Chcę połączyć to, czego nauczyłem się z obu pytań tutaj, ponieważ to pytanie dotyczy czytania dzienników, podczas gdy to pytanie dotyczy zapisywania dzienników i byłoby miło mieć pełną odpowiedź w jednym miejscu.

Poniżej przedstawiono zmiany, które wprowadziłem w pliku konfiguracyjnym logback.xml i ebextensions, jak wspomniano w pytaniu:

(1) W logback.xml zaktualizuj <file>/var/log/java.log</file>do<file>/var/log/tomcat/java.log</file>

(2) W pliku konfiguracyjnym ebextensions zaktualizuj /var/log/*.logdo /var/log/tomcat/*.log(jest to opcjonalne, będzie działać, nawet jeśli pozostanie jako /var/log/*.log)

Powodem, dla którego nie działał w /var/logfolderze, są uprawnienia do folderu. Kiedy ssh do folderu, stwierdziłem, że uprawnienia do tego folderu są ograniczone tylko do rootużytkownika.

Jednak gdy aplikacja jest uruchomiona z Tomcat, działa jako użytkownik, tomcatktóry nie ma uprawnień do zapisu w tym folderze. Jednak użytkownik tomcatma uprawnienia do zapisu w /var/log/tomcatfolderze.

Kolejnym folderem, do którego tomcatużytkownik ma dostęp, jest folder utworzony dla aplikacji /var/app. Więc jeśli lokalizacja pliku dziennika jest ustawiona w tym folderze w logback.xml, to również działałoby (wymagałoby to również zaktualizowania pliku konfiguracyjnego ebextensions, aby wskazywał na tę lokalizację).

Zajęło mi kilka dni, zanim w końcu to rozgryzłem, mam nadzieję, że pomoże to również innym.

PS Wyciągnąłem ConsoleAppenderplik z logback.xml, nic nie robił.