log4j2.properties 无法从 Docker 环境或 Kubernetes 环境中读取变量
log4j2.properties cannot read variables from Docker Environment or Kubernetes Env
在 Spring 使用 Log4J2 引导 2.6.0。我想使用从外部到 log4j.propeties 的环境变量
但它总是使用本地 application.propeties
文件而不是真正的 docker 或 Kubernetes 环境变量
文件application.properties
spring.application.name=myapp
#Logger FilePath
log.file.path=logs/dev/my-app
Docker 作曲家文件
version: "3"
services:
spring-app-log4j2:
build: ./log4j2
ports:
- "8080:80"
environment:
- SERVER_PORT=80
- LOG_FILE_PATH=logs/prod/my-app
文件log4j2.properties
name=config
#Read Properties values from application properties
property.filename = ${bundle:application:log.file.path}
property.layoutPattern = %d{MMM dd yyyy HH:mm:ss.SSS z} | ${hostName} | %-5p | %c{1}:%L | %M() - %m%n
appenders=console, rolling
#log to console
appender.console.type=Console
appender.console.name=STDOUT
appender.console.layout.type=PatternLayout
appender.console.layout.pattern=${layoutPattern}
#log to file and daily rolling
appender.rolling.type = RollingFile
appender.rolling.name = roll
appender.rolling.fileName = ${filename}.log
appender.rolling.filePattern = ${filename}.%d{dd-MMM-yyyy}.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = ${layoutPattern}
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 2
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=100MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 5
loggers = rolling
logger.rolling.name = org.apache.logging.log4j.core.appender.rolling
logger.rolling.level = info
logger.rolling.additivity = true
logger.rolling.appenderRefs = rolling
logger.rolling.appenderRef.rolling.ref = roll
rootLogger.level=info
rootLogger.appenderRefs=stdout,rolling
rootLogger.appenderRef.stdout.ref=STDOUT
rootLogger.appenderRef.rolling.ref = roll
已尝试输出
property.filename = ${bundle:application:logpath} #Output - logs/dev/app
#(Taking values from application Properties only, not taking from Docker pod environment varibales)
property.filename = ${sys:logpath} #Output - ${sys:logpath}
property.filename = ${env:logpath} # Not Working #Output - ${env:logpath}
#use filename variable
appender.rolling.fileName = ${filename}.log
在Java代码内打印时
@Value("${logpath}") String logpath; #Output -logs/prod/app
# Working with Docker env
问题:当 log4j 启动时,它没有从环境中找到文件路径,因此默认情况下从 application.propeties
读取
如何从 Docker 环境或 Kubernetes 环境中读取数据
我需要的日志文件应该是“logs/prod/my-app”而不是“logs/dev/my-app”
在您的所有尝试中,您都使用了 filename
属性 的单一来源。您需要使用变量替换的 fallback 功能之一:
您可以使用语法 ${variable:-default}
:
将默认值添加到变量替换中
property.filename = ${env:LOG_FILE_PATH:-${bundle:application:log.file.path}}
appender.rolling.fileName = ${filename}.log
或者您可以利用每个 ${prefix:variable}
回落到 ${variable}
:
的事实
property.LOG_FILE_PATH = ${bundle:application:log.file.path}
appender.rolling.fileName = ${env:LOG_FILE_PATH}
在 Spring 使用 Log4J2 引导 2.6.0。我想使用从外部到 log4j.propeties 的环境变量
但它总是使用本地 application.propeties
文件而不是真正的 docker 或 Kubernetes 环境变量
文件application.properties
spring.application.name=myapp
#Logger FilePath
log.file.path=logs/dev/my-app
Docker 作曲家文件
version: "3"
services:
spring-app-log4j2:
build: ./log4j2
ports:
- "8080:80"
environment:
- SERVER_PORT=80
- LOG_FILE_PATH=logs/prod/my-app
文件log4j2.properties
name=config
#Read Properties values from application properties
property.filename = ${bundle:application:log.file.path}
property.layoutPattern = %d{MMM dd yyyy HH:mm:ss.SSS z} | ${hostName} | %-5p | %c{1}:%L | %M() - %m%n
appenders=console, rolling
#log to console
appender.console.type=Console
appender.console.name=STDOUT
appender.console.layout.type=PatternLayout
appender.console.layout.pattern=${layoutPattern}
#log to file and daily rolling
appender.rolling.type = RollingFile
appender.rolling.name = roll
appender.rolling.fileName = ${filename}.log
appender.rolling.filePattern = ${filename}.%d{dd-MMM-yyyy}.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = ${layoutPattern}
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 2
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=100MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 5
loggers = rolling
logger.rolling.name = org.apache.logging.log4j.core.appender.rolling
logger.rolling.level = info
logger.rolling.additivity = true
logger.rolling.appenderRefs = rolling
logger.rolling.appenderRef.rolling.ref = roll
rootLogger.level=info
rootLogger.appenderRefs=stdout,rolling
rootLogger.appenderRef.stdout.ref=STDOUT
rootLogger.appenderRef.rolling.ref = roll
已尝试输出
property.filename = ${bundle:application:logpath} #Output - logs/dev/app
#(Taking values from application Properties only, not taking from Docker pod environment varibales)
property.filename = ${sys:logpath} #Output - ${sys:logpath}
property.filename = ${env:logpath} # Not Working #Output - ${env:logpath}
#use filename variable
appender.rolling.fileName = ${filename}.log
在Java代码内打印时
@Value("${logpath}") String logpath; #Output -logs/prod/app
# Working with Docker env
问题:当 log4j 启动时,它没有从环境中找到文件路径,因此默认情况下从 application.propeties
读取如何从 Docker 环境或 Kubernetes 环境中读取数据
我需要的日志文件应该是“logs/prod/my-app”而不是“logs/dev/my-app”
在您的所有尝试中,您都使用了 filename
属性 的单一来源。您需要使用变量替换的 fallback 功能之一:
您可以使用语法
将默认值添加到变量替换中${variable:-default}
:property.filename = ${env:LOG_FILE_PATH:-${bundle:application:log.file.path}} appender.rolling.fileName = ${filename}.log
或者您可以利用每个
的事实${prefix:variable}
回落到${variable}
:property.LOG_FILE_PATH = ${bundle:application:log.file.path} appender.rolling.fileName = ${env:LOG_FILE_PATH}