feat: 日志级别控制更详细、新增实例信息回显.

This commit is contained in:
2024-06-15 10:32:41 +08:00
parent 5423fe32d4
commit 517a481280
6 changed files with 87 additions and 29 deletions

View File

@@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import com.serliunx.ddns.constant.InstanceSource; import com.serliunx.ddns.constant.InstanceSource;
import com.serliunx.ddns.constant.InstanceType; import com.serliunx.ddns.constant.InstanceType;
import com.serliunx.ddns.support.InstanceContextHolder;
import com.serliunx.ddns.support.NetworkContextHolder; import com.serliunx.ddns.support.NetworkContextHolder;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -22,6 +23,7 @@ import static com.serliunx.ddns.constant.SystemConstants.XML_ROOT_INSTANCE_NAME;
public abstract class AbstractInstance implements Instance { public abstract class AbstractInstance implements Instance {
private static final Logger log = LoggerFactory.getLogger(AbstractInstance.class); private static final Logger log = LoggerFactory.getLogger(AbstractInstance.class);
/** /**
* 实例名称 * 实例名称
* <li> 全局唯一 * <li> 全局唯一
@@ -69,20 +71,28 @@ public abstract class AbstractInstance implements Instance {
public void run() { public void run() {
if (isPause()) // 暂停态检查, 已暂停则不继续进行. if (isPause()) // 暂停态检查, 已暂停则不继续进行.
return; return;
// 设置实例信息
InstanceContextHolder.setInstance(this);
log.debug("正在尝试查询IP信息.");
value = query(); value = query();
final String ipAddress = NetworkContextHolder.getIpAddress(); final String ipAddress = NetworkContextHolder.getIpAddress();
try { try {
if (value != null && !value.isEmpty() if (value != null && !value.isEmpty()
&& ipAddress != null && !ipAddress.isEmpty()) { && ipAddress != null && !ipAddress.isEmpty()) {
if (value.equals(ipAddress)) if (value.equals(ipAddress)) {
log.debug("最新记录的IP与当前IP地址一致, 无需更新.");
return; return;
}
} }
log.debug("正在尝试将记录旧IP: {} 更新为: {}", value, ipAddress);
value = ipAddress; value = ipAddress;
run0(); run0();
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage()); log.error(e.getMessage());
} finally { } finally {
this.value = null; this.value = null;
// 移除实例信息
InstanceContextHolder.clear();
} }
} }

View File

@@ -100,7 +100,7 @@ public class AliyunInstance extends AbstractInstance {
.setEndpointOverride("alidns.cn-hangzhou.aliyuncs.com") .setEndpointOverride("alidns.cn-hangzhou.aliyuncs.com")
) )
.build(); .build();
debug("初始化完成."); log.debug("初始化完成.");
} }
@Override @Override
@@ -111,18 +111,18 @@ public class AliyunInstance extends AbstractInstance {
.type(recordType) .type(recordType)
.value(value) .value(value)
.build(); .build();
debug("正在更新解析记录."); log.debug("正在更新解析记录.");
CompletableFuture<UpdateDomainRecordResponse> requestResponse = client.updateDomainRecord(request); CompletableFuture<UpdateDomainRecordResponse> requestResponse = client.updateDomainRecord(request);
try { try {
requestResponse.whenComplete((v, t) -> { requestResponse.whenComplete((v, t) -> {
if (t != null) { //出现异常 if (t != null) { //出现异常
handleThrowable(t); log.error("出现异常 {}:", t.getCause(), t.getMessage());
} else { } else {
String result = null; String result = null;
try { try {
result = jsonMapper.writeValueAsString(v.getBody()); result = jsonMapper.writeValueAsString(v.getBody());
} catch (JsonProcessingException ignored) {} finally { } catch (JsonProcessingException ignored) {} finally {
debug("操作结束, 结果: {}", result == null ? v : result); log.debug("操作结束, 结果: {}", result == null ? v : result);
} }
} }
}); });
@@ -146,10 +146,10 @@ public class AliyunInstance extends AbstractInstance {
} }
return null; return null;
} catch (InterruptedException | ExecutionException e) { } catch (InterruptedException | ExecutionException e) {
error("出现了不应该出现的异常 => {}", e); log.error("出现了不应该出现的异常 => {}", e);
return null; return null;
} catch (TimeoutException e) { } catch (TimeoutException e) {
error("记录查询超时!"); log.error("记录查询超时!");
return null; return null;
} }
} }
@@ -235,23 +235,4 @@ public class AliyunInstance extends AbstractInstance {
", value='" + value + '\'' + ", value='" + value + '\'' +
'}'; '}';
} }
private void handleThrowable(Throwable t){
error("出现异常 {}:", t.getCause(), t.getMessage());
}
@SuppressWarnings("all")
private void log(String msg, Object...params) {
log.info("[实例活动][" + name + "]" + msg, params);
}
@SuppressWarnings("all")
private void debug(String msg, Object...params) {
log.debug("[实例活动][" + name + "]" + msg, params);
}
@SuppressWarnings("all")
private void error(String msg, Object...params) {
log.error("[实例异常][" + name + "]" + msg, params);
}
} }

View File

@@ -0,0 +1,39 @@
package com.serliunx.ddns.support;
import com.serliunx.ddns.core.instance.Instance;
/**
* 实例信息上下文
* @author <a href="mailto:serliunx@yeah.net">SerLiunx</a>
* @version 1.0.0
* @since 2024/6/15
*/
public final class InstanceContextHolder {
private static final ThreadLocal<Instance> INSTANCE_THREAD_LOCAL = new ThreadLocal<>();
private InstanceContextHolder() {throw new UnsupportedOperationException();}
/**
* 设置当前线程的实例信息
* @param instance 实例
*/
public static void setInstance(Instance instance) {
INSTANCE_THREAD_LOCAL.set(instance);
}
/**
* 获取当前线程的实例信息
* @return 实例信息
*/
public static Instance getInstance() {
return INSTANCE_THREAD_LOCAL.get();
}
/**
* 清除当前线程的实例信息
*/
public static void clear() {
INSTANCE_THREAD_LOCAL.remove();
}
}

View File

@@ -0,0 +1,23 @@
package com.serliunx.ddns.support.log;
import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import com.serliunx.ddns.core.instance.Instance;
import com.serliunx.ddns.support.InstanceContextHolder;
/**
* 获取当前任何线程的实例信息
* @author <a href="mailto:serliunx@yeah.net">SerLiunx</a>
* @version 1.0.0
* @since 2024/6/15
*/
public class InstanceNameConverter extends ClassicConverter {
@Override
public String convert(ILoggingEvent event) {
Instance instance = InstanceContextHolder.getInstance();
if (instance != null)
return instance.getName();
return "----";
}
}

View File

@@ -3,6 +3,8 @@ package com.serliunx.ddns.support.log;
import ch.qos.logback.classic.pattern.ClassicConverter; import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.ILoggingEvent;
import java.lang.management.ManagementFactory;
/** /**
* 日志变量%pid(进程id) 转换器 * 日志变量%pid(进程id) 转换器
* @author <a href="mailto:serliunx@yeah.net">SerLiunx</a> * @author <a href="mailto:serliunx@yeah.net">SerLiunx</a>
@@ -11,7 +13,7 @@ import ch.qos.logback.classic.spi.ILoggingEvent;
*/ */
public class ProcessIdConverter extends ClassicConverter { public class ProcessIdConverter extends ClassicConverter {
private static final String PROCESS_ID = java.lang.management.ManagementFactory.getRuntimeMXBean().getName().split("@")[0]; private static final String PROCESS_ID = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
@Override @Override
public String convert(ILoggingEvent iLoggingEvent) { public String convert(ILoggingEvent iLoggingEvent) {

View File

@@ -1,13 +1,16 @@
<configuration> <configuration>
<conversionRule conversionWord="pid" converterClass="com.serliunx.ddns.support.log.ProcessIdConverter"/> <conversionRule conversionWord="pid" converterClass="com.serliunx.ddns.support.log.ProcessIdConverter"/>
<conversionRule conversionWord="instance" converterClass="com.serliunx.ddns.support.log.InstanceNameConverter"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder> <encoder>
<pattern>%boldGreen(%d{yyyy年MM月dd日 HH:mm:ss(SSS)}) %cyan([%pid]) %magenta([%15.15thread]) %highlight([%-6level]) %boldYellow(%-45logger{32}): %highlight(%msg%n)</pattern> <pattern>
%boldGreen(%d{yyyy年MM月dd日 HH:mm:ss(SSS)}) %cyan([%pid]) %magenta([%15.15thread]) %yellow([%16.16instance]) %highlight([%-6level]) %boldYellow(%-36logger{32}): %msg%n
</pattern>
</encoder> </encoder>
</appender> </appender>
<logger name="com.serliunx.ddns" level="INFO"/> <logger name="com.serliunx.ddns" level="DEBUG"/>
<root level="INFO"> <root level="INFO">
<appender-ref ref="STDOUT" /> <appender-ref ref="STDOUT" />