Skip to content

AWS logger logs to cloudwatch twice #199

Open
@lanierhall

Description

@lanierhall

Describe the bug

AWS logger code initializes twice in certain cases.

Expected Behavior

It should only log once

Current Behavior

When calling LogManager.GetLogger it calls initialization code for the logger/appender which calls
AppConfigAWSCredentials which calls GetLogger on line 33 which starts logger code initialization all over again. The second attempt finds credentials as they were set in the first one and creates a listener. The first stack finally returns in AppConfigAWSCredentials and logs that credentials were found and then continues to setup/add a listener. There are now two listeners that both react to logs coming in and send them to cloudwatch. The fix I used was to add lock/isInitialized functionality.

Reproduction Steps

Create a project and add

    private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

And use the logger somewhere in main.
Add the following sections to your config:

... ...
<appender name="Cloudwatch" type="AWS.Logger.Log4net.AWSAppender,AWS.Logger.Log4net">
  <LogGroup>SystemDeveloper</LogGroup>
  <Region>us-east-1</Region>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%property{log4net:HostName} [%thread] %-5level %logger - %message%newline"/>
  </layout>
  <LibraryLogFileName>c:\logs\awslog.txt</LibraryLogFileName>
</appender>

Additionally:

  • There should be no AWS Credential providers other than the AppConfigAWSCredentials
  • In your app.config you should add an AWS key and secret entry
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
    <add key="AWSAccessKey" value="valid key"/>
    <add key="AWSSecretKey" value="valid secret"/>
...

To reproduce the issue, you need to cause the Amazon.Runtime.AppConfigAWSCredentials object to instantiate. This is done when the FallbackCredentialsFactory intantiates the CredentialsGenerators property. In other words, create a project with aws key/secret in your app.config project and have no other way to provide aws credentials so that it looks for them there.

Possible Solution

No response

Additional Information/Context

No response

AWS .NET SDK and/or Package version used

AWS.Logger.Core 3.1.0
AWS.Logger.Log4net 3.3.0
log4net 2.0.12
AWSSDK.CloudWatchLogs 3.7.2.39

Targeted .NET Platform

4.8

Operating System and version

Windows Server 2016 Datacenter

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugThis issue is a bug.module/loggingp2This is a standard priority issuequeued

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions