如何在azure应用程序服务中查看控制台或跟踪输出? Console.WriteLine或Trace.TraceError

时间:2020-03-15 19:17:48

标签: azure logging console trace

我认为这很简单,但几个小时后才意识到并非如此。我向C#.Net Core部署了“应用服务”到Azure。

我试图通过使用Console.WriteLine(“我的消息”)或Trace.TraceError(“我的消息”)添加对应用程序的粗略监视,但是我无法在Azure的任何地方找到该输出。

我尝试启用Application Insights,但也未在其中找到输出。

我只想以最简单的方法来了解我的应用程序中的一行代码受到攻击。最简单的方法是什么?

我尝试过的事情: 1)我进入Azure的控制台,浏览到可能具有这种输出但找不到任何文件的每个文件。当然,LogFiles下的任何文件和文件夹中都没有任何内容。 2)我直接去“应用服务日志”,并启用“应用日志(文件系统)”。 3)我还启用了“应用服务日志”中的“详细错误消息”。 4)我尝试了“诊断设置(预览)”,但在那里找不到输出。 5)我在“日志流”中查看应用程序日志,但是那里什么也没有显示 6)在“日志”下,我只收到以下消息:“我们没有找到任何日志” 7)“指标”和“警报”都没有此日志输出

我开始怀疑Azure不支持此功能。我是否只需要一次添加诸如serilog的日志记录框架,一次向可能像“ You hit line 20”的应用程序添加一条语句?我真的只想要快速又脏的东西,但是花了几个小时之后,它的“快速”部分却没有发生。

4 个答案:

答案 0 :(得分:1)

我终于想通了。我需要添加配置AzureFileLoggerOptions。如果没有这些选项,Azure输出中将不会显示任何内容。

function getContentDiagonal() {
  var contentWidth = $("#deneme").width();
  var contentHeight = $("#deneme").height();
  return contentWidth * contentWidth + contentHeight * contentHeight;
}

$(function() {

  $("#deneme").resizable({

    create: function(event, ui) {
      initDiagonal = getContentDiagonal();
      initFontSize = parseInt($("#resizable").css("font-size"));
    },

    resize: function(e, ui) {
      var newDiagonal = getContentDiagonal();
      var ratio = newDiagonal / initDiagonal;
      $("#deneme").css("font-size", initFontSize + ratio * 3);
    }


  });
});

总而言之,对于.Net Core 3.1,要使您的消息显示在“日志流”中,您需要在Azure的“应用程序服务日志”部分中启用“应用程序日志记录”。在您的代码中,您需要引用:

使用Microsoft.Extensions.DependencyInjection;

使用Microsoft.Extensions.Logging.AzureAppServices;

另外,在我的情况下,我使用的是Blazor / SignalR,并且没有MVC控制器,因此我不知道如何访问班级中的Logging框架。我确信有更好的方法,但是通过将ILogger公开为下面的代码,可以在代码库中的任何位置引用它。

