我有一些像这样的python:
def foo():
logger = logging.getLogger()
# do something here
logger.debug('blah blah {}'.format(expensive_func()))
foo()
Run Code Online (Sandbox Code Playgroud)
where expensive_func()是一个返回字符串的函数,执行起来很昂贵.
在开发时,日志级别设置为DEBUG,并且expensive_func()执行,消息被记录,一切都很好.
问题是,当我将日志级别设置为严格大于DEBUG(例如WARNING)时,在生产环境中,显然返回值expensive_func()不会被记录,但昂贵的函数本身仍将被执行.
我的问题是:当日志记录级别为WARNING时,如何防止python出现昂贵的函数?
我不想删除该调试行或添加像if level > DEBUG: return昂贵的功能.
谢谢.
编辑
我刚刚访问了懒惰记录器消息字符串评估,但不满意,主要是因为:
class Lazy:
def __init__(self, func, *a, **ka):
self.func= func
self.a = a
self.ka= ka
def __str__(self):
return str(self.func(*self.a, **self.ka))
# Though this is ugly, it works
logger.debug('Message: %s', Lazy(expensive_func))
# What if I wanted to do this?
# logger.debug('Message: {}'.format(expf_1(expf_2(some_arg))))
# Maybe …Run Code Online (Sandbox Code Playgroud) 我正在UDF中调用API,并尝试将输出记录到Logger中,并出现序列化错误。
以下是我的Logger初始化代码:
log4jLogger = spark._jvm.org.apache.log4j
LOGGER = log4jLogger.LogManager.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)
在我的UDF中,我正在使用
LOGGER.info("Message")
Run Code Online (Sandbox Code Playgroud)
但是我得到了错误
pickle.PicklingError: Could not serialize object: Py4JError: An error occurred while calling o31.__getnewargs__. Trace:
py4j.Py4JException: Method __getnewargs__([]) does not exist
Run Code Online (Sandbox Code Playgroud)
注册UDF时
distance_udf = udf(distfunc, DoubleType())
Run Code Online (Sandbox Code Playgroud)
您能否更正我在日志记录中应该修改的内容,以及是否要登录到单独的日志文件中,该如何纠正我。
谢谢
如果您在 PySpark 的 UDF 函数中添加任何类型的登录,它就不会出现在任何地方。是否有某种方法可以实现这一目标?
到目前为止,我尝试了标准的 python 日志记录、py4j 和打印。
我们在 AWS EMR 集群上运行带有 YARN 集群管理器的 PySpark 2.3.2。
例如。这是我想使用的一个函数:
def parse_data(attr):
try:
# execute something
except Exception as e:
logger.error(e)
return None
Run Code Online (Sandbox Code Playgroud)
我将其转换为 UDF:
import pyspark.sql.functions as F
parse_data_udf = F.udf(parse_data, StringType())
Run Code Online (Sandbox Code Playgroud)
我将在数据帧上使用它:
from pyspark.sql import types as pst
dataframe = dataframe.withColumn("new_column", parse_data_udf("column").cast(pst.StringType())
Run Code Online (Sandbox Code Playgroud)
该函数的日志不会出现在任何地方。