配置日志记录

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

临时日志记录设置

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

日志记录屏幕

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

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

Logging Screen
图 1. 日志记录屏幕

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

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

image
图 2. 日志级别菜单

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

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

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

可能的日志级别如下

级别 结果

全部

报告所有内容。

跟踪

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

DEBUG

报告配置错误。

INFO

报告除正常状态之外的所有内容。

WARN

报告所有警告。

ERROR

仅报告最严重的警告。

FATAL

仅报告致命事件。

OFF

关闭日志记录。

UNSET

移除之前的日志设置。

允许一次设置多个设置。

日志级别 API

还有一种方法是向 admin/info/logging 端点发送 REST 命令来执行相同操作。

示例

V1 API

curl -X GET "http://localhost:8983/solr/admin/info/logging?set=root:WARN"

V2 API

curl -X PUT http://localhost: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-<port>-console.log 中的日志文件,并自动禁用 log4j2.xml 中配置的 CONSOLE 记录器,其效果与您手动从 rootLogger 中删除 CONSOLE 追加器相同。

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

<SizeBasedTriggeringPolicy size="100 MB"/>

当大小达到 20M 时,Java 垃圾回收日志由 JVM 轮换,最多 9 代。

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

记录慢查询

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

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

Solr 提供了一种方法,可将日志详细级别阈值设置为 WARN,并且能够设置一个延迟阈值,高于该阈值时,请求会被视为“慢”,并将该请求以 WARN 级别记录到日志中,以帮助您识别应用程序中的慢查询。要启用此行为,请在 solrconfig.xml 的查询部分中配置 <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 更改保留的天数。