应用日志配置模块调试完成。

This commit is contained in:
2026-01-18 20:39:14 +08:00
parent d639229bba
commit f30160c886
4 changed files with 110 additions and 91 deletions

View File

@@ -2,39 +2,88 @@ import java.util.Date;
import cc.winboll.LogUtils;
import cc.winboll.test.ConsoleCmdAutoTest;
import cc.winboll.util.IniConfigUtils;
import java.util.logging.Level;
/**
* AuthCenter 程序入口类
* 负责程序启动流程、INI配置加载、日志工具初始化及自动化测试执行调度
* 流程规范:加载配置→初始化日志→执行业务→收尾输出,异常兜底保障程序优雅退出
* @Author 豆包&ZhanGSKen<zhangsken@qq.com>
* @Date 2026-01-27 17:00:00
* @LastEditTime 2026-01-27 22:32:18
*/
public class Main {
public static void main(String[] args) {
// 程序启动基础信息输出
System.out.println("==== 程序启动 ====");
System.out.println("启动时间:" + new Date());
System.out.println("程序开始运行...");
try {
if (!IniConfigUtils.loadConfig(null)) {
System.out.println("INI配置文件加载失败程序无法启动强制退出");
System.exit(1);
}
System.out.println("【main函数】传入启动参数" + (args == null ? "无参数" : arrayToString(args)));
try {
// 初始化日志工具,输出路径
System.out.println("\n【日志初始化】开始初始化日志工具...");
try {
// 加载INI配置 带调试日志
System.out.println("\n【函数调用】IniConfigUtils.loadConfig(null) 开始加载配置文件");
boolean configLoadFlag = IniConfigUtils.loadConfig(null);
System.out.println("【调用结果】IniConfigUtils.loadConfig 执行结果:" + configLoadFlag);
if (!configLoadFlag) {
System.err.println("INI配置文件加载失败程序无法启动强制退出");
System.exit(1);
}
System.out.println("INI配置文件加载成功");
// 设置日志级别与日志输出目录
LogUtils.i("Main", "日志工具初始化完成!");
LogUtils.i("Main", "正在处理事务...");
try {
// 日志工具初始化 调试输出
System.out.println("\n【日志初始化】开始初始化日志工具...");
// 执行自动化测试,传递启动参数
LogUtils.i("Main", "开始执行ConsoleCmdAutoTest自动化测试套件");
//ConsoleCmdAutoTest.main(args);
System.out.println("\n【全开日志测试】...");
// 新增临时全开日志级别让test所有日志显示
Level oldLevel = LogUtils.getGlobalLogLevel();
LogUtils.setGlobalLogLevel(Level.ALL);
LogUtils.test(); // 执行测试
LogUtils.setGlobalLogLevel(oldLevel); // 还原原级别
System.out.println("\n【配置日志测试】...");
LogUtils.test(); // 执行测试
} finally {
LogUtils.i("Main", "测试执行完毕");
}
} catch (Exception e) {
System.out.println(String.format("%s", e));
}
// 单元测试
//ConsoleCmdAutoTest.main(args);
LogUtils.i("Main", "正在处理事务...");
} finally {
// 收尾日志 必执行
System.out.println("【收尾执行】finally块 执行测试收尾操作");
LogUtils.i("Main", "测试执行完毕");
}
} catch (Exception e) {
// 异常捕获 输出详情
System.err.println("\n【程序异常】执行过程出现异常异常信息" + e.getMessage());
e.printStackTrace();
}
// 程序结束信息
System.out.println("\n==== 程序结束 ====");
System.out.println("结束时间:" + new Date());
}
/**
* 数组转字符串 用于参数打印Java7兼容
* @param arr 输入字符串数组
* @return 拼接后字符串
*/
private static String arrayToString(String[] arr) {
if (arr == null || arr.length == 0) {
return "空数组";
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]);
if (i != arr.length - 1) {
sb.append(", ");
}
}
return sb.toString();
}
}

View File

