feat:重构日志系统并添加应用锁功能

- 重写 logback.xml 配置文件,简化日志输出格式和存储策略
- 删除 logbcak.xml 文件,统一日志配置
- 添加 AppLocker 依赖,实现应用单实例锁定
- 更新 Main 类,增加应用锁逻辑
-调整 TrayFrameUtf8 类,优化系统托盘相关代码
This commit is contained in:
JianGuo 2025-02-08 17:49:40 +08:00
parent a6bb46b8f5
commit fa525732d1
5 changed files with 68 additions and 94 deletions

18
pom.xml
View File

@ -55,14 +55,10 @@
<classifier>no-natives</classifier>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.13</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.13</version>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.13</version>
<!-- <scope>test</scope>-->
</dependency>
<dependency>
<groupId>io.github.eduramiba</groupId>
@ -75,6 +71,12 @@
<artifactId>webcam-capture</artifactId>
<version>0.3.12</version>
</dependency>
<dependency>
<groupId>io.github.sanyarnd</groupId>
<artifactId>app-locker</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
<!-- <build>-->

View File

@ -1,6 +1,7 @@
package org.aohe;
import com.formdev.flatlaf.FlatDarculaLaf;
import io.github.sanyarnd.applocker.AppLocker;
import lombok.extern.slf4j.Slf4j;
import org.aohe.constant.SocketEnum;
import org.aohe.daemon.WatchDog;
@ -15,8 +16,19 @@ import org.aohe.constant.Control;
@Slf4j
public class Main {
private static final String JAVA_IO_TMPDIR = System.getProperty("java.io.tmpdir");
public static void main(String[] args) throws Exception {
AppLocker locker = AppLocker.create("aoheSaneServiceLock").build();
UIManager.setLookAndFeel(new FlatDarculaLaf());
try {
locker.lock();
}catch (Exception e){
JOptionPane.showMessageDialog(null,"程序启动失败,已有实例在运行!"
,"AoHe Scan Program",JOptionPane.WARNING_MESSAGE); //消息对话框
log.error("程序已被其他应用占用");
System.exit(0);
}
log.info("启动成功");
SocketUtils.start(SocketEnum.CAM_SOCKET);
Control.WEBCAM_SHOW_TASK = new WebcamShowTask();
@ -26,4 +38,8 @@ public class Main {
watchDog.start();
TrayFrameUtf8.initSystemTrayUTF8();
}
private void logLocking(String message) {
log.info("{}", message);
}
}

View File

@ -51,13 +51,13 @@ public class TrayFrameUtf8 {
// JMenuItem exit = new JMenuItem(getUTF8String("退出"));
JMenuItem exit = new JMenuItem("退出");
exit.addActionListener(e -> {
log.info("点击了退出选项");
//log.info("点击了退出选项");
System.exit(0);
});
// JMenuItem showMainFrame = new JMenuItem(getUTF8String("显示主窗体"));
JMenuItem showMainFrame = new JMenuItem("关于");
showMainFrame.addActionListener(e -> {
log.info("关于系统");
//log.info("关于系统");
JOptionPane.showMessageDialog(null, "AoHe 的扫描托盘程序");
//显示窗口
});
@ -90,9 +90,7 @@ public class TrayFrameUtf8 {
jPopupMenu.add(showMainFrame);
jPopupMenu.add(exit);
URL url = ResourceUtil.getResource("../res/ah.png");
String trayPng = "../res/ah.png";
log.info("file:{}", url.getFile());
URL url = ResourceUtil.getResource("ah.png");
Image image = Toolkit.getDefaultToolkit().getImage(url.getFile());
// 创建系统托盘图标
TrayIcon trayIcon = new TrayIcon(image, "Scan Program For AH");

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志存放路径 -->
<property name="log.path" value="logs"/>
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 全部日志输出 -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/ScanService.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="org.aohe" level="info"/>
<!-- Spring日志级别控制 -->
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
</configuration>

View File

@ -1,81 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="LOG_CONTEXT_NAME" value="AoHe-Scan"/>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="logs/${LOG_CONTEXT_NAME}"/>
<!-- 定义日志上下文的名称 -->
<contextName>${LOG_CONTEXT_NAME}</contextName>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d 表示日期,%thread 表示线程名,%-5level级别从左显示 5 个字符宽度%msg日志消息%n 是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{56}.%method:%L - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<!--info 日志统一输出-->
<appender name="file.info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Prudent>true</Prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名,按小时生成-->
<FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/info/aohe.scan.info.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern>
<!--日志文件输出的文件名,按天生成-->
<!--<FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/error/error.%d{yyyy-MM-dd}.%i.log</FileNamePattern>-->
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 除按日志记录之外,还配置了日志文件不能超过 10M(默认),若超过 10M日志文件会以索引 0 开始 -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d 表示日期,%thread 表示线程名,%-5level级别从左显示 5 个字符宽度 %method 方法名 %L 行数 %msg日志消息%n 是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{56}.%method:%L - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日志文件只记录 info 级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--错误日志统一输出-->
<appender name="file.error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--省略,参考 file.info appender-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--warn 日志统一输出-->
<appender name="file.warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--省略,参考 file.info appender-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 日志输出级别 -->
<root level="debug">
<appender-ref ref="console"/>
<appender-ref ref="file.error"/>
<appender-ref ref="file.info"/>
<appender-ref ref="file.warn"/>
</root>
</configuration>