我认为这很简单,但几个小时后才意识到并非如此。我向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”的应用程序添加一条语句?我真的只想要快速又脏的东西,但是花了几个小时之后,它的“快速”部分却没有发生。
答案 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!!");
}
}
}
就是这样!
在这里我包括一些屏幕截图:
答案 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 中启用日志: