在python

时间:2019-03-15 23:08:04

标签: python variables logging log4j logfile

我可以在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},但这些也无法识别。关于如何将所有这些文件中的变量一起传递的文件,似乎尚无明确的文档,我很高兴能帮助您理解这一点。

1 个答案:

答案 0 :(得分:0)

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

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

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

您应该能够使用{p>为scriptname提供一个值

f'-Dscriptname={scriptname}'