自定义记录器
自定义记录器
本主题描述如何定制有关来自云眼特性标帜(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>
The preceding example pipes all debug logs to error messages. These are then sent to a different log appender.
You can also set logging levels for any Eyeofcloud package, giving you control over logs granularity. In the following example, we simply set the log level for the highest-level package, com.eyeofcloud:
logback.xml
<logger name="com.eyeofcloud" level="debug" />
Finally, the following general example show you how to write a custom appender rather than using one of the many default appenders:
LogAppender example
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; } }
Log levels
The table below lists the log levels for the Java SDK.
Log Level
Explanation
ERROR
Events that prevent feature flags from functioning correctly (for example, invalid datafile in initialization and invalid feature keys) are logged. The user can take action to correct.
WARNING
Events that do not prevent feature flags from functioning correctly, but can have unexpected outcomes (for example, future API deprecation, logger or error handler are not set properly, and nil values from getters) are logged.
INFO
Events of significance (for example, decision started, decision succeeded, tracking started, and tracking succeeded) are logged. This is helpful in showing the lifecycle of an API call.
DEBUG
Any information related to errors that can help us debug the issue (for example, the feature flag is not running user is not included in the rollout) are logged.