TT Bigdata TT Bigdata
首页
  • 部署专题

    • 常规安装
    • 一键部署
  • 组件安装

    • 常规&高可用
  • 版本专题

    • 更新说明
  • Ambari-Env

    • 环境准备
    • 开始使用
  • 组件编译

    • 专区—Ambari
    • 专区—Bigtop-官方组件
    • 专区—Bigtop-扩展组件
  • 报错解决

    • 专区—Ambari
    • 专区—Bigtop
  • 其他技巧

    • Maven镜像加速
    • Gradle镜像加速
    • Bower镜像加速
    • 虚拟环境思路
    • R环境安装+一键安装脚本
    • Ivy配置私有镜像仓库
    • Node.js 多版本共存方案
    • Ambari Web本地启动
    • Npm镜像加速
    • PostgreSQL快速安装
    • Temurin JDK 23快速安装
  • 成神之路

    • 专区—Ambari
    • 专区—Bigtop
  • 集成案例

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 持续整理...
  • 核心代码

    • 各组件代码
    • 通用代码模板
  • 国产化&其他系统

    • Rocky系列
    • Ubuntu系列
  • 生产调优

    • 组件调优指南
    • 1v1指导调优
  • 支持&共建

    • 蓝图愿景
    • 技术支持
    • 合作共建
登陆
GitHub (opens new window)

JaneTTR

数据酿造智慧,每一滴都是沉淀!
首页
  • 部署专题

    • 常规安装
    • 一键部署
  • 组件安装

    • 常规&高可用
  • 版本专题

    • 更新说明
  • Ambari-Env

    • 环境准备
    • 开始使用
  • 组件编译

    • 专区—Ambari
    • 专区—Bigtop-官方组件
    • 专区—Bigtop-扩展组件
  • 报错解决

    • 专区—Ambari
    • 专区—Bigtop
  • 其他技巧

    • Maven镜像加速
    • Gradle镜像加速
    • Bower镜像加速
    • 虚拟环境思路
    • R环境安装+一键安装脚本
    • Ivy配置私有镜像仓库
    • Node.js 多版本共存方案
    • Ambari Web本地启动
    • Npm镜像加速
    • PostgreSQL快速安装
    • Temurin JDK 23快速安装
  • 成神之路

    • 专区—Ambari
    • 专区—Bigtop
  • 集成案例

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 持续整理...
  • 核心代码

    • 各组件代码
    • 通用代码模板
  • 国产化&其他系统

    • Rocky系列
    • Ubuntu系列
  • 生产调优

    • 组件调优指南
    • 1v1指导调优
  • 支持&共建

    • 蓝图愿景
    • 技术支持
    • 合作共建
登陆
GitHub (opens new window)
  • 案例-Ambari重启失败

  • 案例-数据库连接问题

  • 案例-日志级别控制问题

    • 解读-Ambari3.0.0无法调整日志输出级别
      • 现象复盘
      • 启动命令分析
      • 配置文件疑点定位
      • 依赖核查与实现原理分析
      • 处理办法
        • 一、临时处理(已部署环境)
        • 二、永久处理(源码可控场景)
      • 配置生效后效果对比
    • 解决-临时处理日志级别不生效
    • 解决-源码级处理日志不生效
  • 案例-找不到snappy-devel

  • SYS-Rocky
  • 案例-日志级别控制问题
JaneTTR
2025-05-25
目录

解读-Ambari3.0.0无法调整日志输出级别

# 现象复盘

在 Ambari 3.0.0 的安装部署过程中,很多同学会遇到所有日志都只输出到 ambari-server.out ,无法像预期一样按照级别或类型拆分,尤其是调试日志(DEBUG)异常多,定位问题时十分头疼。

image-20250617161808146

如上图所示,无论是 INFO 还是 DEBUG,全都混杂输出到 out 文件,几万行日志一览无余,查找关键信息非常耗时。

这不仅浪费磁盘空间,还让日志分析、监控告警等后续环节全部失效。尤其是在生产环境中,日志不可控将成为合规与安全的大隐患。

# 启动命令分析

接下来我们通过 ps 命令查看服务实际启动参数:

image-20250617163031220

上图截图反映出实际启动命令及参数,能帮助我们判断日志配置与依赖注入点。

命令行内容如下:

