使用数据块中的 python 日志记录模块将日志写入 azure 数据湖不起作用

Dom*_*aun 10 python logging azure azure-data-lake azure-databricks

我正在尝试在 Databricks 中的 Python 笔记本中将自己的日志文件写入 Azure Datalake Gen 2。我试图通过使用 Python 日志记录模块来实现这一点。

不幸的是我不能让它工作。不会引发错误,会创建文件夹,但不会创建包含日志内容的文件。即使文件存在,也不会写入任何内容。

本地 python 脚本工作正常,但我无法在 Databricks 中使用它。

这是我的代码:

# mount
if not any(mount.mountPoint == '/mnt/log' for mount in dbutils.fs.mounts()):
  dbutils.fs.mount(
    source = "abfss://log@datalake.dfs.core.windows.net/",
    mount_point = "/mnt/log",
    extra_configs = configs)

# vars
folder_log = '/mnt/log/test/2019'
file_log = '201904.log'

# add folder if not existent
dbutils.fs.mkdirs(folder_log)

# setup logging
import logging
logging.basicConfig(
  filename=folder_log+'/'+file_log,
  format='%(asctime)s | %(name)s | %(levelname)s | %(message)s',
  datefmt='%Y-%m-%d %H:%M:%S UTC (%z)',
  level=logging.NOTSET
)

# test
logging.info('Hello World.')
Run Code Online (Sandbox Code Playgroud)

安装似乎没问题。

使用 dbutils 添加和写入文件工作正常:

dbutils.fs.put(folder_log+'/'+file_log, 'Hello World.')

像这样写入文件也可以正常工作:

f = open('/dbfs/mnt/log/test/2019/201904.log', 'w+')
f.write("This is line %d\r\n")
f.close()
Run Code Online (Sandbox Code Playgroud)

还尝试将“dbfs”添加到路径

filename='/dbfs'+folder_log+'/'+file_log,
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

gil*_*rio 6

您可以使用 azure_storage_logging 处理程序:

import logging
from azure_storage_logging.handlers import BlobStorageRotatingFileHandler
log = logging.getLogger('service_logger')
azure_blob_handler = BlobStorageRotatingFileHandler(filename, 
                                                    account_name,
                                                    account_key,
                                                    maxBytes,
                                                    container)
log.addHandler(azure_blob_handler)
Run Code Online (Sandbox Code Playgroud)


Moh*_*rma -2

让我解释一下使用 python 在 Azure 数据湖存储上访问或执行写入操作的步骤

1) 在Azure AD中注册应用程序

在此输入图像描述

在此输入图像描述

2) 在数据湖中为您注册的应用程序授予权限

在此输入图像描述

在此输入图像描述

在此输入图像描述

在此输入图像描述

3) 请从azure AD获取您已注册的应用程序的客户端密钥。

4)您需要编写代码来将目录挂载到Azure数据湖中,如下所示

dbutils.fs.mkdirs("/mnt/mountdatalake")

config = {"dfs.adls.oauth2.access.token.provider.type": "ClientCredential",
           "dfs.adls.oauth2.client.id": "Registered_Client_Id_From_Azure_Portal",
             "dfs.adls.oauth2.credential": "Cleint_Secret_Obtained_By_Azure_Portal",
               "dfs.adls.oauth2.refresh.url":"https://login.microsoftonline.com/Your_Directory_ID/oauth2/token"}

dbutils.fs.amount(
               source="adl://mydata.azuredatalakestore.net/mountdatabricks",
               mount_point ="/mnt/mountdatalake",
extra_configs=configs)
Run Code Online (Sandbox Code Playgroud)

使用应用程序客户端凭据完成配置/安装后,您就可以访问该目录并记录它。

例如,下面我从 SQL Server 中提取了几条记录并将其存储在 azure 数据湖中

在此输入图像描述

希望这可以帮助。