应用日志配置模块调试完成。
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
// 环境信息打印 + 工具类初始化
|
||||
|
||||
@@ -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;
|
||||
|
||||
// 参数存储Map:key=参数名,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;
|
||||
|
||||
Reference in New Issue
Block a user