我有一个写入日志的静态方法(在我的PC上进行积极调试时会控制台,在Azure中运行时会运行Azure“ Log Stream”控制台。

.ConfigureLogging(logging => logging.AddAzureWebAppDiagnostics())
.ConfigureServices(serviceCollection => serviceCollection
    .Configure<AzureFileLoggerOptions>(options =>
    {
        options.FileName = "azure-diagnostics-";
        options.FileSizeLimit = 50 * 1024;
        options.RetainedFileCountLimit = 5;
    }).Configure<AzureBlobLoggerOptions>(options =>
    {
        options.BlobName = "log.txt";
    })
)

Program.cs中的代码如下:

public static void WriteToLog(string message)
{
    Program.Logger.LogError(message);
}

答案 1 :(得分:1)

我所做的只是在Azure门户中启用应用程序服务日志。

为此,我专门在“详细”级别打开了“应用程序日志记录(文件系统)”,然后在“ Web服务器日志记录”选项中选择了“文件系统”

然后,您可以使用左侧栏中的“日志流”来显示应用程序日志。

在您的代码中,您只需要调用

import math

while True:
    x = float(input('Type something: '))
    if x in (0.1,0.2,0.3,0.4):
        math.floor(x)
        print(x)
    else:
        math.ceil(x)
        print(x)

public class Table {

    public static void main(String[] args) {
        System.out.println("Welcome to Tables are Us - Your One Stop Table Shop");
        System.out.println("Mike - Master Table Builder");

        int totalTables = 0;
        double totalTableCost = 0;

        Scanner scan = new Scanner(System.in);
        scan.useLocale(Locale.ENGLISH);

        while (true) {
            int shapeMenuItem = getShapeMenuItem(scan);

            if (shapeMenuItem == 4) {
                printFinalResults(totalTables, totalTableCost);
                return;
            }

            double area = getArea(scan, shapeMenuItem);

            if (Double.isNaN(area))
                System.err.println("Error - Invalid Entry. Please reenter a valid value.");
            else {
                int materialMenuItem = getMaterialMenuItem(scan);
                double tableCost = area * getMaterialCost(materialMenuItem);

                totalTableCost += tableCost;
                totalTables++;

                printReport(area, tableCost, materialMenuItem);
            }
        }
    }

    private static void printFinalResults(int numTable, double total) {
        if (numTable == 0)
            System.out.println("You did not estimate any tables today!");
        else
            System.out.format(Locale.ENGLISH, "\nThe total cost of the %d tables you estimated is $%.2f\n", numTable, total);

        System.out.println("Thank you for using the table cost estimation program!");
        System.out.println("GoodBye!!!");
    }

    private static void printReport(double area, double tableCost, int materialMenuItem) {
        System.out.println("\nOutput Report:");
        System.out.format(Locale.ENGLISH, "The area of table is %.2f square inches\n", area);
        System.out.println("The table will be made of " + getMaterialName(materialMenuItem));
        System.out.printf(Locale.ENGLISH, "The cost of the table is $%.2f\n", tableCost);
    }

    private static int getShapeMenuItem(Scanner scan) {
        System.out.println("\n\nWhat shape of table do you wish to build?");
        System.out.println("\t1. Rectangle");
        System.out.println("\t2. Square");
        System.out.println("\t3. Circle");
        System.out.println("\t4. End Program");
        System.out.print("Enter menu entry: ");

        return scan.nextInt();
    }

    private static int getMaterialMenuItem(Scanner scan) {
        while (true) {
            System.out.println("\nWhat type of material do you want to use?");
            System.out.println("\t1. Laminate ($0.125 per square inch)");
            System.out.println("\t2. Oak ($0.25 per square inch)");
            System.out.print("Enter menu entry: ");

            int menu = scan.nextInt();

            if (menu == 1 || menu == 2)
                return menu;

            System.err.println("Error - Invalid Entry. Please reenter a valid value.");
        }
    }

    private static double getArea(Scanner scan, int shapeMenuItem) {
        if (shapeMenuItem == 1)
            return getRectangleArea(scan);
        if (shapeMenuItem == 2)
            return getSquareArea(scan);
        if (shapeMenuItem == 3)
            return getCircleArea(scan);
        return Double.NaN;
    }

    private static double getRectangleArea(Scanner scan) {
        double length = readDouble(scan, "Enter the length of the table (in inches): ");
        double width = readDouble(scan, "Enter the width of the table (in inches): ");
        return length * width;
    }

    private static double getSquareArea(Scanner scan) {
        double length = readDouble(scan, "Enter the length of the table (in inches): ");
        return length * length;
    }

    private static double getCircleArea(Scanner scan) {
        double diameter = readDouble(scan, "Enter the diameter of the table (in inches): ");
        double radius = diameter / 2;
        return Math.PI * radius * radius;
    }

    private static String getMaterialName(int materialMenuItem) {
        if (materialMenuItem == 1)
            return "Laminate";
        if (materialMenuItem == 2)
            return "Oak";
        return null;
    }

    private static double getMaterialCost(int materialMenuItem) {
        if (materialMenuItem == 1)
            return 0.125;
        if (materialMenuItem == 2)
            return 0.25;
        return Double.NaN;
    }

    private static double readDouble(Scanner scan, String msg) {
        while (true) {
            System.out.print(msg);
            double val = scan.nextDouble();

            if (val > 0)
                return val;

            System.err.println("Error - Value must be greater than zero. Please reenter!!");
        }

    }
}

就是这样!

在这里我包括一些屏幕截图:

Screenshot of the selected options

Log Stream

答案 2 :(得分:0)

是的,仅.NET Core不支持this(控制台或跟踪输出)。您应按照以下步骤使用ILogger

Startup.cs-> Configure方法中,重新编写Configure方法,如下所示:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
       //your other code

        //add the following 2 lines of code.
        loggerFactory.AddConsole();
        loggerFactory.AddDebug();


        app.UseStaticFiles();

        //your other code
    }

然后在HomeController.cs中(例如)添加以下代码:

 public class HomeController : Controller
 {
    private readonly ILogger _logger; 

    public HomeController(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger<HomeController>();
    }

    public IActionResult Index()
    {
        _logger.LogInformation("this is a information from ILogger...");

        return View();
    }

    //other code

  }

如果您还有其他问题,请告诉我。

答案 3 :(得分:0)

您可以打开 Kudu 并查看 Console.WritLine 输出。从门户打开它或:

<块引用>

https://your_app_name_on_azure.scm.azurewebsites.net/api/logstream

不要忘记在 azure 中启用日志:

enter image description here