Логирование в standalone режиме#
Внесение изменений в конфигурацию#
Каталог конфигурации:
{{workspace}}/application/config/
Правило внесения изменений:
не изменять основные файлы:
logback-LoggerContext.xmllogback-LoggerContext-session.xml
изменять только расширения:
logback-LoggerContext-ext.xmllogback-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") && (level < INFO)) {
//пропуск уровня INFO и выше
return true;
} else if (logger.startsWith("ru.bitec.engine.script") && (level < WARN)) {
return true;
} else if (logger.startsWith("ru.bitec.engine.datastore") && (level < 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.") && (level <= 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/