Логирование в standalone режиме#

Внесение изменений в конфигурацию#

Каталог конфигурации:

  • {{workspace}}/application/config/

Правило внесения изменений:

  • не изменять основные файлы:

    • logback-LoggerContext.xml

    • logback-LoggerContext-session.xml

  • изменять только расширения:

    • logback-LoggerContext-ext.xml

    • logback-LoggerContext-session-ext.xml

После внесения изменений требуется перезапуск сервисов:

sudo systemctl restart global3
sudo systemctl restart globalscheduler
Пример logback-LoggerContext.xml
<configuration>
    <include file="/opt/global/globalserver/appkit/application/config/logback-LoggerContext-ext.xml"/>
    <appender name="STDOUT_DEFAULT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
        ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>[%d{dd-MM-yyyy HH:mm:ss.SSS}] [%level] [%thread] %logger - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="OUT_SSH" class="ru.bitec.engine.core.logging.SshConsoleAppender">
        <encoder>
            <!--<pattern>[%-5level] %d{HH:mm:ss.SSS} [%thread]:%X{USER} - %msg - %logger%n</pattern>-->
            <pattern>[%d{dd-MM-yyyy HH:mm:ss.SSS}] [%level] - %msg</pattern>
        </encoder>
    </appender>

    <appender name="FILEOUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/opt/global/globalserver/logs/global3.%d{yyyy-MM-dd_HH}.system.log</fileNamePattern>
        
            <maxHistory>14</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <pattern>[%d{dd-MM-yyyy HH:mm:ss.SSS}] [%level] [%thread] [%logger] - %msg%n</pattern>
        </encoder>
    </appender>
 

    <!--
        Возможные значения параметра "level" в порядке приоритета важноости
        OFF
        ERROR
        WARN
        INFO
        DEBUG
        TRACE
        ALL
    -->

    <root level="INFO">
        <appender-ref ref="FILEOUT"/>
		<appender-ref ref="OUT_SSH"/>
        <appender-ref ref="STDOUT_DEFAULT"/>
    </root>

    <logger name="net.sf.log4jdbc" level="warn">
        <appender-ref ref="STDOUT_DEFAULT"/>
    </logger>
	
	<!-- Для логирования SQL вызовов переключите в режим INFO или ниже-->
    <!-- Текущие значения не менять, тк: -->
    <!-- Установка уровня логирования на сервере задается через фильтр в начале файла.-->
    <!-- Установка уровня логирования на клиенте задается через общий файл конфигурации и\или выставляется клиентом.-->
    <logger name="jdbc" level="off" additivity="false"/>

    <!-- Выводит SQL-текст, значения IN\OUT параметров -->
    <!--<logger name="jdbc.audit" level="info"/>-->

    <!-- Выводит текст SQL - вызова.
    Переведено в режим OFF, что бы не дублировать вывод SQL-текста-->
    <logger name="jdbc.sqlonly" level="OFF"/>

    <!-- Выводит текст SQL - вызова с временем выполения.
     Переведено в режим OFF, что бы не дублировать вывод SQL-текста   -->
    <logger name="jdbc.sqltiming" level="OFF"/>

    <!-- Sbt -->
    <!-- info - общие сообщения о действиях менеджера-->
    <!-- debug - "+" весь вывод SBT, обновляемые файлы-->
    <!-- trace - "+" все события DirWatcher'a-->	
	<logger name="ru.bitec.engine.sbt" level="debug">
	 <appender-ref ref="FILEOUT"/>
    </logger>

