使用slf4j登录AWS Lambda

chr*_*003 11 java aws-lambda

我正在使用lambda函数并用Java编写它.当我阅读文档时,我正在寻找记录Lambda函数,并且它们支持log4j - http://docs.aws.amazon.com/lambda/latest/dg/java-logging.html#java-wt-logging-using- log4j.

我想知道我们是否可以使用Slf4j注释来使用日志记录,因为Slf4j只是一个绑定注释.有没有人在尝试使用Slf4j之前使用lambda?

小智 6

是的你可以。只需将以下依赖项添加到您的项目中

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>1.7.25</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.25</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-log4j</artifactId>
        <version>1.0.0</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

并在项目的/ src / main / resources /中创建正确的log4j.properties,例如

log = .
log4j.rootLogger = DEBUG, LAMBDA

#Define the LAMBDA appender
log4j.appender.LAMBDA=com.amazonaws.services.lambda.runtime.log4j.LambdaAppender
log4j.appender.LAMBDA.layout=org.apache.log4j.PatternLayout
log4j.appender.LAMBDA.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss} <%X{AWSRequestId}> %-5p %c{1}:%m%n
Run Code Online (Sandbox Code Playgroud)

  • 任何人都可以确认这在 SAM Local 中有效吗?无论我对依赖项和阴影做什么,我都会收到“SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”。 (3认同)
  • 嗨,%-5p %c{1}:%m%n 在这里是什么意思? (2认同)

kop*_*por 6

只需包含以下依赖项:

<dependency>
    <groupId>io.symphonia</groupId>
    <artifactId>lambda-logging</artifactId>
    <version>1.0.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

背景资料见:https://blog.symphonia.io/a-love-letter-to-lambda-logging-974b0eb49273


Igo*_*man 6

jlib AWS拉姆达的logback追加程序允许您使用SLF4J使用的logback从您的AWS lambda函数。

只需添加以下依赖项:

Gradle(build.gradle

dependencies {
    implementation 'org.slf4j:slf4j-api:1.8.0-beta2'
    runtimeOnly 'org.jlib:jlib-awslambda-logback:1.0.0'
}
Run Code Online (Sandbox Code Playgroud)

Maven(pom.xml

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.8.0-beta2</version>
</dependency>
<dependency>
    <groupId>org.jlib</groupId>
    <artifactId>jlib-awslambda-logback</artifactId>
    <version>1.0.0</version>
    <scope>runtime</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

然后AwsLambdaAppender在您的日志记录配置中使用:

XML配置示例(src / main / resources / logback.xml

<configuration>

    <appender name="awslambda" class="org.jlib.cloud.aws.lambda.logback.AwsLambdaAppender">
        <encoder type="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] &lt;%-36X{AWSRequestId:-request-id-not-set-by-lambda-runtime}&gt;
%-5level %logger{10} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="awslambda" />
    </root>

</configuration>
Run Code Online (Sandbox Code Playgroud)

与其他解决方案不同,此Logback Appender可以正确处理多行日志消息,尤其是堆栈跟踪,并且每条消息仅产生一个 CloudWatch Logs事件。

该库还允许您在每条日志消息中包括由AWS Lambda运行时提供的AWSRequestId,以实现更好的跟踪。

当您创建uber-jar时,虽然log4j2需要在构建中进行其他处理,但此解决方案是开箱即用的。

免责声明:我是jlib的开发人员

  • 谢谢您的帮助。尽管您的解决方案无法解决我的问题,但实际上可以帮助我找出问题并解决:) (2认同)

And*_*rey 5

自此,AWS 指南更新了有关 Log4j 2 和 SLF4J 集成的详细信息。下面的代码片段基于 slf4j 和 log4j 版本更新到最新版本的指南。

pom.xml:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-bom</artifactId>
            <version>2.19.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-log4j2</artifactId>
        <version>1.5.1</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j2-impl</artifactId>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>2.0.6</version>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

src/main/resources/log4j2.xml

<Configuration status="WARN">
    <Appenders>
        <Lambda name="Lambda">
            <PatternLayout>
                <pattern>%d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1} - %m%n</pattern>
            </PatternLayout>
        </Lambda>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="Lambda"/>
        </Root>
        <Logger name="software.amazon.awssdk" level="WARN"/>
        <Logger name="software.amazon.awssdk.request" level="DEBUG"/>
    </Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)