1. 概述

本教程将介绍如何为使用各种日志库的 Java 应用程序配置 SolarWinds Loggly,这是一个基于云的日志管理工具。我们还将学习日志如何在 Loggly 中进行整合,以便进行简化的监控和分析。

2. Loggly 简要介绍

假设有一个业务服务运行着多个分布式、高可用的关键应用程序。通常,应用程序由分布在私有云和公有云中的微服务集群组成。

在这种复杂的设置下,集中化所有系统生成的日志是必不可少的。此外,从多个源获取日志并在整合后运行分析,可以为开发人员和支持团队提供有价值的可操作洞察。而且,它还提供丰富、易于使用和可定制的可视化仪表板。因此,这将帮助他们高效地故障排除和修复问题,并满足 SLA 要求。

Loggly 是 Solarwinds 提供的基于云的 SaaS 日志管理工具,提供许多功能

loggly tools

3. 前置要求

让我们首先创建一个免费的 30 天试用 Loggly 账户 创建账户后,我们可以访问一个 Loggly SaaS 实例,URL 为 https://www.<>.loggly.com。

例如,在本教程中,我们创建了一个免费的 https://www.baeldung.loggly.com 账户:

loggly console 1

该门户用户友好,无缝地引导完成不同日志源的设置过程:

loggly sources

此外,还有一个向导可用于指导设置不同环境的日志源:

Loggly wizard

让我们按照向导中的步骤进行设置过程。

Log4j 2 和 Logback 库支持通过 HTTPS 发送日志事件。但是,对于 Log4j,在某些情况下,我们可能需要在系统上运行一个实用程序来将日志转发到 Loggly。在 Linux 中,rsyslog 实用程序可以扮演这个角色。因此,让我们首先配置 syslog 守护进程:

configure rsyslog

首先,我们运行 curl 命令下载 configure-linux.sh 脚本文件,然后通过从 Loggly 控制台复制命令来运行它:

configure linux

之后,我们在 /etc/rsyslog.conf 文件中取消注释一些配置,以启用在端口 514 上通过 UDP 传输日志:

enable udp

然后,我们重启 rsyslog 以应用配置更改:

restart service

最后,将应用程序日志发送到 Loggly 的最简单和最通用的方法是在托管服务器上设置文件监视作业。在 Linux 服务器上,Syslog 守护进程 可以帮助实现这一点。而在 Windows 服务器上,我们可以通过设置 Nxlog 来实现。

此外,我们可以通过运行 logger 实用程序向 Loggly 推送测试事件来验证设置:

logger event

最后,我们通过登录 Loggly 控制台来搜索事件:

loggly search

通常,日志事件会立即出现在 Loggly 上。但是,根据网络带宽和 Loggly 服务器的负载,可能会有延迟。

4. 使用 Log4j 库的应用程序 Loggly 配置

在开始本主题之前,我们必须注意 Log4j 1 已被报告存在严重漏洞,因此最好避免使用它。

首先,我们输入 Maven 依赖,将 Loggly syslog appender 添加到 Log4j Java 应用程序:

<dependency>
    <groupId>com.github.loggly.log4jSyslogWriter64k</groupId>
    <artifactId>log4jSyslogWriter64k</artifactId>
    <version>2.0.0</version>
</dependency>

接下来,我们将在 log4j.properties 文件中使用 SyslogAppender64k

log4j.rootLogger=INFO, SYSLOG

log4j.appender.SYSLOG=com.github.loggly.log4j.SyslogAppender64k
log4j.appender.SYSLOG.SyslogHost=localhost
log4j.appender.SYSLOG.Facility=Local3
log4j.appender.SYSLOG.Header=true
log4j.appender.SYSLOG.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.SYSLOG.layout.ConversionPattern=baeldung-java-app %d{ISO8601}{GMT} %p %t %c %M - %m%n

log4j.properties 文件中,我们可以将 baeldung-java-app 替换为与转换模式属性键对应的任何其他自定义应用程序名称。这有助于在 Loggly 日志浏览器 中识别日志。这个 syslog appender 将这些消息写入在本地主机上运行的 syslog 守护进程。

完成前置设置后,我们可以在应用程序中编写一些具有不同日志级别的 logger 语句:

public class LogglyLog4jLiveTest {

    private static final Logger logger = Logger.getLogger(LogglyLog4jUnitTest.class);

    @Test
    void givenLoggly_whenLogEvent_thenPushEventToLoggly() {
        logger.info("This is a test info message");
        logger.debug("This is a test debug message");
        logger.error("This is a test error message");
    }
}

最终,当应用程序运行时,日志会被推送到 Loggly 并在其日志浏览器屏幕上可见:

baeldung java app log4j1

5. 使用 Log4j 2 库的应用程序 Loggly 配置

如常,让我们从 Log4j 2 Java 应用程序的 Maven 依赖 开始:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.23.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.23.1</version>
</dependency>

