Announcing log4j-aws-appenders
This new homebrew project will help append your Log4j logs to prep them for CloudWatch, giving you more visibility into EC2 apps.
Join the DZone community and get the full member experience.
Join For FreeA few months ago, I started a "weekend project" to enable logging from my application to CloudWatch. I had used the AWS-provided log appender when working with AWS Lambda and liked its convenience. For applications running on EC2 instances, however, the CloudWatch Logs Agent was the recommended way to go. I looked around, but all I found was an appender for Log4J 2.0 (I assumed that the Lambda appender uses some Lambda-specific features).
So, as I said, weekend project. Except that I started adding features and refining how the appender worked, based on my use with a semi-production project (runs 24/7, but not business-critical at the moment). At this point, it's been running apparently bug-free for weeks, and I can't think of any features that I want to add, so it's time to release.
The JAR is available on Maven Central, so you can simply add it to your project POM:
<dependency>
<groupId>com.kdgregory.log4j</groupId>
<artifactId>aws-appenders</artifactId>
<version>1.0.0</version>
</dependency>
Then you need to add the appender to your Log4J config:
log4j.rootLogger=WARN, console
log4j.logger.com.example.log4j=DEBUG, cloudwatch
log4j.additivity.com.example.log4j=true
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d [%t] %-5p %c %x - %m%n
log4j.appender.cloudwatch=com.kdgregory.log4j.aws.CloudWatchAppender
log4j.appender.cloudwatch.layout=org.apache.log4j.PatternLayout
log4j.appender.cloudwatch.layout.ConversionPattern=%d [%t] %-5p %c %x - %m%n
log4j.appender.cloudwatch.logGroup=ExampleCloudwatchLog
log4j.appender.cloudwatch.logStream={startupTimestamp}-{sequence}
log4j.appender.cloudwatch.batchDelay=2500
log4j.appender.cloudwatch.rotationMode=daily
Note that I create a default ConsoleAppender
and only attach the CloudWatchAppender
to my program's package (com.example.log4j
). You may prefer to send everything to CloudWatch, but if you do, beware that the AWS SDK does its own logging; you won't want to use DEBUG
level for it or the Apache HTTP client:
log4j.logger.org.apache.http=ERROR
log4j.logger.com.amazonaws=ERROR
The second thing to note is the logStream
configuration parameter: it (and logGroup
) can use substitution variables. Here I'm writing a new stream for each application run, rotated daily, with a sequence number to keep track of the different streams.
For more information, head over to the project on GitHub. Feel free to submit issues if you find problems or want an enhancement; I can't guarantee turnaround time for enhancements, but I will try to get bugs fixed within a few days.
Next up: An appender for Kinesis Firehose in order to use Kibana with ElasticSearch.
Published at DZone with permission of Keith Gregory, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments