powertools-lambda-dotnet icon indicating copy to clipboard operation
powertools-lambda-dotnet copied to clipboard

If extra keys has property "name", the logger name in the output is overwritten

Open bjhogan opened this issue 1 year ago • 1 comments

Expected Behaviour

Logger name should not be lost when object logged has a property called "name".

This is lost - "name": "AWS.Lambda.Powertools.Logging.Logger", and replaced with "name": "Alan Adams", .

If the object being logged has a TimeStamp property, the Lambda timestamp will also be lost.

This problem relates to another bug.

Current Behaviour

The logger name is lost

{
    "coldStart": true,
    "xrayTraceId": "1-642af849-5a28de55210c2acf73933301",
    "functionName": "ThreeSimpleWaysToLog",
    "functionVersion": "$LATEST",
    "functionMemorySize": 256,
    "functionArn": "arn:aws:lambda:us-east-1:694977046108:function:ThreeSimpleWaysToLog",
    "functionRequestId": "e882f2c8-24af-406a-ac5a-90c1031c3b65",
    "name": "Alan Adams",
    "age": 11,
    "timestamp": "2023-04-03T16:01:14.3304021Z",
    "level": "Information",
    "service": "ThreeSimpleWaysToLog",
    "message": "Alan Adams and is 11 years old"
}

Code snippet

using Amazon.Lambda.Core;
using AWS.Lambda.Powertools.Logging;

// 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 ThreeSimpleWaysToLog;

public class Function

{
    [Logging(LogEvent = true, LoggerOutputCase = LoggerOutputCase.CamelCase)]
    public void FunctionHandler(string input, ILambdaContext context)
    {
        Person person = new Person { Name ="Alan Adams", Age = 11 };
        Logger.LogInformation<Person>(person, "{Name} and is {Age} years old", new object[]{person.Name, person.Age});
    }
}


public class Person 
{
    public string Name {get ; set;} 
    public int Age { get; set; }
}

Possible Solution

The Person should be have be represented in the JSON under a Person property.

"person": {
    "name": "Alan Adams",
    "age": 11
}

### Steps to Reproduce

Deploy the code above and invoke

### AWS Lambda Powertools for .NET version

latest

### AWS Lambda function runtime

dotnet6

### Debugging logs

_No response_

bjhogan avatar Apr 03 '23 16:04 bjhogan