相关疑难解决方法(0)

Python:如何进行延迟调试日志记录

我有一些像这样的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昂贵的功能.

谢谢.

编辑

我刚刚访问了懒惰记录器消息字符串评估,但不满意,主要是因为:

  1. 这是一些丑陋的东西;
  2. 即使我用一些Lazy类包装昂贵的函数,当我有两个昂贵的函数时,我会怎么做?(如下所示).
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)

python logging lazy-evaluation

7
推荐指数
2
解决办法
2901
查看次数

在PySpark中登录UDF

我正在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)

您能否更正我在日志记录中应该修改的内容,以及是否要登录到单独的日志文件中,该如何纠正我。

谢谢

python logging apache-spark pyspark

5
推荐指数
0
解决办法
696
查看次数

如何从 Pyspark 中的 UDF 函数发送日志

如果您在 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)

该函数的日志不会出现在任何地方。

logging user-defined-functions pyspark

5
推荐指数
1
解决办法
1123
查看次数