接下来,我们将定义 log4j2.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Socket name="Loggly" host="localhost" port="514" protocol="UDP">
            <PatternLayout>
                <pattern>${hostName} baeldung-java-app %d{yyyy-MM-dd HH:mm:ss,SSS}{GMT} %p %t %c.%M - %m%n</pattern>
            </PatternLayout>
        </Socket>
    </Appenders>
    <Loggers>
        <Root level="DEBUG">
            <AppenderRef ref="Loggly"/>
        </Root>
    </Loggers>
</Configuration>

log4j2.xml 文件中的 Loggly Socket appender 通过 UDP 将日志写入 rsyslog 实用程序。

继续,让我们来看包含 logger 语句的 Java 程序:

public class LogglyLog4j2LiveTest {

    private static final Logger logger = LogManager.getLogger(LogglyLog4j2UnitTest.class);

    @Test
    void givenLoggly_thenLogEvent_thenPushErrorEventToLoggly() {
        logger.info("This is a log4j2 test info message");
        logger.debug("This is a log4j2 test debug message");
        logger.error("This is a log4j2 test error message");
    }
}

最终,当应用程序运行时,日志事件会出现在 Loggly 日志浏览器屏幕上:

loggly log4j2 explore

除了 socket appender,我们还可以在 log4j2.xml 文件中使用 HTTP appender 将日志推送到 Loggly

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Http name="Loggly" url="https://logs-01.loggly.com/inputs/TOKEN/tag/java">
            <PatternLayout>
                <pattern>${hostName} %d{yyyy-MM-dd HH:mm:ss,SSS}{GMT} %p %t %c.%M - %m%n</pattern>
            </PatternLayout>
        </Http>
    </Appenders>
    <Loggers>
        <Root level="DEBUG">
            <AppenderRef ref="Loggly"/>
        </Root>
    </Loggers>
</Configuration>

此外,URL 中使用的身份验证令牌可以从 Loggly 门户复制:

Customer token

如常,当程序运行时,它会通过 HTTP 将日志发布到 Loggly:

logger event http appender

6. 使用 Logback 库的应用程序 Loggly 配置

在使用 Logback 库进行日志记录的应用程序中,我们必须为 Loggly 扩展添加 Maven 依赖

<dependency>
    <groupId>org.logback-extensions</groupId>
    <artifactId>logback-ext-loggly</artifactId>
    <version>0.1.5</version>
</dependency>

接下来,我们将定义 logback.xml 文件:

<configuration debug="true">
    <appender name="loggly" class="ch.qos.logback.ext.loggly.LogglyAppender">
        <endpointUrl>https://logs-01.loggly.com/inputs/a3a21667-e23a-4378-b0b4-f2260ecfc25b/tag/logback</endpointUrl>
        <pattern>%d{"ISO8601", UTC} %p %t %c{0}.%M - %m%n</pattern>
    </appender>
    <root level="debug">
        <appender-ref ref="loggly"/>
    </root>
</configuration>

logback.xml 文件使用了来自 logback loggly 扩展库 的自定义 LogglyAppender在某些情况下,日志事件创建的频率可能很高。因此,在这种情况下,我们可以借助 ch.qos.logback.ext.loggly.LogglyBatchAppender 将多行日志事件批量发送到 Loggly 批量端点 https://logs-01.loggly.com/bulk/TOKEN/tag/bulk/。

与基本的 LogglyAppender 类似,我们必须在 logback.xml 文件中指定批量 appender 和批量端点 URL:

<configuration debug="true">
    <appender name="loggly" class="ch.qos.logback.ext.loggly.LogglyBatchAppender">
        <endpointUrl>https://logs-01.loggly.com/bulk/a3a21667-e23a-4378-b0b4-f2260ecfc25b/tag/bulk</endpointUrl>
        <pattern>%d{"ISO8601", UTC} %p %t %c %M - %m%n</pattern>
    </appender>
    <root level="info">
        <appender-ref ref="loggly" />
    </root>
</configuration>

但是,这个 appender 每批最多可以发送 5 MB,每个事件最多 1 MB。如前一节所述,我们可以从 Customer Tokens 页面下载 TOKEN

完成前置要求后,让我们来看包含 logger 语句的 Java 程序:

public class LogglyLogbackLiveTest {

    Logger logger = LoggerFactory.getLogger(LogglyLogbackUnitTest.class);

    @Test
    void givenLoggly_whenLogEvent_thenPushEventToLoggly() {
        logger.info("This is a logback test info message");
        logger.debug("This is a logback test debug message");
        logger.error("This is a logback test error message");
    }
}

该程序使用了 SLF4J 框架的 Logback 实现。现在,让我们运行测试程序并检查 Loggly 日志浏览器:

loggly logback explorer

如预期的那样,日志事件注册在日志浏览器上。

7. 总结

在本文中,我们讨论了设置 Java 应用程序将其日志发送到 SolarWinds Loggly 的方法。

令人印象深刻的是,Loggly 门户非常详细地记录了设置过程,并且有一个向导可以进一步加快这个过程。此外,故障排除过程也包含在在线指南中。


原始标题:Monitor Java Application Logs With Loggly | Baeldung