簡體   English   中英

為 logback.xml Sentry appender 動態設置 Sentry 的環境變量

[英]Setting environment variables of Sentry dynamically for logback.xml Sentry appender

我的應用程序正在使用 slf4j,當然,我有一個 logback.xml 文件。 我嘗試向此文件添加 Sentry 附加程序。 這是我的 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>

我的應用程序在部署之前進行了 dockerized,作為我們 ci/cd 的一部分,它部署在三個不同的環境中,暫存預生產和生產環境。 問題是我只能通過應用程序根目錄下的屬性文件提供變量。 該屬性文件將填充基於部署環境的值,這意味着我不能在資源文件夾中自動填充 sentry.properties。 我想要的是設置 Sentry 環境,並且最好不要像 slf4j appender 那樣觸及代碼。

我們使用由 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}都不會被解析。 它將導致字符串剛剛逐字添加並發送到哨兵,如屏幕截圖所示:

輸出結果

在運行應用程序時(無論是 Java、Node、Python 還是使用任何其他官方支持的 Sentry SDK),環境變量應該由部署提供,而不是 docker 鏡像或打包的應用程序(jar 文件、 ……)。

將它們放在哪里取決於您實際運行 Docker 容器的方式:

  • 在某些主機上docker run普通docker run
  • 作為docker-compose設置一部分的服務
  • 在 Kubernetes 部署中
  • ...

我將在這里只描述前兩種情況,因為其他類型的部署的策略是相同的,並且應該查閱相應工具的文檔以了解如何將環境變量注入容器。

碼頭工人

如果您從命令行(或通過腳本)運行單個 Docker 容器,則只需將以下內容添加到docker run命令( 文檔):

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

docker-compose

...或在docker-compose.yml文檔)中:

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

.env -compose 設置還支持一個名為.env的文件,該文件可用於從外部設置變量並使用變量替換

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

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

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

MYENV=development

當然,您也可以在 CI/CD 鏈中生成一個包含環境變量的文件,並將該文件與您的應用程序一起部署,然后您可以使用docker run --env-file myapp.env ...或以下docker run --env-file myapp.env ... docker-compose配置:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM