自定义记录器
2023年11月5日大约 3 分钟
自定义记录器
本主题描述如何定制有关来自云眼灰度标帜(Feature Flag)AB实验 Java SDK 的实验的日志信息,以帮助进行调试。
记录器记录有关实验的信息,以帮助你进行调试。可以自定义日志信息的发送位置以及跟踪的信息类型。
在 Java SDK 中,缺省情况下不启用日志记录功能。为了改善设置 SDK 和配置生产环境的体验,我们建议在依赖项中包含 SLF4J 实现。对于Java SDK,我们需要使用SLF4J实现。
为了改善您设置 SDK 和配置生产环境的体验,我们建议为 Eyeofcloud 客户端传入记录器。请参阅下面的代码示例。
❗️
警告
由于最近宣布的 Log4J 库中存在安全漏洞,如果与 SDK 一起使用,我们建议尽快升级到变体 2.15.0 或更高版本。查看 Apache 关于 Log4j 漏洞的文档以获取更多信息。
build.gradle
// Provide a SLF4j binding like logback or log4j
compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.25'
compile group: 'log4j', name: 'log4j', version: '2.15.0'
slf4j.properties
//For formatting: under slf4j.properties
# Root logger option
log4j.rootLogger=DEBUG, stdout
# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d {yyyy-MM-dd HH:mm:ss} %-5p %c {1} :%L - %m%n
为了更好地控制日志记录,例如控制每个包的日志记录级别或控制日志记录目标,我们建议使用日志。
build.gradle
implementation 'ch.qos.logback:logback-classic:1.1.7'
将 logback.xml 文件保存在资源目录中。下面是捕获云眼灰度标帜(Feature Flag)AB实验日志级别并将其管道传输到其他位置的简单示例。
登录.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>
%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<appender name="MEMORY" class="com.eyeofcloud.intellij.plugin.utils.LogAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>
%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<logger name="com.eyeofcloud" level="debug" additivity="false">
<appender-ref ref="MEMORY"/>
</logger>
<root level="error">
<appender-ref ref="CONSOLE"/>
</root>
前面的示例将所有调试日志管道到错误消息。然后将这些消息发送到不同的日志附加程序。
你也可以为任何 Eyeofcloud 包设置日志级别,从而控制日志的粒度。在以下示例中,我们仅为最高级别的包 com.eyeofcloud 设置了日志级别:
logback.xml
<logger name="com.eyeofcloud" level="debug" />
最后,以下通用示例将向您展示如何编写自定义appender,而不是使用许多默认appender之一:
LogAppender 示例
public class LogAppender extends AppenderBase<ILoggingEvent> {
int counter = 0;
public static AtomicBoolean captureLogging = new AtomicBoolean(false);
public static List<String> logs = Collections.synchronizedList(new ArrayList<String>());
PatternLayoutEncoder encoder;
@Override
public void start() {
if (this.encoder == null) {
addError("No encoder set for the appender named [" + name + "].");
return;
}
try {
encoder.init(System.out);
} catch (IOException e) {
}
super.start();
}
public static void clearLogs() {
synchronized (logs) {
logs.clear();
}
}
public void append(ILoggingEvent event) {
// Output the events as formatted by our layout
try {
this.encoder.doEncode(event);
if (captureLogging.get()) {
synchronized (logs) {
logs.add(event.getFormattedMessage());
}
}
} catch (IOException e) {
}
// Prepare for next event
counter++;
}
public PatternLayoutEncoder getEncoder() {
return encoder;
}
public void setEncoder(PatternLayoutEncoder encoder) {
this.encoder = encoder;
}
}
日志级别
下表列出了安卓 SDK 的日志级别。
日志级别 | 解释 |
---|---|
error | 记录阻止灰度标帜正常运行的事件(例如,初始化中的无效数据文件和无效的功能密钥)。用户可以采取措施进行更正。 |
warn | 不会阻止灰度标帜正常运行但可能会产生意外结果(例如,将来的 API 弃用、记录器或错误处理程序设置不正确,以及来自 getter 的 nil 值)的事件将被记录下来。 |
info | 记录重要事件(例如,决策已启动、决策成功、跟踪已启动和跟踪成功)。这有助于显示 API 调用的生命周期。 |
debug | 将记录与可帮助我们调试问题的错误相关的任何信息(例如,灰度标帜未运行、用户未包含在推出中)。 |