当前位置: 首页 > 知识库问答 >
问题:

添加一个钩子到哨兵Logback擦洗数据

弘康安
2023-03-14

我正在使用LogbackSDK for Java向Sentry发送事件,如文档中所述。

片段:

<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。哨兵。向后退。SentryAppender编码器组合使用时,不知何故无法做到这一点。filter属性和dsn属性一样工作,所以我在Sentry中得到了错误,但在自定义解析中没有。

我用于io.sentry.sentry-logback(和传递的哨兵)的版本是1.7.24

然后,在发送之前,我阅读了Sentry docs中的hook,这是我想要控制发送给Sentry的数据的内容,我必须升级到最新版本,即3.1。3在撰写本文时。

Logback XML配置稍有更改:

<appender name="SENTRY" class="io.sentry.logback.SentryAppender">
    <options>
        <dsn>...</dsn>
        <beforeSend>????</beforeSend>
    </options>
    ...
</appender>

从我所能看到的pre-mail钩子正是我需要在需要时擦洗数据的地方,因为我不希望一些信息被发送到Sentry. docs

现在,第二个问题是,我不知道如何在这里引用一个方法。在Java配置中,有一个接受事件并可以更改它的双函数。但是我想把这个钩子应用到我所有的日志事件中,这就是为什么只在LogbackSDK中配置它的原因。例如,在SpringBoot中,有一个用于Sentry的启动器,当然还有一个bean,您可以在自动配置中注入该bean。但是,我使用的Scala没有Spring靴。

此外,该项目已经在prod中,所以我不能改变很多东西,我正在寻找最小的一个,它将允许我添加一个钩子到Logback的sdkforsentry。

这是附录,看起来(我不确定它是如何工作的)选项可以从XML中填充,并传递到init,这将考虑到所有这些选项,包括我的发送前钩子。

我不知道标题中是否有两个问题和一个引用,但我没有找到更好的方法来问/解释这个问题,因为一件事会导致另一件事。

总结问题:

  1. 为什么自定义规则不适用于Logback Sentry的appender
  2. 我怎样才能让appender知道我的钩子并使用它

提前谢谢!


共有1个答案

詹唯
2023-03-14

您可以在logback中独立于appender配置配置Sentry。xml。例如:

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 repo中的完整代码示例:https://github.com/maciej-scratches/sentry-logback-custom-config

 类似资料:
  • 主要内容:一、哨兵,二、源码分析,三、总结一、哨兵 Sentinel(哨兵),听名字大家都应该想得到这个家伙是做什么的。在redis的应用中,有单机模式、主从模式、哨兵模式和集群模式,其实你从它的发展就可以看出来,redis是从一个简单的应用开始,不断的壮大,从单点到分布式,从简单的主从备份以及初始的哨兵监控,再到可以看成把二者合成的集群模式,除了是应用场景的变化,更多的是为了提高安全性和高可用性。网上有很多人问哨兵和集群有啥不一样,其实

  • 我一直在读有关Redis sentinel用于故障转移的文章。我计划有1主+1从,如果主倒下超过1分钟,把从变成主。我知道这在哨兵身上是百分之百可能的。 null 与1个哨兵相比,多个哨兵有什么好处?我的应用程序一次只能连接到1个哨兵,即使有2个哨兵,如果其中一个在应用程序层中出现复杂的逻辑,我的应用程序也不能在其中任何一个之间旋转或切换。

  • 添加插件钩子有两种方法 添加执行多次的插件钩子 hook($hook, &$params = null, $extra = null) 功能 添加执行多次的插件钩子 参数 $hook: string 钩子名称 $params: boolean 传入参数 $extra: boolean 额外参数 返回 string 插件执行结果 添加只执行一次的插件钩子 hook_one($hook, &$par

  • X1.4.0新增 hook($hook,$param) 功能: 添加钩子 参数: $hook:钩子名称 $param:传入参数,默认为空数组 返回: 无 模板使用: {:hook('footer')} {:hook('sider',array('text'=>'hello ThinkCMF')} 控制器方法里使用: //不带参数 hook('your_hook_name'); //带参数 h

  • Redis 哨兵(Sentinel)是 Redis 的高可用性(Hight Availability)解决方案:由一个或多个 Sentinel 实例组成的 Sentinel 系统可以监视任意多个主服务器,以及这些主服务器的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。 Sentinel

  • 添加插件钩子有两种方法 添加执行多次的插件钩子 hook($hook, $params = null) 功能 添加执行多次的插件钩子 参数 $hook: string 钩子名称 $params: boolean 传入参数 返回 string 插件执行结果 添加只执行一次的插件钩子 hook_one($hook, $params = null) 功能 添加只执行一次的插件钩子 参数 $hook: