0時に寝て4時に起きて6時に起きた。
spring のプロファイル設定
spring の Profiles の仕組みを使って環境ごとの設定を作る。デプロイは k8s で管理しているため、spring boot の Externalized Configuration の仕組みを使って、環境変数から application.yml に定義された設定を書き換える。k8s は kustomize で管理していて prod, test, dev の3つの環境で任意の設定を記述できる。
問題はログ出力の設定を環境ごとに変えたい。具体的には datadog に連携されるログは構造化ログ (json lines) を、ローカルの開発ではコンソールログをみたい。Log4j Spring Boot Support によると、1つの設定ファイルに複数のプロファイル設定を記述できるようにもみえるけど、実際にやってみたらうまく動かなかった。xml ではなく yml を使っているせいかもしれないし、私の記述方法が誤っているのかもしれない。いずれにしても yml で複数のプロファイルを設定しているサンプルをみつけられなかった。
そこで Different Log4j2 Configurations per Spring Profile をみて、環境ごとにログ設定ファイルも分割することにした。application.yml には次のように記述する。
spring:
profiles:
active: dev
logging:
config: classpath:log4j2-${spring.profiles.active}.yml
ローカル開発向けの lgo4j2-dev.yml は次のようになる。
Configuration:
status: warn
name: YAMLConfig
appenders:
Console:
name: STDOUT
target: SYSTEM_OUT
PatternLayout:
Pattern: "%d{yyyy-MM-dd HH:mm:ss.SSS}[%t]%-5level %logger{36} - %msg%n"
k8s のマニフェストで環境変数を次のように定義すれば prod というプロファイルが設定される。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-service
spec:
template:
spec:
containers:
- name: my-service
env:
- name: spring.profiles.active
value: "prod"
クラウド環境向けの log4j2-prod.yml は次のようになる。
Configuration:
status: warn
name: YAMLConfig
appenders:
Console:
name: STDOUT
target: SYSTEM_OUT
EcsLayout:
serviceName: my-service
serviceNodeName: null
includeMarkers: true
KeyValuePair:
- key: type
value: app