/usr/jdk64/jdk17/bin/java -server -XX:NewRatio=3 \
  --add-opens java.base/java.lang=ALL-UNNAMED \
  --add-opens java.base/java.util.regex=ALL-UNNAMED \
  --add-opens java.base/java.util=ALL-UNNAMED \
  --add-opens java.base/java.lang.reflect=ALL-UNNAMED \
  -Xms512m -Xmx2048m \
  -Djava.security.auth.login.config=/etc/ambari-server/conf/krb5JAASLogin.conf \
  -Djava.security.krb5.conf=/etc/krb5.conf \
  -Djavax.security.auth.useSubjectCredsOnly=false \
  -Dcom.sun.jndi.ldap.connect.pool.protocol="plain ssl" \
  -Dcom.sun.jndi.ldap.connect.pool.maxsize=20 \
  -Dcom.sun.jndi.ldap.connect.pool.timeout=300000 \
  -cp "/etc/ambari-server/conf:/usr/lib/ambari-server/*:/usr/share/java/mysql-connector-java.jar" \
  org.apache.ambari.server.controller.AmbariServer
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 配置文件疑点定位

首先想到的当然是 log4j.properties 配置,看似一切都很标准:

image-20250617162416816

# Copyright 2011 The Apache Software Foundation
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Define some default values that can be overridden by system properties
# Root logger option
ambari.root.dir=/
ambari.log.dir=${ambari.root.dir}/var/log/ambari-server
ambari.log.file=ambari-server.log
ambari.config-changes.file=ambari-config-changes.log
ambari.alerts.file=ambari-alerts.log
ambari.eclipselink.file=ambari-eclipselink.log
ambari.audit.file=ambari-audit.log
ambari.dbcheck.file=ambari-server-check-database.log

log4j.rootLogger=INFO,file

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=${ambari.log.dir}/${ambari.log.file}
log4j.appender.file.MaxFileSize=80MB
log4j.appender.file.MaxBackupIndex=60
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ISO8601} %5p [%t] %c{1}:%L - %m%n

# Log config changes
log4j.logger.configchange=INFO,configchange
log4j.additivity.configchange=false
log4j.appender.configchange=org.apache.log4j.FileAppender
log4j.appender.configchange.File=${ambari.log.dir}/${ambari.config-changes.file}
log4j.appender.configchange.layout=org.apache.log4j.PatternLayout
log4j.appender.configchange.layout.ConversionPattern=%d{ISO8601} %5p - %m%n

# Log alert state changes
log4j.logger.alerts=INFO,alerts
log4j.additivity.alerts=false
log4j.appender.alerts=org.apache.log4j.FileAppender
log4j.appender.alerts.File=${ambari.log.dir}/${ambari.alerts.file}
log4j.appender.alerts.layout=org.apache.log4j.PatternLayout
log4j.appender.alerts.layout.ConversionPattern=%d{ISO8601} %m%n

# Log database check process
log4j.logger.org.apache.ambari.server.checks.DatabaseConsistencyChecker=INFO, dbcheck
log4j.additivity.org.apache.ambari.server.checks.DatabaseConsistencyChecker=false
log4j.appender.dbcheck=org.apache.log4j.FileAppender
log4j.appender.dbcheck.File=${ambari.log.dir}/${ambari.dbcheck.file}
log4j.appender.dbcheck.layout=org.apache.log4j.PatternLayout
log4j.appender.dbcheck.layout.ConversionPattern=%d{ISO8601} %5p - %m%n

log4j.logger.org.apache.ambari.server.checks.DatabaseConsistencyCheckHelper=INFO, dbcheckhelper
log4j.additivity.org.apache.ambari.server.checks.DatabaseConsistencyCheckHelper=false
log4j.appender.dbcheckhelper=org.apache.log4j.FileAppender
log4j.appender.dbcheckhelper.File=${ambari.log.dir}/${ambari.dbcheck.file}
log4j.appender.dbcheckhelper.layout=org.apache.log4j.PatternLayout
log4j.appender.dbcheckhelper.layout.ConversionPattern=%d{ISO8601} %5p - %m%n

# EclipsLink -> slf4j bridge
log4j.logger.eclipselink=TRACE,eclipselink
log4j.additivity.eclipselink=false
log4j.appender.eclipselink=org.apache.log4j.RollingFileAppender
log4j.appender.eclipselink.File=${ambari.log.dir}/${ambari.eclipselink.file}
log4j.appender.eclipselink.MaxFileSize=50MB
log4j.appender.eclipselink.MaxBackupIndex=10
log4j.appender.eclipselink.layout=org.apache.log4j.PatternLayout
log4j.appender.eclipselink.layout.ConversionPattern=%m%n