@@ -18,13 +18,13 @@ import java.util.logging.Logger;
/**
* 日志工具类对接Java原生java.util.logging简化分级调用+统一格式化输出
* 适配Java7语法兼容Android API30支持异常堆栈打印
* 支持通过启动参数动态控制全局日志级别、-v参数控制终端同步输出
* 支持通过启动参数动态控制全局日志级别,终端日志默认开启
* 功能:单文件输出+10MB大小限制+满额时间戳备份+新日志沿用authcenter.log+退出自动清lck锁文件
* 核心调整读取INI配置log_path和log_level无兜底配置失败打系统流日志后退出程序
* 内部日志全部使用系统流输出,避免初始化依赖冲突
* @Author 豆包&ZhanGSKen<zhangsken@qq.com>
* @Date 2026-01-14 00:00:00
* @LastEditTime 2026-01-27 18:10:00
* @LastEditTime 2026-01-28 00:25:42
*/
public class LogUtils {
// ========== 静态常量常量优先public对外暴露private私有 ==========
@@ -198,16 +198,10 @@ public class LogUtils {
if (fileHandler != null) {
fileHandler.setLevel(level);
}
if (MainUtils.isVerbose()) {
if (!containsHandler(consoleHandler)) {
LOGGER.addHandler(consoleHandler);
System.out.println("[LogUtils][DEBUG] 终端日志输出已开启-v参数生效");
}
} else {
if (containsHandler(consoleHandler)) {
LOGGER.removeHandler(consoleHandler);
System.out.println("[LogUtils][DEBUG] 终端日志输出已关闭(-v参数未生效");
}
// 移除isVerbose判断强制添加控制台处理器终端日志始终开启
if (!containsHandler(consoleHandler)) {
LOGGER.addHandler(consoleHandler);
System.out.println("[LogUtils][DEBUG] 终端日志输出已开启");
}
}
@@ -256,5 +250,36 @@ public class LogUtils {
formatMessage(record));
}
}
// ========== 完善 单元测试方法(全级别覆盖+异常堆栈测试+当前日志配置打印) ==========
public static void test() {
System.out.println("\n==================================== LogUtils 单元测试开始 ====================================");
// 1. 打印当前日志配置信息,便于验证
System.out.printf("[LogUtilsTest] 当前日志级别:%s | 当前日志目录:%s%n", CURRENT_LOG_LEVEL.getName(), CURRENT_LOG_DIR);
System.out.println("[LogUtilsTest] ------------- 基础日志级别输出测试 -------------");
// 2. 全日志级别基础消息测试(覆盖所有提供的日志方法)
LogUtils.d("LogUtilsTest", "【DEBUG】调试信息程序运行状态跟踪仅调试环境输出");
LogUtils.i("LogUtilsTest", "【INFO】普通信息正常业务流程记录核心运行节点提示");
LogUtils.w("LogUtilsTest", "【WARN】告警信息非致命异常需关注但不影响程序运行");
LogUtils.e("LogUtilsTest", "【ERROR】错误信息致命异常需紧急处理修复");
System.out.println("[LogUtilsTest] ------------- 异常堆栈日志输出测试 -------------");
// 3. 带异常堆栈的日志测试Java7兼容模拟空指针异常场景
try {
String nullStr = null;
nullStr.length();
} catch (Exception e) {
LogUtils.d("LogUtilsTest", "【DEBUG】带堆栈-调试异常", e);
LogUtils.i("LogUtilsTest", "【INFO】带堆栈-普通异常", e);
LogUtils.w("LogUtilsTest", "【WARN】带堆栈-告警异常", e);
LogUtils.e("LogUtilsTest", "【ERROR】带堆栈-错误异常", e);
}
// 4. 测试结束标识
System.out.println("[LogUtilsTest] ------------- 日志输出格式验证 -------------");
LogUtils.i("LogUtilsTest", "日志格式:[时间] [级别] [线程名] [日志器名] - [内容]");
System.out.println("==================================== LogUtils 单元测试结束 ====================================\n");
}
}

View File

