Передача динамического имени файла журнала в log4j.properties в python - PullRequest
0 голосов
/ 16 марта 2019

Я могу найти ответ на этот вопрос в 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, но я не могу понять синтаксис, чтобы заставить код фактически распознавать мой параметр имени скрипта.

Я также пробовал $ {sys: scriptname} и $ {env: scriptname}, и они также не распознаются. Кажется, нет четкой документации о том, как переменные через все эти файлы передаются вместе, и я был бы признателен за помощь в понимании этого.

1 Ответ

0 голосов
/ 16 марта 2019

Переменные ${...} в файле log4j.properties раскрываются с помощью системных свойств Java.

Так что, если в вашем файле log4j.properties у вас есть

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

, вам следуетбыть в состоянии предоставить значение для scriptname, используя

f'-Dscriptname={scriptname}'
...