Добавил логгер в настройки.Омталось созранение стате в бд поправить
This commit is contained in:
AidarKC 2025-12-25 14:53:08 +03:00
parent d460ea2952
commit c8ee9925a1
10 changed files with 104 additions and 24 deletions

View File

@ -29,6 +29,12 @@ dependencies {
testImplementation platform('org.junit:junit-bom:5.10.0') testImplementation platform('org.junit:junit-bom:5.10.0')
testImplementation 'org.junit.jupiter:junit-jupiter' testImplementation 'org.junit.jupiter:junit-jupiter'
implementation "org.slf4j:slf4j-api:2.0.16" // вызов логгера
runtimeOnly "org.apache.logging.log4j:log4j-core:2.24.3" // Реализация: Log4j2 пишет в файл/консоль
runtimeOnly "org.apache.logging.log4j:log4j-slf4j2-impl:2.24.3" // Реализация: Log4j2 пишет в файл/консоль
implementation project(':shine-server-config') // модуль настроек из application.properties implementation project(':shine-server-config') // модуль настроек из application.properties

View File

@ -22,8 +22,7 @@ dependencies {
// JSON (BchInfoManager) // JSON (BchInfoManager)
implementation 'com.fasterxml.jackson.core:jackson-databind:2.18.1' implementation 'com.fasterxml.jackson.core:jackson-databind:2.18.1'
// логгер implementation "org.slf4j:slf4j-api:2.0.16" // вызов логгера
implementation 'org.slf4j:slf4j-api:2.0.16'
testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0'
implementation project(':shine-server-db') // модуль для работы с БД содержит и сущности из БД и саму работу с БД implementation project(':shine-server-db') // модуль для работы с БД содержит и сущности из БД и саму работу с БД

View File

@ -16,8 +16,10 @@ java {
} }
dependencies { dependencies {
// обычно тут пусто, максимум логгер и тесты
testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0'
implementation "org.slf4j:slf4j-api:2.0.16" // вызов логгера
} }
test { test {

View File

@ -16,7 +16,10 @@ repositories {
} }
dependencies { dependencies {
implementation 'org.xerial:sqlite-jdbc:3.47.0.0' implementation 'org.xerial:sqlite-jdbc:3.47.0.0' // sqlite
implementation "org.slf4j:slf4j-api:2.0.16" // вызов логгера
implementation project(':shine-server-config') // модуль с настройками implementation project(':shine-server-config') // модуль с настройками
} }

View File

@ -158,17 +158,14 @@ public class DatabaseInitializer {
blockchainName TEXT NOT NULL PRIMARY KEY, blockchainName TEXT NOT NULL PRIMARY KEY,
login TEXT NOT NULL, login TEXT NOT NULL,
public_key_base64 TEXT NOT NULL, public_key_base64 TEXT NOT NULL,
size_limit INTEGER NOT NULL, size_limit INTEGER NOT NULL,
size_bytes INTEGER NOT NULL,
file_size_bytes INTEGER NOT NULL, file_size_bytes INTEGER NOT NULL,
last_global_number INTEGER NOT NULL, last_global_number INTEGER NOT NULL,
last_global_hash TEXT NOT NULL, last_global_hash TEXT NOT NULL,
updated_at_ms INTEGER NOT NULL, updated_at_ms INTEGER NOT NULL,
-- Линии 0..7 (MVP: максимум 8 линий)
line0_last_number INTEGER NOT NULL, line0_last_number INTEGER NOT NULL,
line0_last_hash TEXT NOT NULL, line0_last_hash TEXT NOT NULL,
line1_last_number INTEGER NOT NULL, line1_last_number INTEGER NOT NULL,

View File

@ -135,7 +135,7 @@ public final class BlockchainStateDAO {
ps.setString(i++, e.getBlockchainName()); ps.setString(i++, e.getBlockchainName());
ps.setString(i++, nn(e.getLogin())); ps.setString(i++, nn(e.getLogin()));
ps.setString(i++, nn(e.getPublicKeyBase64())); ps.setString(i++, nn(e.getPublicKeyBase64()));
ps.setInt(i++, e.getSizeLimit()); ps.setLong(i++, e.getSizeLimit());
ps.setLong(i++, e.getFileSizeBytes()); ps.setLong(i++, e.getFileSizeBytes());
ps.setInt(i++, e.getLastGlobalNumber()); ps.setInt(i++, e.getLastGlobalNumber());
ps.setString(i++, nn(e.getLastGlobalHash())); ps.setString(i++, nn(e.getLastGlobalHash()));

View File

@ -13,7 +13,9 @@ public final class BlockchainStateEntry {
private String login; private String login;
private String publicKeyBase64; private String publicKeyBase64;
private int sizeLimit; /** Лимит (теперь long). */
private long sizeLimit;
/** Размер файла блокчейна в байтах (то, что будем сверять/чинить при старте). */ /** Размер файла блокчейна в байтах (то, что будем сверять/чинить при старте). */
private long fileSizeBytes; private long fileSizeBytes;
@ -28,7 +30,6 @@ public final class BlockchainStateEntry {
private long updatedAtMs; private long updatedAtMs;
public BlockchainStateEntry() { public BlockchainStateEntry() {
// по умолчанию хэши пустые (как "0")
for (int i = 0; i < 8; i++) lastLineHashes[i] = ""; for (int i = 0; i < 8; i++) lastLineHashes[i] = "";
this.lastGlobalHash = ""; this.lastGlobalHash = "";
} }
@ -36,7 +37,7 @@ public final class BlockchainStateEntry {
public BlockchainStateEntry(String blockchainName, public BlockchainStateEntry(String blockchainName,
String login, String login,
String publicKeyBase64, String publicKeyBase64,
int sizeLimit, long sizeLimit,
long fileSizeBytes, long fileSizeBytes,
int lastGlobalNumber, int lastGlobalNumber,
String lastGlobalHash, String lastGlobalHash,
@ -74,8 +75,8 @@ public final class BlockchainStateEntry {
public String getPublicKeyBase64() { return publicKeyBase64; } public String getPublicKeyBase64() { return publicKeyBase64; }
public void setPublicKeyBase64(String publicKeyBase64) { this.publicKeyBase64 = publicKeyBase64; } public void setPublicKeyBase64(String publicKeyBase64) { this.publicKeyBase64 = publicKeyBase64; }
public int getSizeLimit() { return sizeLimit; } public long getSizeLimit() { return sizeLimit; }
public void setSizeLimit(int sizeLimit) { this.sizeLimit = sizeLimit; } public void setSizeLimit(long sizeLimit) { this.sizeLimit = sizeLimit; }
public long getFileSizeBytes() { return fileSizeBytes; } public long getFileSizeBytes() { return fileSizeBytes; }
public void setFileSizeBytes(long fileSizeBytes) { this.fileSizeBytes = fileSizeBytes; } public void setFileSizeBytes(long fileSizeBytes) { this.fileSizeBytes = fileSizeBytes; }
@ -106,12 +107,8 @@ public final class BlockchainStateEntry {
lastLineHashes[line] = value == null ? "" : value; lastLineHashes[line] = value == null ? "" : value;
} }
public int[] getLastLineNumbersCopy() { public int[] getLastLineNumbersCopy() { return Arrays.copyOf(lastLineNumbers, 8); }
return Arrays.copyOf(lastLineNumbers, 8); public String[] getLastLineHashesCopy() { return Arrays.copyOf(lastLineHashes, 8); }
}
public String[] getLastLineHashesCopy() {
return Arrays.copyOf(lastLineHashes, 8);
}
public long getUpdatedAtMs() { return updatedAtMs; } public long getUpdatedAtMs() { return updatedAtMs; }
public void setUpdatedAtMs(long updatedAtMs) { this.updatedAtMs = updatedAtMs; } public void setUpdatedAtMs(long updatedAtMs) { this.updatedAtMs = updatedAtMs; }

View File

@ -22,8 +22,9 @@ dependencies {
implementation 'org.eclipse.jetty:jetty-servlet:11.0.20' implementation 'org.eclipse.jetty:jetty-servlet:11.0.20'
implementation 'org.eclipse.jetty.websocket:websocket-jetty-server:11.0.20' implementation 'org.eclipse.jetty.websocket:websocket-jetty-server:11.0.20'
implementation project(':shine-server-db') // модуль для работы с БД содержит и сущности из БД и саму работу с БД implementation "org.slf4j:slf4j-api:2.0.16" // вызов логгера
implementation project(':shine-server-db') // модуль для работы с БД содержит и сущности из БД и саму работу с БД
} }

View File

@ -25,7 +25,9 @@ dependencies {
implementation 'org.slf4j:slf4j-api:2.0.9' implementation 'org.slf4j:slf4j-api:2.0.9'
implementation 'ch.qos.logback:logback-classic:1.5.6' implementation 'ch.qos.logback:logback-classic:1.5.6'
implementation project(':shine-server-config') // модуль с настройками implementation "org.slf4j:slf4j-api:2.0.16" // вызов логгера
implementation project(':shine-server-config') // модуль с настройками
implementation project(':shine-server-crypto') // модуль сервера для работы с криптографией implementation project(':shine-server-crypto') // модуль сервера для работы с криптографией
implementation project(':shine-server-blockchain') // модуль для работы с блокчейном implementation project(':shine-server-blockchain') // модуль для работы с блокчейном
implementation project(':shine-server-db') // модуль для работы с БД содержит и сущности из БД и саму работу с БД implementation project(':shine-server-db') // модуль для работы с БД содержит и сущности из БД и саму работу с БД

View File

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<Properties>
<!-- Папка логов -->
<Property name="LOG_DIR">logs</Property>
<!-- Имя основного файла -->
<Property name="APP_LOG">${LOG_DIR}/server.log</Property>
<!-- Шаблон для консоли (цветной) -->
<Property name="CONSOLE_PATTERN">
%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%-5level}{FATAL=red blink, ERROR=red, WARN=yellow, INFO=green, DEBUG=cyan, TRACE=blue}
[%t] %c{1.} - %msg%n%throwable
</Property>
<!-- Шаблон для файла (БЕЗ цветов) -->
<Property name="FILE_PATTERN">
%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] %c - %msg%n%throwable
</Property>
</Properties>
<Appenders>
<!-- Цветная консоль -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${CONSOLE_PATTERN}" />
</Console>
<!-- Основной лог-файл + ротация по размеру и времени -->
<RollingFile name="File"
fileName="${APP_LOG}"
filePattern="${LOG_DIR}/server-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="${FILE_PATTERN}" />
<Policies>
<!-- каждый день новый файл -->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!-- и если разросся -->
<SizeBasedTriggeringPolicy size="50 MB"/>
</Policies>
<!-- сколько файлов держать -->
<DefaultRolloverStrategy max="60">
<!-- общий лимит на архивы, чтобы диск не умер -->
<Delete basePath="${LOG_DIR}" maxDepth="1">
<IfFileName glob="server-*.log.gz"/>
<IfAccumulatedFileSize exceeds="5 GB"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<!-- В консоль ТОЛЬКО ошибки (если захочешь), сейчас НЕ включаю.
Если хочешь — скажи, включу отдельным appender-ом.
-->
</Appenders>
<Loggers>
<!-- Чтобы JUL (java.util.logging) реально шёл в log4j2 -->
<Logger name="java.util.logging" level="info" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Logger>
<!-- Root: всё пишем в файл, и в консоль тоже -->
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>