[英]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
設置一部分的服務我將在這里只描述前兩種情況,因為其他類型的部署的策略是相同的,並且應該查閱相應工具的文檔以了解如何將環境變量注入容器。
如果您從命令行(或通過腳本)運行單個 Docker 容器,則只需將以下內容添加到docker run
命令( 文檔):
docker run ... -e SENTRY_ENVIRONMENT="<your-env>" ...
...或在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.