簡體   English   中英

AWS Lambda 在 cloudwatch (.NET Core 3.1) 中寫入額外的行

[英]AWS Lambda writes extra line in cloudwatch (.NET Core 3.1)

I am programming a lambda function in .NET Core 3.1(C#) and I want to leave log of the actions being performed in my logic, when I deploy my lambda in the AWS Lambda service in cloudwatch it adds an extra line that is only displayed in output(也影響我的本地文件,但不影響我的純文本文件)我可能配置錯誤是什么?

要創建項目,請使用 AWS Toolkit For Visual Studio 2019 中的模板“AWS Lambda 項目 (.NET Core - C#)”。

依賴項:

NLog.Web.AspNetCore (4.14.0)
NLog (4.7.13)
Microsoft.Extensions.Configuration.Abstractions (6.0.0)
Amazon.Lambda.Serialization.SystemTextJson (2.2.0)
Amazon.Lambda.Core (2.1.0)

存儲庫: https://github.com/Weyne/AWS-NET_CORE-NLOG/

NLog.config

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        >

    <targets>
        <target name="aws"
                xsi:type="AWSTarget"
                logGroup="aws/lambda/WeyneLoggingWithNLog"
                region="us-east-1"
                layout="
               -------------- ${level} (${longdate}) --------------${newline}
                ${newline}
                Call Site: ${callsite}${newline}
                Exception Type: ${exception:format=Type}${newline}
                Exception Message: ${exception:format=Message}${newline}
                Stack Trace: ${exception:format=StackTrace}${newline}
                Additional Info: ${message}${newline}" />
        <target xsi:type="File" name="fileTarget" filename="C:\Log\${machinename}-${local-ip}-mylambda-${date:format=yyyy-MM-dd}.txt" layout="${longdate}|${level:uppercase=true}|${local-ip}|${callsite}|${message}|${exception:format=tostring}"></target>

        <target name="aws" type="AWSTarget" />
    </targets>
    <rules>
        <!--Skip Microsoft logs and so log only own logs-->
        <logger name="Microsoft.*" maxlevel="Info" final="true" />
        <logger name="*" minlevel="Trace" writeTo="fileTarget" />
        <logger minlevel="Error" name="*" writeTo="aws"/>
    </rules>

</nlog>

Function.cs

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Threading.Tasks;
    
    using Amazon.Lambda.Core;
    using Microsoft.AspNetCore.Mvc.Infrastructure;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.DependencyInjection.Extensions;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Logging;
    using NLog;
    using NLog.Web;
    using WeyneLoggingWithNLog.Interfaces;
    using WeyneLoggingWithNLog.Services;
    
    // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
    [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
    
    namespace WeyneLoggingWithNLog
    {
        public class Function
        {
    
            /// <summary>
            /// A simple function that takes a string and does a ToUpper
            /// </summary>
            /// <param name="input"></param>
            /// <param name="context"></param>
            /// <returns></returns>
            public string FunctionHandler(string input, ILambdaContext context)
            {
                var logger = NLogBuilder.ConfigureNLog("NLog.config").GetCurrentClassLogger();
                try
                {
    
                    var builder = new ConfigurationBuilder();
                    BuildConfig(builder);
    
                    var host = Host.CreateDefaultBuilder()
                        .ConfigureLogging((hostingContext, logging) =>
                        {
                            logging.ClearProviders(); //esta línea hace la diferencia
                            logging.AddConsole();//mal
                            logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); //esta línea hace la diferencia
                            logging.AddNLogWeb();
                        })
                        .ConfigureServices((context, services) =>
                        {
                            services.AddHttpContextAccessor();
                            services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
                            services.AddScoped<IProcessService, ProcessService>();
                            services.BuildServiceProvider();
                            services.AddLogging();
                        })
                        .UseNLog()
                        .Build();
    
                    var service = ActivatorUtilities.CreateInstance<ProcessService>(host.Services);
    
                    return service.Invoke(input).Result.ToUpper();
                }
                catch (Exception ex)
                {
                    logger.Error(ex, "Stopped program because of exception");
                    throw ex;
                }
                finally
                {
                    NLog.LogManager.Shutdown();
                }
            }
    
            static void BuildConfig(IConfigurationBuilder builder)
            {
                builder.SetBasePath(Directory.GetCurrentDirectory())
                    //.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                    .AddEnvironmentVariables();
            }
        }    
    }

進程服務.cs

    using System.Threading.Tasks;
    using WeyneLoggingWithNLog.Interfaces;
    using Microsoft.Extensions.Logging;
    
    
    namespace WeyneLoggingWithNLog.Services
    {
        public class ProcessService : IProcessService
        {
            private readonly ILogger<ProcessService> _logger;
    
            public ProcessService(ILogger<ProcessService> logger)
            {
                _logger = logger;
            }
    
            public async Task<string> Invoke(string input)
            {
                _logger.LogInformation("Hola mundo: {0}", input);
                _logger.LogError("Error: {0}", input);
                _logger.LogTrace("Trace: {0}", input);
                return input;
            }
        }
    }

我本地的日志打印本地注冊

我注意到如果我刪除“logging.AddConsole();” 來自 Function.cs 的行,不再顯示額外的行(標記為黃色),但日志輸出停止工作(在我的本地和 aws 中)並且只打印物理日志。

本地日志輸出

雲觀察: 在此處輸入圖像描述

aws lambda: 在此處輸入圖像描述

我取得了這個結果:

當地的: 在此處輸入圖像描述

AWS Lambda: 在此處輸入圖像描述

雲觀察: 在此處輸入圖像描述

我所做的修改如下:

存儲庫: https://github.com/Weyne/AWS-NET_CORE-NLOG/

刪除參考

NLog

修改 NLog.config:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        >

    <targets>
        <target xsi:type="File" name="fileTarget" filename="C:\Log\${machinename}-${local-ip}-mylambda-${date:format=yyyy-MM-dd}.txt" layout="${longdate}|${level:uppercase=true}|${local-ip}|${callsite}|${message}"></target>
        <target name="console" xsi:type="Console" layout="${level:uppercase=true}|${callsite}|${message}" />

        <target name="aws" type="AWSTarget" />
    </targets>
    <rules>
        <logger name="*" minlevel="Info" writeTo="console" />
        <logger name="*" minlevel="Trace" writeTo="fileTarget" />
    </rules>

</nlog>

刪除行“logging.AddConsole();” 來自 Function.cs。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;

using Amazon.Lambda.Core;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using NLog;
using NLog.Web;
using WeyneLoggingWithNLog.Interfaces;
using WeyneLoggingWithNLog.Services;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace WeyneLoggingWithNLog
{
    public class Function
    {

        /// <summary>
        /// A simple function that takes a string and does a ToUpper
        /// </summary>
        /// <param name="input"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public string FunctionHandler(string input, ILambdaContext context)
        {
            var logger = NLogBuilder.ConfigureNLog("NLog.config").GetCurrentClassLogger();
            try
            {

                var builder = new ConfigurationBuilder();
                BuildConfig(builder);

                var host = Host.CreateDefaultBuilder()
                    .ConfigureLogging((hostingContext, logging) =>
                    {
                        logging.ClearProviders(); //esta línea hace la diferencia
                        logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); //esta línea hace la diferencia
                        logging.AddNLogWeb();
                    })
                    .ConfigureServices((context, services) =>
                    {
                        services.AddHttpContextAccessor();
                        services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
                        services.AddScoped<IProcessService, ProcessService>();
                        services.BuildServiceProvider();
                        services.AddLogging();
                    })
                    .UseNLog()
                    .Build();

                var service = ActivatorUtilities.CreateInstance<ProcessService>(host.Services);

                return service.Invoke(input).Result.ToUpper();
            }
            catch (Exception ex)
            {
                logger.Error(ex, "Stopped program because of exception");
                throw ex;
            }
            finally
            {
                NLog.LogManager.Shutdown();
            }
        }

        static void BuildConfig(IConfigurationBuilder builder)
        {
            builder.SetBasePath(Directory.GetCurrentDirectory())
                //.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddEnvironmentVariables();
        }
    }    
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM