解读-Ambari3.0.0无法调整日志输出级别
# 现象复盘
在 Ambari 3.0.0 的安装部署过程中,很多同学会遇到所有日志都只输出到 ambari-server.out ,无法像预期一样按照级别或类型拆分,尤其是调试日志(DEBUG)异常多,定位问题时十分头疼。
如上图所示,无论是 INFO 还是 DEBUG,全都混杂输出到 out 文件,几万行日志一览无余,查找关键信息非常耗时。
这不仅浪费磁盘空间,还让日志分析、监控告警等后续环节全部失效。尤其是在生产环境中,日志不可控将成为合规与安全的大隐患。
# 启动命令分析
接下来我们通过 ps 命令查看服务实际启动参数:
上图截图反映出实际启动命令及参数,能帮助我们判断日志配置与依赖注入点。
命令行内容如下:
/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
2
3
4
5
6
7
8
9
10
11
12
13
14
# 配置文件疑点定位
首先想到的当然是 log4j.properties 配置,看似一切都很标准:
# 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
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/
目录寻找日志相关依赖:
从上图可以看到,目录中没有任何 log4j 的 jar 包。
这直接说明本质根因 Ambari 3.0.0 编译包默认已移除了 log4j,导致 log4j.properties 配置完全不生效,日志系统自动回退为 logback(slf4j 默认实现)。
警告
缺失 log4j 依赖的情况下,所有日志都被 logback 以默认规则输出,即全部写到 out 文件、级别不可控,相关配置形同虚设。
# 处理办法
针对 Ambari 3.0.0 日志失控问题,可以根据实际部署状态选择两种修复策略,分别应对线上应急和根因彻底消除。
注意
请根据你当前的实际环境选择合适方案:已上线部署建议优先临时修复,源代码可控时推荐彻底根治!
处理类型 | 适用场景 | 操作难度 | 持续效果 | 详细方案 |
---|---|---|---|---|
临时处理 | 服务已部署、无法重编译 | 简单 | 立刻生效,但后续升级需关注 | 临时修复操作步骤 线上应急 |
永久处理 | 可重新打包或源码编译 | 稍高(需重构依赖) | 一劳永逸 | 彻底根治操作方案 推荐 |
# 一、临时处理(已部署环境)
对于已经上线的集群和服务节点,不建议直接更换 jar 或二次打包:
- 步骤清单与注意事项详见 临时修复操作步骤
- 此方法操作简单,风险极低,建议优先尝试!
# 二、永久处理(源码可控场景)
对于还在开发或自定义编译的场景,一次性解决日志体系混乱:
- 完整实操可见 彻底根治操作方案
- 推荐在升级或自研包交付前进行,保证交付质量和可维护性
笔记
永久方案适合对组件有完整打包、发布和升级流程的团队,从根本上统一日志输出与依赖体系,提升未来二次开发的可控性。
# 配置生效后效果对比
最后,我们来直观感受下加了 logback.xml 之后日志治理带来的变化:
如上图,日志文件不仅自动归档按天切分,DEBUG、INFO 级别瞬间被规范控制,开发与运维查找关键信息再也不用海量翻找。
这一方式彻底解决了 Ambari 3.0.0 环境下日志失控的历史遗留问题,为后续所有定制开发、平台集成扫清障碍运维推荐。
- 01
- bigtop-select 打包缺 compat 报错修复 deb07-16
- 02
- bigtop-select 打包缺 control 文件报错修复 deb07-16
- 03
- 首次编译-环境初始化 必装07-16