将动态日志文件名传递给 python 中的 log4j.properties

Passing dynamic log file name to log4j.properties in python

我可以在 Java 中找到这个问题的答案,但到目前为止我还没有看到 Python 解决方案,所以我发布了这个问题。

在我的 log4j.properties 中,我有:

log4j.rootLogger=WARN,LOGFILE
log4j.appender.LOGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.LOGFILE.File=log/${scriptname}.log
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.Append=false
log4j.appender.LOGFILE.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n

在我的 script.py 中,我调用了一个启动 spark 的方法:

spark_submit(yarn_pool, os.path.basename(__file__))

这里定义的是:

def spark_submit(yarn_pool, scriptname):
   spark_submit_command = 'spark2-submit'
   ret_code = subprocess.call([
        spark_submit_command,
        '--master', 'yarn',
        '--queue', yarn_pool,
        '--executor-memory', '16g',
        '--driver-java-options', f'-Dlog4j.debug=true -Dlogfile.name={scriptname}'

在 script.py 后期,我尝试记录:

conf = SparkConf()
conf.setAppName("My App")
spark = SparkContext(conf=conf)

log4jLogger = spark._jvm.org.apache.log4j
LOGGER = log4jLogger.LogManager.getLogger("root.logger")
LOGGER.warn("Starting App")

我试图找到一种方法将脚本的文件名传递给 spark_submit 方法,然后传递给 log4j.properties,但我无法弄清楚获取代码的语法实际上识别我的 scriptname 参数。

我也尝试了 ${sys:scriptname} 和 ${env:scriptname},但它们也无法识别。似乎没有关于如何通过所有这些文件一起传递变量的明确文档,我很感激帮助理解这一点。

log4j.properties 文件中的 ${...} 变量使用 Java 系统属性展开。

因此,如果在您的 log4j.properties 文件中,您有

log4j.appender.LOGFILE.File=log/${scriptname}.log

您应该能够使用

scriptname 提供一个值
f'-Dscriptname={scriptname}'