将动态日志文件名传递给 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}'
我可以在 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}'