【问题标题】:How do I write to the logs in Azure WebJobs from a C# console app?如何从 C# 控制台应用程序写入 Azure WebJobs 中的日志?
【发布时间】:2014-03-15 14:26:44
【问题描述】:

我正在测试 Azure Webjobs。我编写了一个控制台应用程序,它轮询 SQL 数据库中的新工作并对其进行处理。我没有使用 WebJobs SDK,因为它只支持 Azure 存储。

我上传了作业,它运行了,然后它失败了,出现了一个异常,指出它无法连接到 SQL 数据库实例。我想知道正在使用什么连接字符串;是否从 Azure 网站获取连接字符串。日志给了我这个:

[03/14/2014 22:24:25 > 512206: SYS INFO] Status changed to Running
[03/14/2014 22:24:40 > 512206: ERR ] 
[03/14/2014 22:24:40 > 512206: ERR ] Unhandled Exception: System.AggregateException: One or more errors occurred. ---> System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)

我想将数据写入这些日志(例如正在使用的连接字符串是什么)。我试过 Console.WriteLine、Debug.WriteLine、Console.Error.WriteLine。它们都没有出现在我的 WebJob 日志中。

显然我可以通过使用显示我想要的消息文本引发异常来获取数据,但必须有更好的方法!如何将 SYS INFO 行和 ERR 行写入日志?

【问题讨论】:

  • 你为我写了我的问题。要去寻找答案。如果您确实解决了,请在此处留下答案吗?

标签: azure-webjobs


【解决方案1】:

关于日志:

对于 continuous WebJobs - Console.Out 和 Console.Error 被路由到“应用程序日志”,它们将显示为文件、blob 或表存储,具体取决于您对应用程序日志的配置(类似于您的网站)。

此外,每次调用的前 100 行还将转到 WebJob 日志文件(以减轻 WebJob 在启动时失败时的调试痛苦),可使用 Azure 门户访问(但也保存在您站点的文件系统中的 data/jobs/连续/jobName)。

对于触发/计划 WebJobs - Console.Out/Console.Error 被路由到 WebJobs 特定的运行日志文件,也可以使用 Azure 门户访问并存储在 data/jobs/triggered/jobName/runId .

Console.Out 被视为(标记)为 INFO,Console.Error 被视为 ERROR。

关于连接字符串:

您可以使用 ConfigurationManager 类访问您的连接字符串,就像在您的网站中一样,对于不是用 .NET 编写的 WebJobs,您可以将这些连接字符串(和应用程序设置)作为环境变量(与您的网站相同) )。

【讨论】:

  • 我相信一旦您打开应用程序登录,它会在 12 小时内自行关闭。需要记住的一点。
  • 适用于文件系统,blob 存储和表存储不会关闭。
  • 我注意到的唯一不幸的事情是,在作业执行期间写入的控制台输出不会与作业本身一起记录,(据我所知)您编写的任何调试输出都必须在异常中如果您想了解有关失败案例的更多上下文,请发送消息。
【解决方案2】:

我能够让 Console.WriteLine() 在我的网络作业日志中留下消息。以下控制台运行并留下日志消息。

class Program
{
    static void Main(string[] args)
    {
        while (true)
        {
            DoStuff();
            Thread.Sleep(10000);
        }
    }

    public static void DoStuff()
    {
        Console.WriteLine("do stuff");
    }
}

这是我的日志文件显示的内容:

[03/15/2014 04:05:28 > cf6d00: SYS INFO] Run script 'HelloWebJobConsoleApplication.exe' with script host - 'WindowsScriptHost'
[03/15/2014 04:05:28 > cf6d00: SYS INFO] Status changed to Running
[03/15/2014 04:05:28 > cf6d00: INFO] do stuff
[03/15/2014 04:05:38 > cf6d00: INFO] do stuff
[03/15/2014 04:05:48 > cf6d00: INFO] do stuff
[03/15/2014 04:05:58 > cf6d00: INFO] do stuff

【讨论】:

  • 当我认为我的网络作业中的 .exe 似乎没有被替换时,这意味着我没有看到我的 Console.WriteLine 语句。我纠正了这个问题。正如里克佩里所说,“哎呀”。 :)
  • 您如何确保正在实施最新版本的 .exe?
  • @awj 输出AssenmblyName.Version 这样msdn.microsoft.com/en-us/library/…
  • 这适用于连续和触发?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 2021-05-29
相关资源
最近更新 更多