当前位置: 首页 > 知识库问答 >
问题:

Azure函数日志-在模块级记录信息

谯灿
2023-03-14

我正在尝试将信息记录到代码的模块级别的应用程序洞察中,而不是记录到函数级别。

当记录器从函数内调用(在我的项目的任何模块中)时,我可以成功地记录信息、警告等,但当在函数调用时(例如初始化一个模块,希望记录一些设置),我可以成功地记录信息、警告等

例如,当在azure functions中运行我的HttpTrigger应用程序时,这会起作用,并将信息记录到app Insights:

import logging

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('this message is logged successfully')
    do_something()

虽然这不起作用:

import logging
logging.info('this message isnt logged anywhere')

def main(req: func.HttpRequest) -> func.HttpResponse:
    do_something()

我试过使用命名记录器,更改日志设置,例如:

import logging
log = logging.getLogger(__name__)
log.setLevel(logging.INFO)
log.info('This still isnt logged')

def main(req: func.HttpRequest) -> func.HttpResponse:
    do_something()
{
  "version": "2.0",
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[1.*, 2.0.0)"
  },
  "logging": {
    "fileLoggingMode": "always",
    "logLevel": {
      "default": "Information",
      "Host.Results": "Information",
      "Function": "Information",
      "Host.Aggregator": "Information"
    }
  }
}

在本地运行代码时,信息会在任何地方正确地打印到stdout。

我想我一定是完全误解了日志记录是如何在AZ工作的。如果有人能填补我的空白,在这里,为什么日志没有工作,如我所期望的,这将是感激的!

共有1个答案

法和安
2023-03-14

这就是原因:

问题来自于Azure上的应用程序日志默认不打开。这就是解决办法:

转到Platform features->所有设置。

import logging

import azure.functions as func

logger = logging.getLogger('name')
logger.setLevel(logging.DEBUG)
sh = logging.StreamHandler()
sh.setLevel(logging.INFO)
logger.addHandler(sh)
logger.info('This will work.')

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        return func.HttpResponse(f"Hello {name}!")
    else:
        return func.HttpResponse(
             "Please pass a name on the query string or in the request body",
             status_code=400
        )

https://docs.microsoft.com/en-us/azure/app-service/troubleshoot-diagnosty-logs#enable-application-logging-linuxcontainer

 类似资料:
  • 我试图创建一个用BlobTrigger触发的Azure函数。当我向目标容器添加新文件时,我可以通过查看调用来看到函数的运行,在Azure portal上的Monitor中显示触发时间和状态“Success”。然而,除了“已连接!”之外,日志中没有出现任何内容欢迎文本。 这是样板运行。我尝试过的csx有点修改,也有点修改: 和 function.json(我已向其添加了具有相同路径的输入绑定): 我

  • 我可以创建一个命名的子记录器,以便该记录器输出的所有日志都用它的名称标记。我可以只在函数/类/任何东西中使用记录器。 但是,如果该代码调用了另一个模块中的函数,该模块仅使用日志模块函数(根记录器的代理)进行日志记录,我如何确保这些日志消息通过相同的记录器(或者至少以相同的方式记录)? 例如: main.py 其他.py 产出: 我希望能够使两个日志行都标记为名称'stuff',我希望能够做到这一点

  • 问题内容: 我想知道如何实现一个全局记录器,该记录器可以用自己的设置在任何地方使用: 我目前有一个自定义记录器类: 该类在一个单独的文件中,其中包含一些格式化程序和其他内容。记录器可以完美地独立运行。 我将此模块导入我的主python文件中,并创建一个像这样的对象: 但显然,我无法从代码的其他部分访问此对象。我使用错误的方法吗?有一个更好的方法吗? 问题答案: 使用创建一个名为全球记录。 main

  • 我正在使用Python日志模块,并希望禁用由我导入的第三方模块打印的日志消息。例如,我使用的是如下所示: 当我执行logger.debug时,它会输出我的调试消息(“my Message!”),但它也会从我导入的任何模块中输出调试消息(如请求和许多其他东西)。 我只想看到我感兴趣的模块的日志消息。有没有可能让日志模块做到这一点?

  • 我有一个小的python项目,它有如下结构-- 我计划使用默认日志模块将消息打印到stdout和一个日志文件。要使用日志模块,需要进行一些初始化- 目前,我在开始记录消息之前在每个模块中执行此初始化。是否有可能在一个地方只执行一次初始化,以便通过在整个项目中进行日志记录来重用相同的设置?

  • 有没有一种方法可以在不更新host.json文件的情况下覆盖Azure函数应用程序的默认日志级别?我希望我的函数只在dev环境中将跟踪日志传递给应用程序洞察。我在想,如果一个环境变量可以设置,函数将知道什么时候传递日志。