1. 概述
本教程将介绍如何为使用各种日志库的 Java 应用程序配置 SolarWinds Loggly,这是一个基于云的日志管理工具。我们还将学习日志如何在 Loggly 中进行整合,以便进行简化的监控和分析。
2. Loggly 简要介绍
假设有一个业务服务运行着多个分布式、高可用的关键应用程序。通常,应用程序由分布在私有云和公有云中的微服务集群组成。
在这种复杂的设置下,集中化所有系统生成的日志是必不可少的。此外,从多个源获取日志并在整合后运行分析,可以为开发人员和支持团队提供有价值的可操作洞察。而且,它还提供丰富、易于使用和可定制的可视化仪表板。因此,这将帮助他们高效地故障排除和修复问题,并满足 SLA 要求。
Loggly 是 Solarwinds 提供的基于云的 SaaS 日志管理工具,提供许多功能:
3. 前置要求
让我们首先创建一个免费的 30 天试用 Loggly 账户。 创建账户后,我们可以访问一个 Loggly SaaS 实例,URL 为 https://www.<
例如,在本教程中,我们创建了一个免费的 https://www.baeldung.loggly.com 账户:
该门户用户友好,无缝地引导完成不同日志源的设置过程:
此外,还有一个向导可用于指导设置不同环境的日志源:
让我们按照向导中的步骤进行设置过程。
Log4j 2 和 Logback 库支持通过 HTTPS 发送日志事件。但是,对于 Log4j,在某些情况下,我们可能需要在系统上运行一个实用程序来将日志转发到 Loggly。在 Linux 中,rsyslog 实用程序可以扮演这个角色。因此,让我们首先配置 syslog 守护进程:
首先,我们运行 curl 命令下载 configure-linux.sh 脚本文件,然后通过从 Loggly 控制台复制命令来运行它:
之后,我们在 /etc/rsyslog.conf 文件中取消注释一些配置,以启用在端口 514 上通过 UDP 传输日志:
然后,我们重启 rsyslog 以应用配置更改:
最后,将应用程序日志发送到 Loggly 的最简单和最通用的方法是在托管服务器上设置文件监视作业。在 Linux 服务器上,Syslog 守护进程 可以帮助实现这一点。而在 Windows 服务器上,我们可以通过设置 Nxlog 来实现。
此外,我们可以通过运行 logger 实用程序向 Loggly 推送测试事件来验证设置:
最后,我们通过登录 Loggly 控制台来搜索事件:
通常,日志事件会立即出现在 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 并在其日志浏览器屏幕上可见:
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 日志浏览器屏幕上:
除了 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 门户复制:
如常,当程序运行时,它会通过 HTTP 将日志发布到 Loggly:
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 日志浏览器:
如预期的那样,日志事件注册在日志浏览器上。
7. 总结
在本文中,我们讨论了设置 Java 应用程序将其日志发送到 SolarWinds Loggly 的方法。
令人印象深刻的是,Loggly 门户非常详细地记录了设置过程,并且有一个向导可以进一步加快这个过程。此外,故障排除过程也包含在在线指南中。