@@ -52,18 +52,10 @@ public class WinBoLL {
String logDir = projectRootDir.trim().replaceAll("/$", "") + "/logs";
LogUtils.setLogDir(logDir);
// 设置全局日志级别
Level logLevel = MainUtils.parseLogLevelArg();
LogUtils.setGlobalLogLevel(logLevel);
LogUtils.i(TAG, "全局日志级别已设置:" + logLevel.getName());
LogUtils.i(TAG, "日志目录已配置,路径:" + logDir);
// 获取解析后各项参数
boolean isVerbose = MainUtils.isVerbose();
boolean showDetailEnv = MainUtils.parseDetailArg();
String serverUrl = MainUtils.getFinalServerUrl();
httpPort = MainUtils.getHttpPortFromConfig();
LogUtils.i(TAG, "终端日志同步输出状态:" + (isVerbose ? "✅ 开启" : "❌ 关闭"));
LogUtils.d(TAG, "【参数信息】main(),解析后服务器地址:" + serverUrl + ",服务端口:" + httpPort);
// 环境信息打印 + 工具类初始化

View File

@@ -14,18 +14,14 @@ import java.util.logging.Level;
* 适配Java7 + Android API30无状态设计纯静态方法
* 支持 -key:value 格式参数解析基于Map存储参数供外部模块查询
* @Author 豆包&ZhanGSKen<zhangsken@qq.com>
* @Date 2026/01/18 11:00:00
* @LastEditTime 2026/01/19 11:00:00
* @Date 2026-01-18 11:00:00
* @LastEditTime 2026-01-28 00:42:16
*/
public class MainUtils {
// 常量迁移:与业务无关的通用常量
public static final String ARG_DETAIL = "detail";
public static final String ARG_LOG_LEVEL = "log";
public static final String ARG_SERVER_URL = "serverUrl";
private static volatile boolean isExit = false;
// 新增:-v 参数常量,控制终端同步输出日志
public static final String ARG_VERBOSE = "v";
public static final String INI_SERVER_SECTION = "ServerConfig";
public static final String INI_SERVER_KEY = "server_base_url";
@@ -33,7 +29,6 @@ public class MainUtils {
public static final String INI_HTTP_PORT_KEY = "http_server_port";
public static final int DEFAULT_HTTP_PORT = 8080;
public static final String DEFAULT_SERVER_URL = "http://localhost:8080";
public static final Level DEFAULT_LOG_LEVEL = Level.ALL;
// 参数存储Mapkey=参数名value=参数值
private static final Map<String, String> argMap = new HashMap<String, String>();
@@ -63,15 +58,6 @@ public class MainUtils {
argMap.put(ARG_DETAIL, value);
LogUtils.i(TAG, "【参数解析】匹配-detail参数" + value);
break;
case ARG_LOG_LEVEL:
argMap.put(ARG_LOG_LEVEL, value.toUpperCase());
LogUtils.i(TAG, "【参数解析】匹配-log参数级别" + value.toUpperCase());
break;
// 新增:识别 -v 参数
case ARG_VERBOSE:
argMap.put(ARG_VERBOSE, value);
LogUtils.i(TAG, "【参数解析】匹配-v参数终端同步日志输出已开启");
break;
default:
LogUtils.w(TAG, "【参数解析】未知参数:" + trimArg);
break;
@@ -105,39 +91,6 @@ public class MainUtils {
return result;
}
/**
* 新增:判断是否开启终端同步日志输出
*/
public static boolean isVerbose() {
LogUtils.d(TAG, "【函数调用】isVerbose()从argMap查询-v参数状态");
String value = argMap.get(ARG_VERBOSE);
boolean result = "true".equalsIgnoreCase(value);
LogUtils.d(TAG, "【函数返回】isVerbose(),返回:" + result);
return result;
}
/**
* 解析日志级别参数
*/
public static Level parseLogLevelArg() {
LogUtils.d(TAG, "【函数调用】parseLogLevelArg()从argMap查询参数");
String levelStr = argMap.get(ARG_LOG_LEVEL);
if (levelStr == null || levelStr.trim().isEmpty()) {
LogUtils.d(TAG, "【函数返回】parseLogLevelArg(),无日志级别参数,返回默认级别:" + DEFAULT_LOG_LEVEL);
return DEFAULT_LOG_LEVEL;
}
try {
Level level = Level.parse(levelStr);
LogUtils.d(TAG, "【函数返回】parseLogLevelArg(),返回解析级别:" + level);
return level;
} catch (IllegalArgumentException e) {
LogUtils.w(TAG, "日志级别参数非法:" + levelStr + ",使用默认级别" + DEFAULT_LOG_LEVEL, e);
LogUtils.d(TAG, "【函数返回】parseLogLevelArg(),参数非法返回默认级别:" + DEFAULT_LOG_LEVEL);
return DEFAULT_LOG_LEVEL;
}
}
/**
* 整合多来源服务器地址,优先级 启动参数 > INI配置 > 默认地址
* 新增:校验地址合法性,禁止以'-'开头
@@ -253,7 +206,7 @@ public class MainUtils {
}
return sb.toString();
}
/**
* 获取当前时间字符串格式yyyy-MM-dd HH:mm:ss
* 适配Java7
@@ -262,7 +215,7 @@ public class MainUtils {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(new Date());
}
// ========== 对外暴露方法 ==========
public static boolean isExit() {
return isExit;