数据块pyspark上的log4j2 Loki附加器

kt06eoxx  于 2022-11-06  发布在  Spark
关注(0)|答案(1)|浏览(217)

我正在尝试将日志从我的Databricks群集发送到Loki示例using this appender
1.我添加了一个init script(见下文),它修改了驱动程序和执行器的log4j2.xml文件。
1.我在群集配置的库选项卡中添加了一个库。添加为Maven库。我可以在日志中看到它已成功下载并安装。
1.执行echo "" >> log4j2.xml并等待30秒以重新读取配置。同样的错误。

init脚本
for f in /databricks/spark/dbconf/log4j/executor/log4j2.xml /databricks/spark/dbconf/log4j/driver/log4j2.xml; do
  sed -i 's/<Configuration /<Configuration monitorInterval="30" /' "$f"
  sed -i 's/packages="com.databricks.logging"/packages="pl.tkowalcz.tjahzi.log4j2, com.databricks.logging"/'  "$f"
  sed -i 's~<Appenders>~<Appenders>\n    <Loki name="Loki" bufferSizeMegabytes="64">\n      <host>loki.atops.abc.com</host>\n      <port>3100</port>\n\n      <ThresholdFilter level="ALL"/>\n      <PatternLayout>\n        <Pattern>%X{tid} [%t] %d{MM-dd HH:mm:ss.SSS} %5p %c{1} - %m%n%exception{full}</Pattern>\n      </PatternLayout>\n\n      <Header name="X-Scope-OrgID" value="ABC"/>\n      <Label name="server" value="Databricks"/>\n      <Label name="foo" value="bar"/>\n      <Label name="system" value="abc"/>\n      <LogLevelLabel>log_level</LogLevelLabel>\n    </Loki>\n~' $f
  sed -i 's/\(<Root.*\)/\1\n      <AppenderRef ref="Loki"\/>/' "$f"
done

在集群的stdout中,我看到以下错误(我认为这意味着jar不知何故不在类路径中,或者它不知何故在寻找错误的类):

ERROR Error processing element Loki ([Appenders: null]): CLASS_NOT_FOUND
ERROR Unable to locate appender "Loki" for logger config "root"

还尝试将类名添加到Appender规范:
<Loki name="Loki" class="pl.tkowalcz.tjahzi.log4j2.LokiAppender" bufferSizeMegabytes="64">
而不是
<Loki name="Loki" bufferSizeMegabytes="64">
同样的错误。
find /databricks -name '*log4j2-appender-nodep*' -type f找不到任何内容。
我还尝试下载jar文件,将其放在dbfs中,然后安装为JAR库(而不是MAVEN库):

$ databricks fs cp local/log4j2-appender-nodep-0.9.23.jar dbfs:/Shared/log4j2-appender-nodep-0.9.23.jar
$ databricks libraries install --cluster-id 1-2-345 --jar "dbfs:/Shared/log4j2-appender-nodep-0.9.23.jar"

同样的错误。
我可以使用curl从集群发布到Loki示例,我可以在Grafana GUI中看到此日志:

ds=$(date +%s%N) && \
echo $ds && \
curl -v -H "Content-Type: application/json" -XPOST -s "http://loki.atops.abc.com:3100/loki/api/v1/push" --data-raw '{"streams": [{ "stream": { "foo": "bar2", "system": "abc" }, "values": [ [ "'$ds'", "'$ds': testing, testing" ] ] }]}'

以下是init脚本之后的conf文件内容:cat /databricks/spark/dbconf/log4j/driver/log4j2.xml

<?xml version="1.0" encoding="UTF-8"?><Configuration monitorInterval="30" status="INFO" packages="pl.tkowalcz.tjahzi.log4j2, com.databricks.logging" shutdownHook="disable">
  <Appenders>
    <Loki name="Loki" bufferSizeMegabytes="64">
      <host>loki.atops.abc.com</host>
      <port>3100</port>

      <ThresholdFilter level="ALL"/>
      <PatternLayout>
        <Pattern>%X{tid} [%t] %d{MM-dd HH:mm:ss.SSS} %5p %c{1} - %m%n%exception{full}</Pattern>
      </PatternLayout>

      <Header name="X-Scope-OrgID" value="ABC"/>
      <Label name="server" value="Databricks"/>
      <Label name="foo" value="bar"/>
      <Label name="system" value="abc"/>

      <LogLevelLabel>log_level</LogLevelLabel>
    </Loki>

    <RollingFile name="publicFile.rolling" fileName="logs/log4j-active.log" filePattern="logs/log4j-%d{yyyy-MM-dd-HH}.log.gz" immediateFlush="true" bufferedIO="false" bufferSize="8192" createOnDemand="true">
      <Policies>
        <TimeBasedTriggeringPolicy/>
      </Policies>
      <PatternLayout pattern="%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n%ex"/>
    </RollingFile>

    ---snip---

  </Appenders>
  <Loggers>
    <Root level="INFO">
      <AppenderRef ref="Loki"/>
      <AppenderRef ref="publicFile.rolling.rewrite"/>
    </Root>
    <Logger name="privateLog" level="INFO" additivity="false">
      <AppenderRef ref="privateFile.rolling.rewrite"/>
    </Logger>
    ---snip---

  </Loggers>
</Configuration>
deyfvvtc

deyfvvtc1#

发生这种情况的最可能原因是log4j在集群启动时初始化,但您在Libraries UI中指定的库-它们在集群启动后安装,因此您的loki库在启动期间不可用。
解决方案是从您用于log4j配置的同一init脚本安装loki库-只需将库及其依赖项复制到/databricks/jars/文件夹(例如,从DBFS复制,该文件夹将可用于编写/dbfs/...脚本)。
例如,如果您已将jar文件上载到/dbfs/Shared/custom_jars/log4j2-appender-nodep-0.9.23.jar,则将以下内容添加到init脚本:


# !/bin/bash

cp /dbfs/Shared/custom_jars/log4j2-appender-nodep-0.9.23.jar /databricks/jars/

# other code to update log4j2.xml etc...

相关问题