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

Azure持久编排功能ILogger输出日志两次

章学义
2023-03-14

有两个相互调用的持久函数。主配乐-

每个func都有ILogger依赖项,并在函数开始和函数结束时登录。由于某种原因,两个编排器都重复了“on start”消息。(见图)活动没有这种效果。(见图)多次运行下面的示例-同一个故事。

我也相信整个过程已经触发一次。

这是编排器中的错误还是预期的行为?

using System;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;

namespace Issues
{
    public static class Log_Issue
    {
        [FunctionName("Main")]
        public static async Task RunOrchestrator(
            [OrchestrationTrigger] IDurableOrchestrationContext context,
            ILogger log)
        {
            try
            {
                log.LogWarning("Main Start");
                await context.CallSubOrchestratorAsync("Sub", null);
                log.LogWarning("Main End");
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }

        [FunctionName("Sub")]
        public static async Task RunSubOrchestrator(
            [OrchestrationTrigger] IDurableOrchestrationContext context,
            ILogger log)
        {
            log.LogWarning("Sub Start");
            var data = await context.CallActivityAsync<string>("Activity", null);
            log.LogWarning("Sub End");
        }

        [FunctionName("Activity")]
        public static async Task<string> GetDataActivity([ActivityTrigger] string name, ILogger log)
        {
            log.LogWarning("Activity Start");
            var data = await GetDataAsync("https://www.google.com");
            log.LogWarning("Activity End");

            return data;
        }

        [FunctionName("Start")]
        public static async Task<IActionResult> HttpStart(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")]
            HttpRequestMessage req,
            [DurableClient] IDurableOrchestrationClient starter,
            ILogger log)
        {
            var instanceId = await starter.StartNewAsync("Main", null);
            log.LogWarning($"Started orchestration with ID = '{instanceId}'.");
            return new OkResult();
        }

        private static async Task<string> GetDataAsync(string url)
        {
            var httpClient = new HttpClient();

            using var request = new HttpRequestMessage
            {
                RequestUri = new Uri(url),
                Method = HttpMethod.Get,
            };

            var response = await httpClient.SendAsync(request);
            response.EnsureSuccessStatusCode();

            return await response.Content.ReadAsStringAsync();
        }
    }
}

共有2个答案

经兴安
2023-03-14

@FilipB说的都是真的。它只是缺少解决它的实际代码;)

[FunctionName("Main")]
public static async Task RunOrchestrator(
[OrchestrationTrigger] IDurableOrchestrationContext context,
ILogger log)
{
    log = context.CreateReplaySafeLogger(log); // this is what you should use at the start of every Orchestrator

从智明
2023-03-14

这是预料之中的。例如在等待上下文上。CallActivityAsync(“活动”,空);代码本身暂停,甚至可能从内存中加载(以节省成本)。

然后,orchestrator等待一个事件被放入活动创建的另一个Azure存储表中,这可能会在许多天后发生。对于活动来说,它们通常是即时的,但是仍然需要等待事件发生。

当这种情况发生时,代码需要从它最后停止的地方开始,但是没有办法做到这一点。因此,代码从开始处重新运行,但不是等待活动再次结束,而是首先查看表,看到我们已经完成了这个活动,可以继续运行。如果活动函数返回某个值,它将从await调用中返回。在orchestrator的两次运行过程中,它都会记录日志,但是由于我们只进入活动,所以只会记录日志。

这就是为什么业务流程协调程序必须是确定性的,因为例如,第一次运行时的随机值与第二次运行时的随机值不同。相反,我们会把随机的。Next() 将添加到活动功能中,以便将值保存到 Azure 表存储中,以便在后续重新运行时使用。业务流程协调程序还可能正在等待正常函数创建的某些外部事件。例如,有人必须验证他们的电子邮件帐户,这可能需要几天的时间,这就是为什么持久函数可以在事件触发时自行卸载并重新启动的原因。

 类似资料:
  • 我正在使用一组持久的函数来完成一些关键的后端逻辑和操作,我希望它们在同一个文件中写入日志,这样我就可以进行更好的分析。对了,我知道我正在使用log.information方法注入的ILog实例,但是每个函数都编写自己的日志文件。 我也在使用application insights,但由于遥测采样,文件中的信息比application insights要多得多。 以下是我的host.json文件的示

  • 你如何测试和调试你的代码呢?Lua 的两个主力作者是这样回复的: Luiz Henrique de Figueiredo:我主要是一块一块的构建,分块测试。我很少使用调试器。即使用调试器,也只是调试 C 代码。我从不用调试器调试 Lua 代码。对于 Lua 来说,在适当的位置放几条打印语句通常就可以胜任了。 Roberto Ierusalimschy:我差不多也是这样。当我使用调试器时,通常只是用

  • Blade使用了 slf4j-api 作为日志接口,为了方便起见,默认内置了日志实现, 包含按日期进行文件归档等操作,一个小型应用无需配置日志组件。 maven的坐标名为 blade-log,源码在 这里 默认的日志级别是 INFO,你可以修改它。使用日志和往常一样: public class LogExample { private static final org.slf4j.Logg

  • 我们在一个更大的事件链中使用和Azure函数。该链的所有其他部分都在log analytics中提供了日志,这样我们就可以轻松地在整个系统中跟踪任何给定的请求。然而,我无法找到一种方法,使功能App日志到同一地方。我猜这应该是可能的,因为它在我们的工作区看起来是这样的: 监控功能应用程序的文档仅提及应用程序洞察。

  • 问题内容: 在python中使用multiprocessing.Process类时,是否有办法记录给定Process的stdout输出? 问题答案: 最简单的方法可能是覆盖。从多处理手册中稍微修改一个示例: 并运行它:

  • 有时,在你的游戏正在运行的时候,为了了解程序的运行过程或是为了查找一个 BUG,你想看到一些运行时信息,可以! 这个需求引擎已经考虑到了,使用 log() 可以把信息输出到控制台,这样使用: // a simple string log("This would be outputted to the console"); // a string and a variable string s =