</configuration>
Пример logback-LoggerContext-session.xml
<configuration>
	<include file="/opt/global/globalserver/appkit/application/config/logback-LoggerContext-session-ext.xml"/>
    <appender name="STDOUT_SESSION" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
        ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <!--TRACE.getInt == 5000-->
            <!-- тут задается уровень логирования операций -->
            <evaluator>
                <expression>
                    if (logger.startsWith("ru.bitec.engine.model.operation") &amp;&amp; (level &lt; INFO)) {
                    //пропуск уровня INFO и выше
                    return true;
                    } else if (logger.startsWith("ru.bitec.engine.script") &amp;&amp; (level &lt; WARN)) {
                    return true;
                    } else if (logger.startsWith("ru.bitec.engine.datastore") &amp;&amp; (level &lt; WARN)) {
                    return true;
                    } else {
                    return false;
                    }
                </expression>
            </evaluator>
            <OnMismatch>NEUTRAL</OnMismatch>
            <OnMatch>DENY</OnMatch>
        </filter>
        <encoder>
            <pattern>%d{dd-MM-yyyy HH:mm:ss.SSS} [%-5level] [%thread]:%X{USER} - %msg - %logger%n</pattern>
        </encoder>
    </appender>

    <appender name="OUT_CLIENT" class="ru.bitec.engine.core.logging.ClientConsoleAppender">
        <encoder>
            <!--<pattern>[%-5level] %d{HH:mm:ss.SSS} [%thread]:%X{USER} - %msg - %logger%n</pattern>-->
            <pattern>%d{dd-MM-yyyy HH:mm:ss.SSS} [%-5level] - %msg</pattern>
        </encoder>
    </appender>
	
	<appender name="FILEOUT_APP" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/opt/global/globalserver/logs/global3.%d{yyyy-MM-dd_HH}.application.log</fileNamePattern>
        
            <maxHistory>14</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>

        <encoder>
        <!-- [%d{dd-MM-yyyy HH:mm:ss.SSS}] [%-5level] [%thread] %logger - %msg%n -->
	    <pattern>[%d{dd-MM-yyyy HH:mm:ss.SSS}] [%level] [%thread] [%logger] [%X{USER}] - %msg%n</pattern>
        </encoder>
    </appender>


    
    <appender name="FILEOUT_SESSION" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/opt/global/globalserver/logs/global3.%d{yyyy-MM-dd_HH}.session.log</fileNamePattern>
        
            <maxHistory>14</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>

        <encoder>
	    <pattern>[%d{dd-MM-yyyy HH:mm:ss.SSS}] [%level] [%thread] [%logger] [%X{USER}] - %msg%n</pattern>
        </encoder>
    </appender>
   

    <appender name="STDOUT_LOG4JDBC" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <!--TRACE.getInt == 5000-->
            <!-- тут задается уровень логирования SQL -->
            <evaluator>
                <expression>
                    if(logger.startsWith("jdbc.") &amp;&amp; (level &lt;= ERROR)) {
                    //OFF
                    return true;
                    } else {
                    return false;
                    }
                </expression>
            </evaluator>
            <OnMismatch>NEUTRAL</OnMismatch>
            <OnMatch>DENY</OnMatch>
        </filter>
        <encoder>
            <pattern>%d{dd-MM-yyyy HH:mm:ss.SSS} [%-5level] [%thread]:%X{USER} - SQL: %msg - %logger%n</pattern>
        </encoder>
    </appender>
	
	

    <!--
        Возможные значения парамтера "level" в порядке приоритета важноости
        OFF
        ERROR
        WARN
        INFO
        DEBUG
        TRACE
        ALL
    -->

    <root level="warn">
    </root>

    <!-- Для логирования открытия форм и создания выборок переключите в DEBUG.
    Для логирования созданий/диспозов объектов, парса операций и др. нискоуровневых действий переключите в TRACE-->
    <logger name="ru.bitec" level="info" additivity="false">
      <appender-ref ref="STDOUT_SESSION"/>
      <appender-ref ref="FILEOUT_SESSION"/>
    </logger>

    <!-- Для логирования команд с перезентера заменить уровень логирования на DEBUG.-->
    <logger name="ru.bitec.engine.command" level="info"/>

    <!-- Для логирования вызовов операций заменить уровень логирования на DEBUG.-->
    <!-- Для логирования завершений вызовов операций заменить уровень логирования на TRACE -->
    <!-- Текущие значения не менять, тк: -->
    <!-- Установка уровня логирования на сервере задается через фильтр в начале файла.-->
    <!-- Установка уровня логирования на клиенте задается через общий файл конфигурации и\или выставляется клиентом.-->
    <logger name="ru.bitec.engine.model.operation" level="info" additivity="false">
        <appender-ref ref="OUT_CLIENT"/>
        <appender-ref ref="STDOUT_SESSION"/>
    </logger>

    <!-- Script -->
    <logger name="ru.bitec.engine.script" level="warn" additivity="false">
        <appender-ref ref="OUT_CLIENT"/>
        <appender-ref ref="STDOUT_SESSION"/>
    </logger>

    <logger name="ru.bitec.engine.datastore" level="warn" additivity="false">
        <appender-ref ref="OUT_CLIENT"/>
        <appender-ref ref="STDOUT_SESSION"/>
    </logger>

    <!--Прикладная Scala бизнес логика-->
    <logger name="ru.bitec.app" level="info" additivity="false">
        <appender-ref ref="OUT_CLIENT"/>
        <appender-ref ref="FILEOUT_APP"/>
        <appender-ref ref="STDOUT_SESSION"/>
    </logger>

    <!--Лог сессии EclipseLink-->
    <logger name="org.eclipse" level="info">
        <appender-ref ref="OUT_CLIENT"/>
    </logger>

    <!-- Translate PascalScript, parse Operation -->
    <logger name="ru.bitec.engine.script.JSTranslator" level="warn"/>
    <logger name="ru.bitec.engine.script.ScriptOperationHelper" level="warn"/>

    <!-- Report preparing. For logging set TRACE-->
    <logger name="ru.bitec.engine.report" level="warn"/>


    <!-- Antlr -->
    <logger name="ru.bitec.engine.script.antlr" level="warn"/>

    <!-- Загрузчик scala-классов бизнес логики -->
    <logger name="ru.bitec.engine.meta.loader" level="warn"/>

    <!-- Выделение Sql-соединений-->
    <logger name="ru.bitec.engine.connection" level="warn"/>

    <!-- Для логирования SQL вызовов переключите в режим INFO или ниже-->
    <!-- Текущие значения не менять, тк: -->
    <!-- Установка уровня логирования на сервере задается через фильтр в начале файла.-->
    <!-- Установка уровня логирования на клиенте задается через общий файл конфигурации и\или выставляется клиентом.-->
    <logger name="jdbc" level="off" additivity="false">
        <appender-ref ref="OUT_CLIENT"/>
        <appender-ref ref="STDOUT_LOG4JDBC"/>
    </logger>

    <!-- Выводит SQL-текст, значения IN\OUT параметров -->
    <!--<logger name="jdbc.audit" level="info"/>-->

    <!-- Выводит текст SQL - вызова.
    Переведено в режим OFF, что бы не дублировать вывод SQL-текста-->
    <logger name="jdbc.sqlonly" level="OFF"/>

    <!-- Выводит текст SQL - вызова с временем выполения.
     Переведено в режим OFF, что бы не дублировать вывод SQL-текста   -->
    <logger name="jdbc.sqltiming" level="OFF"/>

    <!--<logger name="ru.bitec.engine.session" level="trace"/>-->
    <!--<logger name="ru.bitec.common.rpc" level="trace"/>-->

    <!-- Ничего не выводит -->
    <!--<logger name="net.sf.log4jdbc" level="trace">-->
    <!--<appender-ref ref="STDOUT_SESSION"/>-->
    <!--</logger>-->

    <!-- Ничего не выводит -->
    <!--<logger name="log4jdbc" level="trace">-->
    <!--<appender-ref ref="STDOUT_LOG4JDBC" />-->
    <!--</logger>-->

