给 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.SentryAppenderencoder 结合使用不知何故无法做到这一点。过滤器 属性 和 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 这个问题,因为一件事导致另一件事。

总结问题:

  1. 为什么该自定义规则不适用于 Logback Sentry 的附加程序。
  2. 如何让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