# Jersey
log4j.logger.com.sun.jersey=WARN,file
log4j.logger.org.glassfish.jersey=WARN,file

# Jetty
log4j.logger.org.eclipse.jetty=WARN,file

# Audit logging
log4j.logger.audit=INFO,audit
log4j.additivity.audit=false
log4j.appender.audit=org.apache.log4j.RollingFileAppender
log4j.appender.audit.File=${ambari.log.dir}/${ambari.audit.file}
log4j.appender.audit.FileNamePattern=${ambari.log.dir}/${ambari.audit.file}-%i.log.gz
log4j.appender.audit.MaxFileSize=50000000
log4j.appender.audit.MaxBackupIndex=13
log4j.appender.audit.layout=org.apache.log4j.PatternLayout
log4j.appender.audit.layout.ConversionPattern=%m%n

log4j.logger.org.apache.hadoop.yarn.client=WARN
log4j.logger.org.apache.ambari.server.security.authorization=WARN

log4j.logger.org.apache.ambari.server.security.authorization.AuthorizationHelper=INFO
log4j.logger.org.apache.ambari.server.security.authorization.AmbariLdapBindAuthenticator=INFO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104

图片清楚展示了 log4j.properties 文件存在且配置了 INFO 级别,但实际无效。

提示

如果只是单纯 INFO 没生效,应该会有部分日志正常过滤,但此处 DEBUG 级别日志仍然全量打印,意味着 log4j.properties 被完全忽略。

# 依赖核查与实现原理分析

进一步,去到 /usr/lib/ambari-server/ 目录寻找日志相关依赖:

image-20250617162759091

从上图可以看到,目录中没有任何 log4j 的 jar 包。

这直接说明本质根因 Ambari 3.0.0 编译包默认已移除了 log4j,导致 log4j.properties 配置完全不生效,日志系统自动回退为 logback(slf4j 默认实现)。

警告

缺失 log4j 依赖的情况下,所有日志都被 logback 以默认规则输出,即全部写到 out 文件、级别不可控,相关配置形同虚设。

# 处理办法

针对 Ambari 3.0.0 日志失控问题,可以根据实际部署状态选择两种修复策略,分别应对线上应急和根因彻底消除。

注意

请根据你当前的实际环境选择合适方案:已上线部署建议优先临时修复,源代码可控时推荐彻底根治!

处理类型 适用场景 操作难度 持续效果 详细方案
临时处理 服务已部署、无法重编译 简单 立刻生效,但后续升级需关注 临时修复操作步骤 线上应急
永久处理 可重新打包或源码编译 稍高(需重构依赖) 一劳永逸 彻底根治操作方案 推荐

# 一、临时处理(已部署环境)

对于已经上线的集群和服务节点,不建议直接更换 jar 或二次打包:

  • 步骤清单与注意事项详见 临时修复操作步骤
  • 此方法操作简单,风险极低,建议优先尝试!

# 二、永久处理(源码可控场景)

对于还在开发或自定义编译的场景,一次性解决日志体系混乱:

  • 完整实操可见 彻底根治操作方案
  • 推荐在升级或自研包交付前进行,保证交付质量和可维护性

笔记

永久方案适合对组件有完整打包、发布和升级流程的团队,从根本上统一日志输出与依赖体系,提升未来二次开发的可控性。

# 配置生效后效果对比

最后,我们来直观感受下加了 logback.xml 之后日志治理带来的变化:

image-20250617164132820

如上图,日志文件不仅自动归档按天切分,DEBUG、INFO 级别瞬间被规范控制,开发与运维查找关键信息再也不用海量翻找。

这一方式彻底解决了 Ambari 3.0.0 环境下日志失控的历史遗留问题,为后续所有定制开发、平台集成扫清障碍运维推荐。

#Ambari#日志分流#logback#log4j#构建报错#RockyLinux
解读-安装完毕后出现Unable to load version data from server
解决-临时处理日志级别不生效

← 解读-安装完毕后出现Unable to load version data from server 解决-临时处理日志级别不生效→

最近更新
01
bigtop-select 打包缺 compat 报错修复 deb
07-16
02
bigtop-select 打包缺 control 文件报错修复 deb
07-16
03
首次编译-环境初始化 必装
07-16
更多文章>
Theme by Vdoing | Copyright © 2017-2025 JaneTTR | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式