我可以在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},但这些也无法识别。关于如何将所有这些文件中的变量一起传递的文件,似乎尚无明确的文档,我很高兴能帮助您理解这一点。
答案 0 :(得分:0)
使用Java系统属性扩展${...}
文件中的log4j.properties
变量。
因此,如果您在log4j.properties
文件中拥有
log4j.appender.LOGFILE.File=log/${scriptname}.log
您应该能够使用{p>为scriptname
提供一个值
f'-Dscriptname={scriptname}'