A 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
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 will try to get bugs fixed within a few days.
Next up: an appender for Kinesis Firehose in order to use Kibana with ElasticSearch.
No comments:
Post a Comment