</configuration>

Просмотр логов#

1) systemd-journald#

Для просмотра рекомендуется использовать:

sudo journalctl -u global3 -n 200 -f
sudo journalctl -u globalscheduler -n 200 -f

Фильтрация по времени:

sudo journalctl -u global3 --since "1970-01-01 00:00:00"
sudo journalctl -u global3 --since "1 hour ago"

Поиск по строке (локальная фильтрация):

sudo journalctl -u global3 | grep -i "error"

2) Syslog (при наличии rsyslog)#

В зависимости от дистрибутива системные журналы могут располагаться, например, по путям:

  • /var/log/syslog (Debian),

  • /var/log/messages (RHEL/CentOS).

Пример просмотра:

sudo tail -F /var/log/syslog
sudo grep -R "global3" /var/log/syslog

Примечание: syslog может содержать записи, полученные как напрямую из приложения (SyslogAppender), так и через экспорт journald в rsyslog.

3) Файлы логов приложения#

Файлы по умолчанию сохраняются в директории:

/opt/global/globalserver/logs

Базовые операции:

ls -lah /opt/global/globalserver/logs
tail -F /opt/global/globalserver/logs/*.log

Уровни логирования (рекомендации)#

  • Для постоянной эксплуатации рекомендуется уровень INFO.

  • Уровни DEBUG/TRACE предназначены для диагностики и должны включаться:

    • на ограниченное время,

    • точечно (по конкретным логгерам/пакетам),

    • с обязательным контролем объёма и последующей отменой изменений.

Ротация логов (примеры)#

Вариант A - ротация средствами Logback (если используются файловые аппендеры)#

Пример для системных логов (размещается в logback-LoggerContext-ext.xml):

<included>
  <appender name="FILEOUT_EXT" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>/opt/global/globalserver/logs/global3.%d{yyyy-MM-dd_HH}.system.log</fileNamePattern>

      <maxHistory>1488</maxHistory>
      <totalSizeCap>5GB</totalSizeCap>
      <cleanHistoryOnStart>true</cleanHistoryOnStart>
    </rollingPolicy>
    <encoder>
      <pattern>[%d{dd-MM-yyyy HH:mm:ss.SSS}] [%level] [%thread] [%logger] - %msg%n</pattern>
    </encoder>
  </appender>

    <root level="INFO">
        <appender-ref ref="FILEOUT_EXT"/>
    </root>
</included>

Вариант B - logrotate#

Файл: /etc/logrotate.d/globalserver

/opt/global/globalserver/logs/*.log {
  daily
  rotate 14
  compress
  delaycompress
  missingok
  notifempty
  dateext
  maxsize 500M
  copytruncate
}

Проверка конфигурации:

sudo logrotate -d /etc/logrotate.d/globalserver
sudo logrotate -f /etc/logrotate.d/globalserver

Ограничение объёма journald#

Файл: /etc/systemd/journald.conf (пример):

SystemMaxUse=1G
SystemKeepFree=2G
MaxRetentionSec=14day

Применение:

sudo systemctl restart systemd-journald

Логи HAProxy (если используется в составе стенда)#

Просмотр логов HAProxy#

Конфигурация находится в /etc/haproxy/haproxy.cfg

global
log /dev/log  local0 debug   # debug — самый подробный уровень
log /dev/log  local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon

  # Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private

  # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

defaults
option tcplog
option  dontlognull
option  log-health-checks      # Логирует результат health checks
option  abortonclose           # Логирует обрыв соединений
option  dontlog-normal
option  log-separate-errors
log global
mode  http
  #option  httpchk
option  httplog
timeout connect 5000
timeout client  50000
timeout server  50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http



frontend http-frontend
bind *:8080
default_backend http-backend

backend http-backend
server s1 192.168.200.16:8080 check

Команда для просмотра логов:

journalctl -u haproxy -f

Пример логов

0/0 «GET /login/ing/glow.ong HTTP/1.1“ 09:32:53 hаproxy hаprоxy [44489]: 192.168.200.1:54520 [04/Aug/2025:09:32:38.821] http-frontend http-backend/s1 0/0/1212/834/14706 «GET /view/fonts/inter/inter-regular-variable.ttf HTTP/1.1» 200 121659 - - CD– 6/6/2 200 135559 - - CD– 6/6/