【问题标题】:Setting environment variables of Sentry dynamically for logback.xml Sentry appender为 logback.xml Sentry appender 动态设置 Sentry 的环境变量
【发布时间】:2020-04-19 22:51:06
【问题描述】:

我的应用程序正在使用 slf4j,当然,我有一个 logback.xml 文件。我尝试向这个文件添加一个哨兵附加程序。这是我的 logback.xml 文件。

<appender name="CONSOLE-INFO" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <target>System.out</target>
        <encoder>
            <pattern>%d %p %c{1.} %m%n</pattern>
        </encoder>
    </appender>
    <appender name="CONSOLE-ERROR" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <target>System.error</target>
        <encoder>
            <pattern>%d %p %c{1.} %m%n%ex{100}</pattern>
        </encoder>
    </appender>
    <appender name="SENTRY" class="io.sentry.logback.SentryAppender">
        <dsn>
            https://...Sentry dsn
        </dsn>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>%d %p %c{1.} %m%n%ex{100}</pattern>
        </encoder>
    </appender>
    <logger name="kafkaOrderLogger" level="info" additivity="false">
        <appender-ref ref="CONSOLE-INFO"/>
    </logger>
    <logger name="kafkaOrderErrorLogger" level="error" additivity="false">
        <appender-ref ref="CONSOLE-ERROR"/>
    </logger>
    <logger>
        <appender-ref ref="SENTRY"/>
    </logger>

    <root level="info">
        <appender-ref ref="CONSOLE-INFO"/>
        <appender-ref ref="CONSOLE-ERROR"/>
        <appender-ref ref="SENTRY"/>
    </root>

我的应用在部署之前已被 docker 化,并且作为我们 ci/cd 的一部分,它部署在三个不同的环境中,即暂存环境和生产环境。 问题是我只能通过应用程序根目录的属性文件来提供变量。这个属性文件将根据部署环境填充值这意味着我不能在资源文件夹中有一个自动填充的 sentry.properties。我想要的是设置 Sentry 环境,最好不要像 slf4j appenders 一样触及代码。

【问题讨论】:

标签: java logback slf4j sentry


【解决方案1】:

我们使用由 sentry logback 集成自动导入的环境(shell)变量。

SENTRY_DSN=https://xxxxxxxx@sentry.io/xxxxxx
SENTRY_TAGS=app:MyApplication,host:$HOSTNAME,project:${CI_PROJECT_NAME},branch:${CI_COMMIT_REF_NAME}
SENTRY_ENVIRONMENT=${CI_COMMIT_REF_NAME}

但是有一个很大的警告,它们没有被插值。

即使这些变量有值也会发生这种情况,但它不会被替换。

$HOSTNAME${CI_COMMIT_REF_NAME} 都不会被解析。它将导致刚刚逐字添加的字符串并发送到哨兵,如屏幕截图所示:

【讨论】:

    【解决方案2】:

    在运行应用程序时(无论是Java、Node、Python还是使用任何其他官方支持的Sentry SDK),环境变量应该由部署提供,而不是docker镜像或打包的应用程序( jar 文件,...)。

    它们的具体放置位置取决于您实际运行 Docker 容器的方式:

    • 在某些主机上纯 docker run
    • 作为docker-compose 设置一部分的服务
    • 在 Kubernetes 部署中
    • ...

    我将在这里只描述前两种情况,因为其他类型的部署的策略是相同的,并且应该查阅相应工具的文档以了解如何将环境变量注入容器。

    码头工人

    如果您从命令行(或通过脚本)运行单个 Docker 容器,则只需将以下内容添加到 docker run 命令 (documentation):

    docker run ... -e SENTRY_ENVIRONMENT="<your-env>" ...
    

    码头工人撰写

    ...或在docker-compose.yml (documentation) 内:

    ...
    services:
      my-service:
        ...
        environment:
          SENTRY_ENVIRONMENT: "<your-env>"
    

    docker-compose 设置还支持一个名为.env 的文件,可用于从外部设置变量并使用variable substitution

    因此,您可以在 docker-compose.yml 中使用以下内容:

    ...
    services:
      my-service:
        ...
        environment:
          SENTRY_ENVIRONMENT: "${MYENV}"
    

    ...在您的.env 文件中:

    MYENV=development
    

    当然,您也可以在 CI/CD 链中生成一个包含环境变量的文件,并将该文件部署到您的应用程序中,然后使用docker run --env-file myapp.env ... 或以下docker-compose 配置:

    ...
    services:
      my-service:
        ...
        env_file:
          - myapp.env
    

    【讨论】:

      猜你喜欢
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 2020-01-01
      • 2019-09-07
      • 1970-01-01
      • 2017-03-13
      相关资源
      最近更新 更多