feat:重构日志系统并添加应用锁功能
- 重写 logback.xml 配置文件,简化日志输出格式和存储策略 - 删除 logbcak.xml 文件,统一日志配置 - 添加 AppLocker 依赖,实现应用单实例锁定 - 更新 Main 类,增加应用锁逻辑 -调整 TrayFrameUtf8 类,优化系统托盘相关代码
This commit is contained in:
parent
a6bb46b8f5
commit
fa525732d1
18
pom.xml
18
pom.xml
|
@ -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>-->
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
|
|
|
@ -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>
|
||||
|
|
@ -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>
|
Loading…
Reference in New Issue