给 Sentry Logback 添加一个钩子来清理数据
Add a hook to Sentry Logback to scrub data
我正在使用 Java 的 Logback SDK 将事件发送到 Sentry,如 documentation 中所述。
片段:
<conversionRule conversionWord="CUSTOM_CONVERSION_RULE"
converterClass="clazz..." />
...
<property scope="context" name="myEnc" value="%d{ISO8601,UTC} | %-5level | %-50thread | %-55logger{55} | %CUSTOM_CONVERSION_RULE" />
...
<appender name="SENTRY" class="io.sentry.logback.SentryAppender">
<dsn>...</dsn>
<encoder>${myEnc}</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
....
最初的问题是发送到 Sentry 的事件没有按照我的自定义转换规则进行转换。使用包含转换规则的 属性 myEnc
的所有其他附加程序(例如 Console)按预期解析数据。但似乎 io.sentry.logback.SentryAppender
与 encoder
结合使用不知何故无法做到这一点。过滤器 属性 和 dsn 一样工作,所以我在 Sentry 中得到了错误,但在我的自定义解析中却没有。
我用于 io.sentry.sentry-logback
(以及传递 sentry
)的版本是 1.7.24
。
然后我从 Sentry 文档中阅读了 before-send
钩子,这是我想控制将哪些数据发送到 Sentry 的东西,我不得不升级到最新版本,当时是 3.1.3
写这个。
Logback XML 配置稍作更改:
<appender name="SENTRY" class="io.sentry.logback.SentryAppender">
<options>
<dsn>...</dsn>
<beforeSend>????</beforeSend>
</options>
...
</appender>
据我所知,before-send
挂钩正是我在需要时擦除数据所需要的,因为我不想将某些信息发送到 Sentry。 docs
现在,第二个问题是我不知道如何在这里引用一个方法。在 Java 配置中有一个 BiFunction 接受事件并可以改变它。但是我想将这个钩子应用到我所有的日志事件,这就是为什么它唯一配置的地方是在 Logback SDK 中。
例如,在 Spring Boot 中有一个用于 Sentry 的启动器,当然还有一个可以在 auto-configuration 中注入的 bean。
但是,我使用的是没有 Spring Boot.
的 Scala
此外,该项目已经投入生产,所以我不能更改很多东西,我正在寻找最小的一个,它允许我为 Sentry 的 Logback SDK 添加一个挂钩。
这是 appender 看起来(我不确定它是如何工作的)options
可以从 XML 填充然后传递给 init
这将考虑所有这些因素,包括我的发送前钩子。
我不知道是否可以接受有两个问题并且标题中只提到一个问题,但我没有找到更好的方法来 ask/explain 这个问题,因为一件事导致另一件事。
总结问题:
- 为什么该自定义规则不适用于 Logback Sentry 的附加程序。
- 如何让appender知道我的钩子并使用它。
提前致谢!
您可以在 logback.xml
中独立于 appender 配置来配置 Sentry。例如:
public class Main {
private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
static {
Sentry.init(options -> {
options.setDsn("PUT YOUR DSN HERE");
options.setBeforeSend((sentryEvent, o) -> {
sentryEvent.setTag("custom", "tag");
return sentryEvent;
});
});
}
public static void main(String[] args) {
LOGGER.error("oops");
}
}
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="sentry" class="io.sentry.logback.SentryAppender" />
<root level="debug">
<appender-ref ref="console"/>
<appender-ref ref="sentry"/>
</root>
</configuration>
检查 github 存储库中的完整代码示例:https://github.com/maciej-scratches/sentry-logback-custom-config
我正在使用 Java 的 Logback SDK 将事件发送到 Sentry,如 documentation 中所述。
片段:
<conversionRule conversionWord="CUSTOM_CONVERSION_RULE"
converterClass="clazz..." />
...
<property scope="context" name="myEnc" value="%d{ISO8601,UTC} | %-5level | %-50thread | %-55logger{55} | %CUSTOM_CONVERSION_RULE" />
...
<appender name="SENTRY" class="io.sentry.logback.SentryAppender">
<dsn>...</dsn>
<encoder>${myEnc}</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
....
最初的问题是发送到 Sentry 的事件没有按照我的自定义转换规则进行转换。使用包含转换规则的 属性 myEnc
的所有其他附加程序(例如 Console)按预期解析数据。但似乎 io.sentry.logback.SentryAppender
与 encoder
结合使用不知何故无法做到这一点。过滤器 属性 和 dsn 一样工作,所以我在 Sentry 中得到了错误,但在我的自定义解析中却没有。
我用于 io.sentry.sentry-logback
(以及传递 sentry
)的版本是 1.7.24
。
然后我从 Sentry 文档中阅读了 before-send
钩子,这是我想控制将哪些数据发送到 Sentry 的东西,我不得不升级到最新版本,当时是 3.1.3
写这个。
Logback XML 配置稍作更改:
<appender name="SENTRY" class="io.sentry.logback.SentryAppender">
<options>
<dsn>...</dsn>
<beforeSend>????</beforeSend>
</options>
...
</appender>
据我所知,before-send
挂钩正是我在需要时擦除数据所需要的,因为我不想将某些信息发送到 Sentry。 docs
现在,第二个问题是我不知道如何在这里引用一个方法。在 Java 配置中有一个 BiFunction 接受事件并可以改变它。但是我想将这个钩子应用到我所有的日志事件,这就是为什么它唯一配置的地方是在 Logback SDK 中。 例如,在 Spring Boot 中有一个用于 Sentry 的启动器,当然还有一个可以在 auto-configuration 中注入的 bean。 但是,我使用的是没有 Spring Boot.
的 Scala此外,该项目已经投入生产,所以我不能更改很多东西,我正在寻找最小的一个,它允许我为 Sentry 的 Logback SDK 添加一个挂钩。
这是 appender 看起来(我不确定它是如何工作的)options
可以从 XML 填充然后传递给 init
这将考虑所有这些因素,包括我的发送前钩子。
我不知道是否可以接受有两个问题并且标题中只提到一个问题,但我没有找到更好的方法来 ask/explain 这个问题,因为一件事导致另一件事。
总结问题:
- 为什么该自定义规则不适用于 Logback Sentry 的附加程序。
- 如何让appender知道我的钩子并使用它。
提前致谢!
您可以在 logback.xml
中独立于 appender 配置来配置 Sentry。例如:
public class Main {
private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
static {
Sentry.init(options -> {
options.setDsn("PUT YOUR DSN HERE");
options.setBeforeSend((sentryEvent, o) -> {
sentryEvent.setTag("custom", "tag");
return sentryEvent;
});
});
}
public static void main(String[] args) {
LOGGER.error("oops");
}
}
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="sentry" class="io.sentry.logback.SentryAppender" />
<root level="debug">
<appender-ref ref="console"/>
<appender-ref ref="sentry"/>
</root>
</configuration>
检查 github 存储库中的完整代码示例:https://github.com/maciej-scratches/sentry-logback-custom-config