配置日志

Solr 日志是了解系统中发生情况的关键方式。有几种方法可以调整默认的日志配置。

临时日志设置

在需要时,有几种方法可以临时更改日志级别。

日志屏幕

您可以使用管理用户界面临时更改 Solr 的日志输出量。在左侧菜单中选择 日志] 链接。

请注意,日志级别也会在下次 Solr 重启时重置。

Logging Screen
图 1. 日志屏幕

管理 Web 界面的这部分允许您为许多不同的日志类别设置日志级别。幸运的是,任何 未设置 的类别都将具有其父级的日志级别。这使得可以通过调整其父级的日志级别来一次更改多个类别。

当您选择菜单:日志[级别]时,您会看到以下菜单

image
图 2. 日志级别菜单

Solr 类以目录树结构显示在左列中,表示类路径。当前级别显示在右列中。

目录显示其当前的日志级别。以黄色突出显示的行表示该类当前已启用日志记录。日志级别菜单浮动在这些之上。要为特定目录设置日志级别,请单击右列中的当前级别,此时将出现日志级别菜单。选择所需日志级别旁边的按钮。

日志级别更改将分发到集群中的所有节点。

可能的日志级别如下

级别 结果

ALL

报告所有内容。

TRACE

报告所有内容,但最不重要的消息除外。

DEBUG

报告配置错误。

INFO

报告所有内容,但正常状态除外。

WARN

报告所有警告。

ERROR

仅报告最严重的警告。

FATAL

仅报告致命事件。

OFF

关闭日志记录。

UNSET

删除以前的日志设置。

允许一次进行多个设置。

日志级别 API

还有一种方法可以将 REST 命令发送到 admin/info/logging 端点来执行相同的操作。

示例

  • V1 API

  • V2 API

curl -X GET "https://127.0.0.1:8983/solr/admin/info/logging?set=root:WARN"
curl -X PUT https://127.0.0.1:8983/api/node/logging/levels -H 'Content-Type: application/json' -d '
  [
    {"logger": "root", "level": "WARN"}
  ]
'

在启动时选择日志级别

您可以在启动 Solr 时临时选择不同的日志级别。有两种方法

第一种方法是在启动 Solr 之前设置 SOLR_LOG_LEVEL 环境变量,或者将相同的变量放置在 bin/solr.in.shbin/solr.in.cmd 中。该变量必须包含一个大写字符串,其中包含支持的日志级别(见上文)。

第二种方法是使用 -v 或 -q 选项启动 Solr,有关详细信息,请参见 Solr 控制脚本参考。示例

# Start with verbose (DEBUG) looging
bin/solr start -f -v
# Start with quiet (WARN) logging
bin/solr start -f -q

永久日志设置

Solr 使用 Log4J 版本 2.21.0 进行日志记录,该版本使用 server/resources/log4j2.xml 进行配置。花点时间检查 log4j2.xml 文件的内容,以便您熟悉其结构。

默认情况下,Solr 日志消息将写入到 SOLR_LOGS_DIR/solr.log。可以通过 修改 <PatternLayout/> 中使用的模式,或者通过更改布局实现来更改日志消息的格式——例如,可以使用 <JsonTemplateLayout/> 来配置 JSON 格式的日志文件。

当您准备在生产环境中部署 Solr 时,请将变量 SOLR_LOGS_DIR 设置为您希望 Solr 写入日志文件的位置,例如 /var/solr/logs。您可能还需要调整 log4j2.xml 文件。请注意,如果您按照将 Solr 投入生产中提供的说明将 Solr 安装为服务,则请查看 /var/solr/log4j2.xml,而不是默认的 server/resources 版本。

在前台启动 Solr (使用 -f 选项) 时,所有日志除了写入 solr.log 之外,还会发送到控制台。在后台启动 Solr 时,它会将所有 stdoutstderr 输出写入 solr-<端口号>-console.log 日志文件,并自动禁用 log4j2.xml 中配置的 CONSOLE 日志记录器,这与您手动从 rootLogger 中删除 CONSOLE appender 的效果相同。

此外,在 log4j2.xml 中,如果默认的 32MB 日志轮换大小阈值对于生产服务器来说太小,则应将其增加到更大的值(例如 100MB 或更大)。

<SizeBasedTriggeringPolicy size="100 MB"/>

当大小达到 20MB 时,JVM 会轮换 Java 垃圾回收日志,最多保留 9 代。

每次启动或重启 Solr 时,log4j2 都会执行日志轮换。

记录慢查询

对于高容量搜索应用程序,记录每个查询可能会产生大量的日志,并且根据容量的大小,可能会影响性能。如果您挖掘这些日志以获取有关应用程序的更多见解,那么记录每个查询请求可能很有用。

另一方面,如果您只关心与请求相关的警告和错误消息,则可以将日志详细程度设置为 WARN。但是,这会带来一个潜在问题,即您不会知道是否有任何查询很慢,因为慢查询仍然以 INFO 级别记录。

Solr 提供了一种方法,可以将日志详细程度阈值设置为 WARN,并且能够设置一个延迟阈值,超过该阈值的请求将被视为“慢”请求,并将该请求以 WARN 级别记录,以帮助您识别应用程序中的慢查询。要启用此行为,请在 solrconfig.xmlquery 部分中配置 <slowQueryThresholdMillis> 元素。

<slowQueryThresholdMillis>1000</slowQueryThresholdMillis>

任何耗时超过指定阈值的查询都将以 WARN 级别作为“慢”查询记录。您可以在名为 solr_slow_requests.log 的日志文件中找到所有这些查询,该文件位于您的 SOLR_LOGS_DIR 中(有关定义日志位置的更多信息,请参阅永久日志设置)。

记录选定的请求参数

除了上述日志选项外,还可以使用名为 logParamsList 的附加请求参数仅记录选定的请求参数列表(例如,与查询一起发送的参数)。有关更多信息,请参阅有关 logParamsList 参数的部分。

SolrCore 上的选择性日志记录

Solr 使用 o.a.s.c.SolrCore.Request 以 INFO 级别记录所有核心请求。可以通过将这些日志记录器的级别更改为 WARN 或 ERROR 来完全禁用此功能,或者通过在 log4j2.xml 中的请求路径上使用 MarkerFilter 来进行更具选择性的禁用。

例如

<Logger name="org.apache.solr.core.SolrCore.Request" level="info">
  <Filters>
    <MarkerFilter marker="/get" onMatch="DENY" onMismatch="NEUTRAL"/>
    <MarkerFilter marker="/replication" onMatch="DENY" onMismatch="NEUTRAL"/>
  </Filters>
</Logger>

请求日志记录

默认情况下,每个传入的 HTTP(s) 请求都会以标准的 NCSA 格式 记录在名为 $SOLR_LOG_DIR/<yyyy_mm_dd>.request.log 的文件中,并按天滚动。默认情况下,保留 3 天的请求日志。您可以通过环境变量或在 solr.in.sh/solr.in.cmd 中设置 SOLR_REQUESTLOG_ENABLED=false 来禁用请求日志记录。您可以通过系统属性 -Dsolr.log.requestlog.retaindays 更改保留的天数。