diff --git a/bin/zkCleanup.sh b/bin/zkCleanup.sh index 45532410e96..b6fe0e75841 100755 --- a/bin/zkCleanup.sh +++ b/bin/zkCleanup.sh @@ -43,11 +43,11 @@ ZOO_LOG_FILE=zookeeper-$USER-cleanup-$HOSTNAME.log if [ "x$ZOODATALOGDIR" = "x" ] then -"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "-Dzookeeper.log.file=${ZOO_LOG_FILE}" \ +"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.log.file=${ZOO_LOG_FILE}" \ -cp "$CLASSPATH" $JVMFLAGS \ org.apache.zookeeper.server.PurgeTxnLog "$ZOODATADIR" $* else -"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "-Dzookeeper.log.file=${ZOO_LOG_FILE}" \ +"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.log.file=${ZOO_LOG_FILE}" \ -cp "$CLASSPATH" $JVMFLAGS \ org.apache.zookeeper.server.PurgeTxnLog "$ZOODATALOGDIR" "$ZOODATADIR" $* fi diff --git a/bin/zkCli.cmd b/bin/zkCli.cmd index 807ffaa9e5c..7a4391dd9ff 100644 --- a/bin/zkCli.cmd +++ b/bin/zkCli.cmd @@ -20,7 +20,7 @@ call "%~dp0zkEnv.cmd" set ZOO_LOG_FILE=zookeeper-%USERNAME%-cli-%COMPUTERNAME%.log set ZOOMAIN=org.apache.zookeeper.ZooKeeperMain -call %JAVA% "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" "-Dzookeeper.log.file=%ZOO_LOG_FILE%" -cp "%CLASSPATH%" %ZOOMAIN% %* +call %JAVA% "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.log.file=%ZOO_LOG_FILE%" -cp "%CLASSPATH%" %ZOOMAIN% %* endlocal diff --git a/bin/zkCli.sh b/bin/zkCli.sh index ecf9a4525a0..3810e7f6880 100755 --- a/bin/zkCli.sh +++ b/bin/zkCli.sh @@ -38,6 +38,6 @@ fi ZOO_LOG_FILE=zookeeper-$USER-cli-$HOSTNAME.log -"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "-Dzookeeper.log.file=${ZOO_LOG_FILE}" \ +"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.log.file=${ZOO_LOG_FILE}" \ -cp "$CLASSPATH" $CLIENT_JVMFLAGS $JVMFLAGS \ org.apache.zookeeper.ZooKeeperMain "$@" diff --git a/bin/zkEnv.cmd b/bin/zkEnv.cmd index 68e231d7084..de9fc929b61 100644 --- a/bin/zkEnv.cmd +++ b/bin/zkEnv.cmd @@ -16,7 +16,6 @@ REM limitations under the License. set ZOOCFGDIR=%~dp0%..\conf set ZOO_LOG_DIR=%~dp0%..\logs -set ZOO_LOG4J_PROP=INFO,CONSOLE REM for sanity sake assume Java 1.6 REM see: http://java.sun.com/javase/6/docs/technotes/tools/windows/java.html diff --git a/bin/zkEnv.sh b/bin/zkEnv.sh index 8d93a50c7c0..0728c2e709f 100755 --- a/bin/zkEnv.sh +++ b/bin/zkEnv.sh @@ -70,11 +70,6 @@ then ZOO_LOG_DIR="$ZOOKEEPER_PREFIX/logs" fi -if [ "x${ZOO_LOG4J_PROP}" = "x" ] -then - ZOO_LOG4J_PROP="INFO,CONSOLE" -fi - if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then JAVA="$JAVA_HOME/bin/java" elif type -p java; then diff --git a/bin/zkServer.cmd b/bin/zkServer.cmd index b03a44386e7..07ac3a30244 100644 --- a/bin/zkServer.cmd +++ b/bin/zkServer.cmd @@ -21,6 +21,6 @@ set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain set ZOO_LOG_FILE=zookeeper-%USERNAME%-server-%COMPUTERNAME%.log echo on -call %JAVA% "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" "-Dzookeeper.log.file=%ZOO_LOG_FILE%" "-XX:+HeapDumpOnOutOfMemoryError" "-XX:OnOutOfMemoryError=cmd /c taskkill /pid %%%%p /t /f" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %* +call %JAVA% "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.log.file=%ZOO_LOG_FILE%" "-XX:+HeapDumpOnOutOfMemoryError" "-XX:OnOutOfMemoryError=cmd /c taskkill /pid %%%%p /t /f" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %* endlocal diff --git a/bin/zkServer.sh b/bin/zkServer.sh index 1a3cd359c27..977c1bbf8c6 100755 --- a/bin/zkServer.sh +++ b/bin/zkServer.sh @@ -162,7 +162,7 @@ start) fi fi nohup "$JAVA" $ZOO_DATADIR_AUTOCREATE "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" \ - "-Dzookeeper.log.file=${ZOO_LOG_FILE}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ + "-Dzookeeper.log.file=${ZOO_LOG_FILE}" \ -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p' \ -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null & if [ $? -eq 0 ] @@ -200,13 +200,13 @@ start-foreground) ZOO_CMD=("$JAVA") fi "${ZOO_CMD[@]}" $ZOO_DATADIR_AUTOCREATE "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" \ - "-Dzookeeper.log.file=${ZOO_LOG_FILE}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ + "-Dzookeeper.log.file=${ZOO_LOG_FILE}" \ -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p' \ -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" ;; print-cmd) echo "\"$JAVA\" $ZOO_DATADIR_AUTOCREATE -Dzookeeper.log.dir=\"${ZOO_LOG_DIR}\" \ - -Dzookeeper.log.file=\"${ZOO_LOG_FILE}\" -Dzookeeper.root.logger=\"${ZOO_LOG4J_PROP}\" \ + -Dzookeeper.log.file=\"${ZOO_LOG_FILE}\" \ -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p' \ -cp \"$CLASSPATH\" $JVMFLAGS $ZOOMAIN \"$ZOOCFG\" > \"$_ZOO_DAEMON_OUT\" 2>&1 < /dev/null" ;; @@ -287,7 +287,7 @@ status) fi fi echo "Client port found: $clientPort. Client address: $clientPortAddress. Client SSL: $isSSL." - STAT=`"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "-Dzookeeper.log.file=${ZOO_LOG_FILE}" \ + STAT=`"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.log.file=${ZOO_LOG_FILE}" \ -cp "$CLASSPATH" $CLIENT_JVMFLAGS $JVMFLAGS org.apache.zookeeper.client.FourLetterWordMain \ $clientPortAddress $clientPort srvr $isSSL 2> /dev/null \ | $GREP Mode` diff --git a/conf/log4j.properties b/conf/log4j.properties deleted file mode 100644 index 9e12a38d333..00000000000 --- a/conf/log4j.properties +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright 2012 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 -zookeeper.root.logger=INFO, CONSOLE - -zookeeper.console.threshold=INFO - -zookeeper.log.dir=. -zookeeper.log.file=zookeeper.log -zookeeper.log.threshold=INFO -zookeeper.log.maxfilesize=256MB -zookeeper.log.maxbackupindex=20 - -zookeeper.tracelog.dir=${zookeeper.log.dir} -zookeeper.tracelog.file=zookeeper_trace.log - -log4j.rootLogger=${zookeeper.root.logger} - -# -# console -# Add "console" to rootlogger above if you want to use this -# -log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender -log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold} -log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout -log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n - -# -# Add ROLLINGFILE to rootLogger to get log file output -# -log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender -log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold} -log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file} -log4j.appender.ROLLINGFILE.MaxFileSize=${zookeeper.log.maxfilesize} -log4j.appender.ROLLINGFILE.MaxBackupIndex=${zookeeper.log.maxbackupindex} -log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout -log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n - -# -# Add TRACEFILE to rootLogger to get log file output -# Log TRACE level and above messages to a log file -# -log4j.appender.TRACEFILE=org.apache.log4j.FileAppender -log4j.appender.TRACEFILE.Threshold=TRACE -log4j.appender.TRACEFILE.File=${zookeeper.tracelog.dir}/${zookeeper.tracelog.file} - -log4j.appender.TRACEFILE.layout=org.apache.log4j.PatternLayout -### Notice we are including log4j's NDC here (%x) -log4j.appender.TRACEFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L][%x] - %m%n -# -# zk audit logging -# -zookeeper.auditlog.file=zookeeper_audit.log -zookeeper.auditlog.threshold=INFO -audit.logger=INFO, RFAAUDIT -log4j.logger.org.apache.zookeeper.audit.Log4jAuditLogger=${audit.logger} -log4j.additivity.org.apache.zookeeper.audit.Log4jAuditLogger=false -log4j.appender.RFAAUDIT=org.apache.log4j.RollingFileAppender -log4j.appender.RFAAUDIT.File=${zookeeper.log.dir}/${zookeeper.auditlog.file} -log4j.appender.RFAAUDIT.layout=org.apache.log4j.PatternLayout -log4j.appender.RFAAUDIT.layout.ConversionPattern=%d{ISO8601} %p %c{2}: %m%n -log4j.appender.RFAAUDIT.Threshold=${zookeeper.auditlog.threshold} - -# Max log file size of 10MB -log4j.appender.RFAAUDIT.MaxFileSize=10MB -log4j.appender.RFAAUDIT.MaxBackupIndex=10 diff --git a/conf/logback.xml b/conf/logback.xml new file mode 100644 index 00000000000..84a53896954 --- /dev/null +++ b/conf/logback.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + %d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n + + + ${zookeeper.console.threshold} + + + + + + + + + + + + + + + + diff --git a/owaspSuppressions.xml b/owaspSuppressions.xml index 2565f0db148..5c4bc33bcf5 100644 --- a/owaspSuppressions.xml +++ b/owaspSuppressions.xml @@ -41,14 +41,4 @@ this writing --> CVE-2019-3826 - - - CVE-2019-17571 - - - - CVE-2020-9488 - diff --git a/pom.xml b/pom.xml index cd4449c1886..488b4c1249f 100755 --- a/pom.xml +++ b/pom.xml @@ -459,6 +459,7 @@ 1.7.30 + 1.2.10 0.12.0 1.48 5.6.2 @@ -577,6 +578,16 @@ log4j ${log4j.version} + + ch.qos.logback + logback-core + ${logback-version} + + + ch.qos.logback + logback-classic + ${logback-version} + org.jmockit jmockit diff --git a/zookeeper-docs/src/main/resources/markdown/zookeeperAdmin.md b/zookeeper-docs/src/main/resources/markdown/zookeeperAdmin.md index 3671f1eea4c..86c0631a2a4 100644 --- a/zookeeper-docs/src/main/resources/markdown/zookeeperAdmin.md +++ b/zookeeper-docs/src/main/resources/markdown/zookeeperAdmin.md @@ -1,5 +1,5 @@ + Change above configuration to customize the auditlog file, number of backups, max file size, custom audit logger etc. diff --git a/zookeeper-docs/src/main/resources/markdown/zookeeperInternals.md b/zookeeper-docs/src/main/resources/markdown/zookeeperInternals.md index 0505807e187..171f33ddb4c 100644 --- a/zookeeper-docs/src/main/resources/markdown/zookeeperInternals.md +++ b/zookeeper-docs/src/main/resources/markdown/zookeeperInternals.md @@ -1,5 +1,5 @@ + + + + + %d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n + + + INFO + + + + + + + diff --git a/zookeeper-server/pom.xml b/zookeeper-server/pom.xml index 4fd4f984c62..14c74ca637f 100755 --- a/zookeeper-server/pom.xml +++ b/zookeeper-server/pom.xml @@ -75,8 +75,12 @@ slf4j-api - org.slf4j - slf4j-log4j12 + ch.qos.logback + logback-core + + + ch.qos.logback + logback-classic org.eclipse.jetty @@ -118,10 +122,6 @@ metrics-core provided - - log4j - log4j - org.apache.kerby kerb-core diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/audit/Log4jAuditLogger.java b/zookeeper-server/src/main/java/org/apache/zookeeper/audit/Slf4jAuditLogger.java similarity index 87% rename from zookeeper-server/src/main/java/org/apache/zookeeper/audit/Log4jAuditLogger.java rename to zookeeper-server/src/main/java/org/apache/zookeeper/audit/Slf4jAuditLogger.java index c4efc1c4e08..b162e74ec0b 100644 --- a/zookeeper-server/src/main/java/org/apache/zookeeper/audit/Log4jAuditLogger.java +++ b/zookeeper-server/src/main/java/org/apache/zookeeper/audit/Slf4jAuditLogger.java @@ -22,10 +22,10 @@ import org.slf4j.LoggerFactory; /** - * Log4j based audit logger + * Slf4j based audit logger */ -public class Log4jAuditLogger implements AuditLogger { - private static final Logger LOG = LoggerFactory.getLogger(Log4jAuditLogger.class); +public class Slf4jAuditLogger implements AuditLogger { + private static final Logger LOG = LoggerFactory.getLogger(Slf4jAuditLogger.class); @Override public void logAuditEvent(AuditEvent auditEvent) { diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/audit/ZKAuditProvider.java b/zookeeper-server/src/main/java/org/apache/zookeeper/audit/ZKAuditProvider.java index 00646baf871..864d2366c97 100644 --- a/zookeeper-server/src/main/java/org/apache/zookeeper/audit/ZKAuditProvider.java +++ b/zookeeper-server/src/main/java/org/apache/zookeeper/audit/ZKAuditProvider.java @@ -46,7 +46,7 @@ public class ZKAuditProvider { private static AuditLogger getAuditLogger() { String auditLoggerClass = System.getProperty(AUDIT_IMPL_CLASS); if (auditLoggerClass == null) { - auditLoggerClass = Log4jAuditLogger.class.getName(); + auditLoggerClass = Slf4jAuditLogger.class.getName(); } try { Constructor clientCxnConstructor = Class.forName(auditLoggerClass) diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/ZooTrace.java b/zookeeper-server/src/main/java/org/apache/zookeeper/server/ZooTrace.java index e9d1eb15a3e..464d818adc8 100644 --- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/ZooTrace.java +++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/ZooTrace.java @@ -27,7 +27,7 @@ * This class encapsulates and centralizes tracing for the ZooKeeper server. * Trace messages go to the log with TRACE level. *

- * Log4j must be correctly configured to capture the TRACE messages. + * Logback must be correctly configured to capture the TRACE messages. */ public class ZooTrace { diff --git a/zookeeper-server/src/main/resources/NOTICE.txt b/zookeeper-server/src/main/resources/NOTICE.txt index 1b0fb951ccb..efdd6b43970 100644 --- a/zookeeper-server/src/main/resources/NOTICE.txt +++ b/zookeeper-server/src/main/resources/NOTICE.txt @@ -81,13 +81,13 @@ framework, which can be obtained at: * HOMEPAGE: * http://commons.apache.org/logging/ -This product optionally depends on 'Apache Log4J', a logging framework, +This product optionally depends on 'Apache Logback', a logging framework, which can be obtained at: * LICENSE: - * license/LICENSE.log4j.txt (Apache License 2.0) + * license/LICENSE.logback.txt (Eclipse Public License 1.0) * HOMEPAGE: - * http://logging.apache.org/log4j/ + * https://logback.qos.ch/ This product optionally depends on 'JBoss Logging', a logging framework, which can be obtained at: diff --git a/zookeeper-server/src/main/resources/lib/log4j-1.2.17.LICENSE.txt b/zookeeper-server/src/main/resources/lib/log4j-1.2.17.LICENSE.txt deleted file mode 100644 index 6279e5206de..00000000000 --- a/zookeeper-server/src/main/resources/lib/log4j-1.2.17.LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 1999-2005 The Apache Software Foundation - - Licensed 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. diff --git a/zookeeper-server/src/main/resources/lib/logback-classic-1.2.10.LICENSE.txt b/zookeeper-server/src/main/resources/lib/logback-classic-1.2.10.LICENSE.txt new file mode 100644 index 00000000000..46f4f252464 --- /dev/null +++ b/zookeeper-server/src/main/resources/lib/logback-classic-1.2.10.LICENSE.txt @@ -0,0 +1,414 @@ +This program and the accompanying materials are made available under the +terms of the Eclipse Public License 2.0 which is available at +http://www.eclipse.org/legal/epl-2.0, or the Apache Software License +2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0. + + + +Eclipse Public License - v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC +LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM +CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and documentation + distributed under this Agreement, and +b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + + where such changes and/or additions to the Program originate from and are + distributed by that particular Contributor. A Contribution 'originates' + from a Contributor if it was added to the Program by such Contributor + itself or anyone acting on such Contributor's behalf. Contributions do not + include additions to the Program which: (i) are separate modules of + software distributed in conjunction with the Program under their own + license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which are +necessarily infringed by the use or sale of its Contribution alone or when +combined with the Program. + +"Program" means the Contributions distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, +including all Contributors. + +2. GRANT OF RIGHTS + a) Subject to the terms of this Agreement, each Contributor hereby grants + Recipient a non-exclusive, worldwide, royalty-free copyright license to + reproduce, prepare derivative works of, publicly display, publicly + perform, distribute and sublicense the Contribution of such Contributor, + if any, and such derivative works, in source code and object code form. + b) Subject to the terms of this Agreement, each Contributor hereby grants + Recipient a non-exclusive, worldwide, royalty-free patent license under + Licensed Patents to make, use, sell, offer to sell, import and otherwise + transfer the Contribution of such Contributor, if any, in source code and + object code form. This patent license shall apply to the combination of + the Contribution and the Program if, at the time the Contribution is + added by the Contributor, such addition of the Contribution causes such + combination to be covered by the Licensed Patents. The patent license + shall not apply to any other combinations which include the Contribution. + No hardware per se is licensed hereunder. + c) Recipient understands that although each Contributor grants the licenses + to its Contributions set forth herein, no assurances are provided by any + Contributor that the Program does not infringe the patent or other + intellectual property rights of any other entity. Each Contributor + disclaims any liability to Recipient for claims brought by any other + entity based on infringement of intellectual property rights or + otherwise. As a condition to exercising the rights and licenses granted + hereunder, each Recipient hereby assumes sole responsibility to secure + any other intellectual property rights needed, if any. For example, if a + third party patent license is required to allow Recipient to distribute + the Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + d) Each Contributor represents that to its knowledge it has sufficient + copyright rights in its Contribution, if any, to grant the copyright + license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under +its own license agreement, provided that: + + a) it complies with the terms and conditions of this Agreement; and + b) its license agreement: + i) effectively disclaims on behalf of all Contributors all warranties + and conditions, express and implied, including warranties or + conditions of title and non-infringement, and implied warranties or + conditions of merchantability and fitness for a particular purpose; + ii) effectively excludes on behalf of all Contributors all liability for + damages, including direct, indirect, special, incidental and + consequential damages, such as lost profits; + iii) states that any provisions which differ from this Agreement are + offered by that Contributor alone and not by any other party; and + iv) states that source code for the Program is available from such + Contributor, and informs licensees how to obtain it in a reasonable + manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + + a) it must be made available under this Agreement; and + b) a copy of this Agreement must be included with each copy of the Program. + Contributors may not remove or alter any copyright notices contained + within the Program. + +Each Contributor must identify itself as the originator of its Contribution, +if +any, in a manner that reasonably allows subsequent Recipients to identify the +originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with +respect to end users, business partners and the like. While this license is +intended to facilitate the commercial use of the Program, the Contributor who +includes the Program in a commercial product offering should do so in a manner +which does not create potential liability for other Contributors. Therefore, +if a Contributor includes the Program in a commercial product offering, such +Contributor ("Commercial Contributor") hereby agrees to defend and indemnify +every other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits and +other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such Commercial +Contributor in connection with its distribution of the Program in a commercial +product offering. The obligations in this section do not apply to any claims +or Losses relating to any actual or alleged intellectual property +infringement. In order to qualify, an Indemnified Contributor must: +a) promptly notify the Commercial Contributor in writing of such claim, and +b) allow the Commercial Contributor to control, and cooperate with the +Commercial Contributor in, the defense and any related settlement +negotiations. The Indemnified Contributor may participate in any such claim at +its own expense. + +For example, a Contributor might include the Program in a commercial product +offering, Product X. That Contributor is then a Commercial Contributor. If +that Commercial Contributor then makes performance claims, or offers +warranties related to Product X, those performance claims and warranties are +such Commercial Contributor's responsibility alone. Under this section, the +Commercial Contributor would have to defend claims against the other +Contributors related to those performance claims and warranties, and if a +court requires any other Contributor to pay any damages as a result, the +Commercial Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each +Recipient is solely responsible for determining the appropriateness of using +and distributing the Program and assumes all risks associated with its +exercise of rights under this Agreement , including but not limited to the +risks and costs of program errors, compliance with applicable laws, damage to +or loss of data, programs or equipment, and unavailability or interruption of +operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY +CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION +LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of the +remainder of the terms of this Agreement, and without further action by the +parties hereto, such provision shall be reformed to the minimum extent +necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Program itself +(excluding combinations of the Program with other software or hardware) +infringes such Recipient's patent(s), then such Recipient's rights granted +under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to +comply with any of the material terms or conditions of this Agreement and does +not cure such failure in a reasonable period of time after becoming aware of +such noncompliance. If all Recipient's rights under this Agreement terminate, +Recipient agrees to cease use and distribution of the Program as soon as +reasonably practicable. However, Recipient's obligations under this Agreement +and any licenses granted by Recipient relating to the Program shall continue +and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in +order to avoid inconsistency the Agreement is copyrighted and may only be +modified in the following manner. The Agreement Steward reserves the right to +publish new versions (including revisions) of this Agreement from time to +time. No one other than the Agreement Steward has the right to modify this +Agreement. The Eclipse Foundation is the initial Agreement Steward. The +Eclipse Foundation may assign the responsibility to serve as the Agreement +Steward to a suitable separate entity. Each new version of the Agreement will +be given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version of the +Agreement under which it was received. In addition, after a new version of the +Agreement is published, Contributor may elect to distribute the Program +(including its Contributions) under the new version. Except as expressly +stated in Sections 2(a) and 2(b) above, Recipient receives no rights or +licenses to the intellectual property of any Contributor under this Agreement, +whether expressly, by implication, estoppel or otherwise. All rights in the +Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the +intellectual property laws of the United States of America. No party to this +Agreement will bring a legal action under this Agreement more than one year +after the cause of action arose. Each party waives its rights to a jury trial in +any resulting litigation. + + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. diff --git a/zookeeper-server/src/main/resources/lib/logback-core-1.2.10.LICENSE.txt b/zookeeper-server/src/main/resources/lib/logback-core-1.2.10.LICENSE.txt new file mode 100644 index 00000000000..46f4f252464 --- /dev/null +++ b/zookeeper-server/src/main/resources/lib/logback-core-1.2.10.LICENSE.txt @@ -0,0 +1,414 @@ +This program and the accompanying materials are made available under the +terms of the Eclipse Public License 2.0 which is available at +http://www.eclipse.org/legal/epl-2.0, or the Apache Software License +2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0. + + + +Eclipse Public License - v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC +LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM +CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and documentation + distributed under this Agreement, and +b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + + where such changes and/or additions to the Program originate from and are + distributed by that particular Contributor. A Contribution 'originates' + from a Contributor if it was added to the Program by such Contributor + itself or anyone acting on such Contributor's behalf. Contributions do not + include additions to the Program which: (i) are separate modules of + software distributed in conjunction with the Program under their own + license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which are +necessarily infringed by the use or sale of its Contribution alone or when +combined with the Program. + +"Program" means the Contributions distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, +including all Contributors. + +2. GRANT OF RIGHTS + a) Subject to the terms of this Agreement, each Contributor hereby grants + Recipient a non-exclusive, worldwide, royalty-free copyright license to + reproduce, prepare derivative works of, publicly display, publicly + perform, distribute and sublicense the Contribution of such Contributor, + if any, and such derivative works, in source code and object code form. + b) Subject to the terms of this Agreement, each Contributor hereby grants + Recipient a non-exclusive, worldwide, royalty-free patent license under + Licensed Patents to make, use, sell, offer to sell, import and otherwise + transfer the Contribution of such Contributor, if any, in source code and + object code form. This patent license shall apply to the combination of + the Contribution and the Program if, at the time the Contribution is + added by the Contributor, such addition of the Contribution causes such + combination to be covered by the Licensed Patents. The patent license + shall not apply to any other combinations which include the Contribution. + No hardware per se is licensed hereunder. + c) Recipient understands that although each Contributor grants the licenses + to its Contributions set forth herein, no assurances are provided by any + Contributor that the Program does not infringe the patent or other + intellectual property rights of any other entity. Each Contributor + disclaims any liability to Recipient for claims brought by any other + entity based on infringement of intellectual property rights or + otherwise. As a condition to exercising the rights and licenses granted + hereunder, each Recipient hereby assumes sole responsibility to secure + any other intellectual property rights needed, if any. For example, if a + third party patent license is required to allow Recipient to distribute + the Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + d) Each Contributor represents that to its knowledge it has sufficient + copyright rights in its Contribution, if any, to grant the copyright + license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under +its own license agreement, provided that: + + a) it complies with the terms and conditions of this Agreement; and + b) its license agreement: + i) effectively disclaims on behalf of all Contributors all warranties + and conditions, express and implied, including warranties or + conditions of title and non-infringement, and implied warranties or + conditions of merchantability and fitness for a particular purpose; + ii) effectively excludes on behalf of all Contributors all liability for + damages, including direct, indirect, special, incidental and + consequential damages, such as lost profits; + iii) states that any provisions which differ from this Agreement are + offered by that Contributor alone and not by any other party; and + iv) states that source code for the Program is available from such + Contributor, and informs licensees how to obtain it in a reasonable + manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + + a) it must be made available under this Agreement; and + b) a copy of this Agreement must be included with each copy of the Program. + Contributors may not remove or alter any copyright notices contained + within the Program. + +Each Contributor must identify itself as the originator of its Contribution, +if +any, in a manner that reasonably allows subsequent Recipients to identify the +originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with +respect to end users, business partners and the like. While this license is +intended to facilitate the commercial use of the Program, the Contributor who +includes the Program in a commercial product offering should do so in a manner +which does not create potential liability for other Contributors. Therefore, +if a Contributor includes the Program in a commercial product offering, such +Contributor ("Commercial Contributor") hereby agrees to defend and indemnify +every other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits and +other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such Commercial +Contributor in connection with its distribution of the Program in a commercial +product offering. The obligations in this section do not apply to any claims +or Losses relating to any actual or alleged intellectual property +infringement. In order to qualify, an Indemnified Contributor must: +a) promptly notify the Commercial Contributor in writing of such claim, and +b) allow the Commercial Contributor to control, and cooperate with the +Commercial Contributor in, the defense and any related settlement +negotiations. The Indemnified Contributor may participate in any such claim at +its own expense. + +For example, a Contributor might include the Program in a commercial product +offering, Product X. That Contributor is then a Commercial Contributor. If +that Commercial Contributor then makes performance claims, or offers +warranties related to Product X, those performance claims and warranties are +such Commercial Contributor's responsibility alone. Under this section, the +Commercial Contributor would have to defend claims against the other +Contributors related to those performance claims and warranties, and if a +court requires any other Contributor to pay any damages as a result, the +Commercial Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each +Recipient is solely responsible for determining the appropriateness of using +and distributing the Program and assumes all risks associated with its +exercise of rights under this Agreement , including but not limited to the +risks and costs of program errors, compliance with applicable laws, damage to +or loss of data, programs or equipment, and unavailability or interruption of +operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY +CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION +LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of the +remainder of the terms of this Agreement, and without further action by the +parties hereto, such provision shall be reformed to the minimum extent +necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Program itself +(excluding combinations of the Program with other software or hardware) +infringes such Recipient's patent(s), then such Recipient's rights granted +under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to +comply with any of the material terms or conditions of this Agreement and does +not cure such failure in a reasonable period of time after becoming aware of +such noncompliance. If all Recipient's rights under this Agreement terminate, +Recipient agrees to cease use and distribution of the Program as soon as +reasonably practicable. However, Recipient's obligations under this Agreement +and any licenses granted by Recipient relating to the Program shall continue +and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in +order to avoid inconsistency the Agreement is copyrighted and may only be +modified in the following manner. The Agreement Steward reserves the right to +publish new versions (including revisions) of this Agreement from time to +time. No one other than the Agreement Steward has the right to modify this +Agreement. The Eclipse Foundation is the initial Agreement Steward. The +Eclipse Foundation may assign the responsibility to serve as the Agreement +Steward to a suitable separate entity. Each new version of the Agreement will +be given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version of the +Agreement under which it was received. In addition, after a new version of the +Agreement is published, Contributor may elect to distribute the Program +(including its Contributions) under the new version. Except as expressly +stated in Sections 2(a) and 2(b) above, Recipient receives no rights or +licenses to the intellectual property of any Contributor under this Agreement, +whether expressly, by implication, estoppel or otherwise. All rights in the +Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the +intellectual property laws of the United States of America. No party to this +Agreement will bring a legal action under this Agreement more than one year +after the cause of action arose. Each party waives its rights to a jury trial in +any resulting litigation. + + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/audit/Log4jAuditLoggerTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/audit/Slf4JAuditLoggerTest.java similarity index 94% rename from zookeeper-server/src/test/java/org/apache/zookeeper/audit/Log4jAuditLoggerTest.java rename to zookeeper-server/src/test/java/org/apache/zookeeper/audit/Slf4JAuditLoggerTest.java index 0080b01c718..df3b831a30d 100644 --- a/zookeeper-server/src/test/java/org/apache/zookeeper/audit/Log4jAuditLoggerTest.java +++ b/zookeeper-server/src/test/java/org/apache/zookeeper/audit/Slf4JAuditLoggerTest.java @@ -19,6 +19,7 @@ import static org.apache.zookeeper.test.ClientBase.CONNECTION_TIMEOUT; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.LineNumberReader; @@ -27,11 +28,6 @@ import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.List; -import org.apache.log4j.Layout; -import org.apache.log4j.Level; -import org.apache.log4j.Logger; -import org.apache.log4j.SimpleLayout; -import org.apache.log4j.WriterAppender; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.KeeperException.Code; @@ -48,33 +44,28 @@ import org.apache.zookeeper.server.quorum.QuorumPeerTestBase; import org.apache.zookeeper.test.ClientBase; import org.apache.zookeeper.test.ClientBase.CountdownWatcher; +import org.apache.zookeeper.test.LoggerTestTool; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; - -public class Log4jAuditLoggerTest extends QuorumPeerTestBase { - private static final Logger LOG = Logger.getLogger(Log4jAuditLoggerTest.class); +public class Slf4JAuditLoggerTest extends QuorumPeerTestBase { + private static final Logger LOG = LoggerFactory.getLogger(Slf4JAuditLoggerTest.class); private static int SERVER_COUNT = 3; private static MainThread[] mt; private static ZooKeeper zk; - private static Logger zlogger; - private static WriterAppender appender; private static ByteArrayOutputStream os; @BeforeAll public static void setUpBeforeClass() throws Exception { System.setProperty(ZKAuditProvider.AUDIT_ENABLE, "true"); // setup the logger to capture all logs - Layout layout = new SimpleLayout(); - os = new ByteArrayOutputStream(); - appender = new WriterAppender(layout, os); - appender.setImmediateFlush(true); - appender.setThreshold(Level.INFO); - zlogger = Logger.getLogger(Log4jAuditLogger.class); - zlogger.addAppender(appender); + LoggerTestTool loggerTestTool = new LoggerTestTool(Slf4jAuditLogger.class); + os = loggerTestTool.getOutputStream(); mt = startQuorum(); zk = ClientBase.createZKClient("127.0.0.1:" + mt[0].getQuorumPeer().getClientPort()); //Verify start audit log here itself @@ -322,8 +313,7 @@ private static void verifyLog(String expectedLog, String log) { String searchString = " - "; int logStartIndex = log.indexOf(searchString); String auditLog = log.substring(logStartIndex + searchString.length()); - assertEquals(expectedLog, auditLog); - + assertTrue(auditLog.endsWith(expectedLog)); } private static void verifyLogs(String expectedLog, List logs) { @@ -428,12 +418,5 @@ public static void tearDownAfterClass() { e.printStackTrace(); } } - try { - zlogger.removeAppender(appender); - os.close(); - } catch (IOException e) { - e.printStackTrace(); - } } - } diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/audit/StandaloneServerAuditTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/audit/StandaloneServerAuditTest.java index 0815b9f42d4..8cadf3e1ee7 100644 --- a/zookeeper-server/src/test/java/org/apache/zookeeper/audit/StandaloneServerAuditTest.java +++ b/zookeeper-server/src/test/java/org/apache/zookeeper/audit/StandaloneServerAuditTest.java @@ -18,7 +18,6 @@ package org.apache.zookeeper.audit; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.ByteArrayOutputStream; @@ -27,36 +26,24 @@ import java.io.StringReader; import java.util.ArrayList; import java.util.List; -import org.apache.log4j.Layout; -import org.apache.log4j.Level; -import org.apache.log4j.Logger; -import org.apache.log4j.SimpleLayout; -import org.apache.log4j.WriterAppender; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.ZooDefs; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.test.ClientBase; +import org.apache.zookeeper.test.LoggerTestTool; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; - - public class StandaloneServerAuditTest extends ClientBase { private static ByteArrayOutputStream os; @BeforeAll public static void setup() { System.setProperty(ZKAuditProvider.AUDIT_ENABLE, "true"); - // setup the logger to capture all the logs - Layout layout = new SimpleLayout(); - os = new ByteArrayOutputStream(); - WriterAppender appender = new WriterAppender(layout, os); - appender.setImmediateFlush(true); - appender.setThreshold(Level.INFO); - Logger zLogger = Logger.getLogger(Log4jAuditLogger.class); - zLogger.addAppender(appender); + LoggerTestTool loggerTestTool = new LoggerTestTool(Slf4jAuditLogger.class); + os = loggerTestTool.getOutputStream(); } @AfterAll diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java index 724356e01d0..be81aa6c5b3 100644 --- a/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java +++ b/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java @@ -47,10 +47,6 @@ import java.util.regex.Pattern; import javax.security.sasl.SaslException; import org.apache.commons.io.FileUtils; -import org.apache.log4j.Level; -import org.apache.log4j.Logger; -import org.apache.log4j.PatternLayout; -import org.apache.log4j.WriterAppender; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.PortAssignment; @@ -66,6 +62,7 @@ import org.apache.zookeeper.server.persistence.FileTxnSnapLog; import org.apache.zookeeper.server.quorum.Leader.Proposal; import org.apache.zookeeper.test.ClientBase; +import org.apache.zookeeper.test.LoggerTestTool; import org.junit.jupiter.api.Test; /** @@ -339,13 +336,7 @@ public void testHighestZxidJoinLate() throws Exception { * @throws InterruptedException */ @Test - public void testElectionFraud() throws IOException, InterruptedException { - // capture QuorumPeer logging - ByteArrayOutputStream os = new ByteArrayOutputStream(); - WriterAppender appender = getConsoleAppender(os, Level.INFO); - Logger qlogger = Logger.getLogger(QuorumPeer.class); - qlogger.addAppender(appender); - + public void testElectionFraud() throws Exception { numServers = 3; // used for assertions later @@ -353,7 +344,9 @@ public void testElectionFraud() throws IOException, InterruptedException { boolean foundLooking = false; boolean foundFollowing = false; - try { + try (LoggerTestTool loggerTestTool = new LoggerTestTool(QuorumPeer.class)) { + ByteArrayOutputStream os = loggerTestTool.getOutputStream(); + // spin up a quorum, we use a small ticktime to make the test run faster servers = LaunchServers(numServers, 500); @@ -411,8 +404,6 @@ public void testElectionFraud() throws IOException, InterruptedException { break; } } - } finally { - qlogger.removeAppender(appender); } assertTrue(foundLeading, "falseLeader never attempts to become leader"); @@ -427,13 +418,9 @@ public void testElectionFraud() throws IOException, InterruptedException { public void testBadPeerAddressInQuorum() throws Exception { ClientBase.setupTestEnv(); - // setup the logger to capture all logs - ByteArrayOutputStream os = new ByteArrayOutputStream(); - WriterAppender appender = getConsoleAppender(os, Level.WARN); - Logger qlogger = Logger.getLogger("org.apache.zookeeper.server.quorum"); - qlogger.addAppender(appender); + try (LoggerTestTool loggerTestTool = new LoggerTestTool("org.apache.zookeeper.server.quorum")) { + ByteArrayOutputStream os = loggerTestTool.getOutputStream(); - try { final int CLIENT_PORT_QP1 = PortAssignment.unique(); final int CLIENT_PORT_QP2 = PortAssignment.unique(); @@ -452,21 +439,18 @@ public void testBadPeerAddressInQuorum() throws Exception { assertTrue(ClientBase.waitForServerDown("127.0.0.1:" + CLIENT_PORT_QP1, ClientBase.CONNECTION_TIMEOUT), "waiting for server 1 down"); - } finally { - qlogger.removeAppender(appender); - } - - LineNumberReader r = new LineNumberReader(new StringReader(os.toString())); - String line; - boolean found = false; - Pattern p = Pattern.compile(".*Cannot open channel to .* at election address .*"); - while ((line = r.readLine()) != null) { - found = p.matcher(line).matches(); - if (found) { - break; + LineNumberReader r = new LineNumberReader(new StringReader(os.toString())); + String line; + boolean found = false; + Pattern p = Pattern.compile(".*Cannot open channel to .* at election address .*"); + while ((line = r.readLine()) != null) { + found = p.matcher(line).matches(); + if (found) { + break; + } } + assertTrue(found, "complains about host"); } - assertTrue(found, "complains about host"); } /** @@ -476,15 +460,11 @@ public void testBadPeerAddressInQuorum() throws Exception { public void testInconsistentPeerType() throws Exception { ClientBase.setupTestEnv(); - // setup the logger to capture all logs - ByteArrayOutputStream os = new ByteArrayOutputStream(); - WriterAppender appender = getConsoleAppender(os, Level.INFO); - Logger qlogger = Logger.getLogger("org.apache.zookeeper.server.quorum"); - qlogger.addAppender(appender); - // test the most likely situation only: server is stated as observer in // servers list, but there's no "peerType=observer" token in config - try { + try (LoggerTestTool loggerTestTool = new LoggerTestTool("org.apache.zookeeper.server.quorum")) { + ByteArrayOutputStream os = loggerTestTool.getOutputStream(); + final int CLIENT_PORT_QP1 = PortAssignment.unique(); final int CLIENT_PORT_QP2 = PortAssignment.unique(); final int CLIENT_PORT_QP3 = PortAssignment.unique(); @@ -518,28 +498,25 @@ public void testInconsistentPeerType() throws Exception { assertTrue(ClientBase.waitForServerDown("127.0.0.1:" + CLIENT_PORT_QP3, ClientBase.CONNECTION_TIMEOUT), "waiting for server 3 down"); - } finally { - qlogger.removeAppender(appender); - } - - LineNumberReader r = new LineNumberReader(new StringReader(os.toString())); - String line; - boolean warningPresent = false; - boolean defaultedToObserver = false; - Pattern pWarn = Pattern.compile(".*Peer type from servers list.* doesn't match peerType.*"); - Pattern pObserve = Pattern.compile(".*OBSERVING.*"); - while ((line = r.readLine()) != null) { - if (pWarn.matcher(line).matches()) { - warningPresent = true; - } - if (pObserve.matcher(line).matches()) { - defaultedToObserver = true; - } - if (warningPresent && defaultedToObserver) { - break; + LineNumberReader r = new LineNumberReader(new StringReader(os.toString())); + String line; + boolean warningPresent = false; + boolean defaultedToObserver = false; + Pattern pWarn = Pattern.compile(".*Peer type from servers list.* doesn't match peerType.*"); + Pattern pObserve = Pattern.compile(".*OBSERVING.*"); + while ((line = r.readLine()) != null) { + if (pWarn.matcher(line).matches()) { + warningPresent = true; + } + if (pObserve.matcher(line).matches()) { + defaultedToObserver = true; + } + if (warningPresent && defaultedToObserver) { + break; + } } + assertTrue(warningPresent && defaultedToObserver, "Should warn about inconsistent peer type"); } - assertTrue(warningPresent && defaultedToObserver, "Should warn about inconsistent peer type"); } /** @@ -597,14 +574,9 @@ public void testBadPackets() throws Exception { public void testQuorumDefaults() throws Exception { ClientBase.setupTestEnv(); - // setup the logger to capture all logs - ByteArrayOutputStream os = new ByteArrayOutputStream(); - WriterAppender appender = getConsoleAppender(os, Level.INFO); - appender.setImmediateFlush(true); - Logger zlogger = Logger.getLogger("org.apache.zookeeper"); - zlogger.addAppender(appender); + try (LoggerTestTool loggerTestTool = new LoggerTestTool("org.apache.zookeeper")) { + ByteArrayOutputStream os = loggerTestTool.getOutputStream(); - try { final int CLIENT_PORT_QP1 = PortAssignment.unique(); final int CLIENT_PORT_QP2 = PortAssignment.unique(); @@ -629,21 +601,19 @@ public void testQuorumDefaults() throws Exception { assertTrue(ClientBase.waitForServerDown("127.0.0.1:" + CLIENT_PORT_QP2, ClientBase.CONNECTION_TIMEOUT), "waiting for server 2 down"); - } finally { - zlogger.removeAppender(appender); - } - os.close(); - LineNumberReader r = new LineNumberReader(new StringReader(os.toString())); - String line; - boolean found = false; - Pattern p = Pattern.compile(".*FastLeaderElection.*"); - while ((line = r.readLine()) != null) { - found = p.matcher(line).matches(); - if (found) { - break; + os.close(); + LineNumberReader r = new LineNumberReader(new StringReader(os.toString())); + String line; + boolean found = false; + Pattern p = Pattern.compile(".*FastLeaderElection.*"); + while ((line = r.readLine()) != null) { + found = p.matcher(line).matches(); + if (found) { + break; + } } + assertTrue(found, "fastleaderelection used"); } - assertTrue(found, "fastleaderelection used"); } /** @@ -858,13 +828,8 @@ public void testLeaderOutOfView() throws Exception { boolean foundLeading = false; boolean foundFollowing = false; - // capture QuorumPeer logging - ByteArrayOutputStream os = new ByteArrayOutputStream(); - WriterAppender appender = getConsoleAppender(os, Level.DEBUG); - Logger qlogger = Logger.getLogger("org.apache.zookeeper.server.quorum"); - qlogger.addAppender(appender); - - try { + try (LoggerTestTool loggerTestTool = new LoggerTestTool(QuorumPeerMainTest.class)) { + ByteArrayOutputStream os = loggerTestTool.getOutputStream(); Servers svrs = new Servers(); svrs.clientPorts = new int[numServers]; for (int i = 0; i < numServers; i++) { @@ -944,8 +909,6 @@ public void testLeaderOutOfView() throws Exception { "Corrupt peer should not attempt connection to out of view leader"); } - } finally { - qlogger.removeAppender(appender); } } @@ -995,13 +958,6 @@ protected QuorumPeer getQuorumPeer() { } - private WriterAppender getConsoleAppender(ByteArrayOutputStream os, Level level) { - String loggingPattern = ((PatternLayout) Logger.getRootLogger().getAppender("CONSOLE").getLayout()).getConversionPattern(); - WriterAppender appender = new WriterAppender(new PatternLayout(loggingPattern), os); - appender.setThreshold(level); - return appender; - } - private String getUniquePortCfgForId(int id) { return String.format("server.%d=127.0.0.1:%d:%d", id, PortAssignment.unique(), PortAssignment.unique()); } @@ -1291,44 +1247,34 @@ public void testMetricsProviderLifecycle() throws Exception { ClientBase.setupTestEnv(); BaseTestMetricsProvider.MetricsProviderCapturingLifecycle.reset(); - // setup the logger to capture all logs - ByteArrayOutputStream os = new ByteArrayOutputStream(); - WriterAppender appender = getConsoleAppender(os, Level.WARN); - Logger qlogger = Logger.getLogger("org.apache.zookeeper.server.quorum"); - qlogger.addAppender(appender); - - try { - final int CLIENT_PORT_QP1 = PortAssignment.unique(); - final int CLIENT_PORT_QP2 = PortAssignment.unique(); + final int CLIENT_PORT_QP1 = PortAssignment.unique(); + final int CLIENT_PORT_QP2 = PortAssignment.unique(); - String quorumCfgSectionServer = "server.1=127.0.0.1:" + PortAssignment.unique() + ":" + PortAssignment.unique() + ";" + CLIENT_PORT_QP1 - + "\nserver.2=127.0.0.1:" + PortAssignment.unique() + ":" + PortAssignment.unique() + ";" + CLIENT_PORT_QP2 + "\n"; + String quorumCfgSectionServer = "server.1=127.0.0.1:" + PortAssignment.unique() + ":" + PortAssignment.unique() + ";" + CLIENT_PORT_QP1 + + "\nserver.2=127.0.0.1:" + PortAssignment.unique() + ":" + PortAssignment.unique() + ";" + CLIENT_PORT_QP2 + "\n"; - // server 1 boots with a MetricsProvider - String quorumCfgSectionServer1 = quorumCfgSectionServer - + "metricsProvider.className=" + BaseTestMetricsProvider.MetricsProviderCapturingLifecycle.class.getName() + "\n"; + // server 1 boots with a MetricsProvider + String quorumCfgSectionServer1 = quorumCfgSectionServer + + "metricsProvider.className=" + BaseTestMetricsProvider.MetricsProviderCapturingLifecycle.class.getName() + "\n"; - MainThread q1 = new MainThread(1, CLIENT_PORT_QP1, quorumCfgSectionServer1); - MainThread q2 = new MainThread(2, CLIENT_PORT_QP2, quorumCfgSectionServer); - q1.start(); - q2.start(); + MainThread q1 = new MainThread(1, CLIENT_PORT_QP1, quorumCfgSectionServer1); + MainThread q2 = new MainThread(2, CLIENT_PORT_QP2, quorumCfgSectionServer); + q1.start(); + q2.start(); - boolean isup1 = ClientBase.waitForServerUp("127.0.0.1:" + CLIENT_PORT_QP1, 30000); - boolean isup2 = ClientBase.waitForServerUp("127.0.0.1:" + CLIENT_PORT_QP2, 30000); - assertTrue(isup1, "Server 1 never came up"); - assertTrue(isup2, "Server 2 never came up"); + boolean isup1 = ClientBase.waitForServerUp("127.0.0.1:" + CLIENT_PORT_QP1, 30000); + boolean isup2 = ClientBase.waitForServerUp("127.0.0.1:" + CLIENT_PORT_QP2, 30000); + assertTrue(isup1, "Server 1 never came up"); + assertTrue(isup2, "Server 2 never came up"); - q1.shutdown(); - q2.shutdown(); + q1.shutdown(); + q2.shutdown(); - assertTrue(ClientBase.waitForServerDown("127.0.0.1:" + CLIENT_PORT_QP1, ClientBase.CONNECTION_TIMEOUT), - "waiting for server 1 down"); + assertTrue(ClientBase.waitForServerDown("127.0.0.1:" + CLIENT_PORT_QP1, ClientBase.CONNECTION_TIMEOUT), + "waiting for server 1 down"); - assertTrue(ClientBase.waitForServerDown("127.0.0.1:" + CLIENT_PORT_QP2, ClientBase.CONNECTION_TIMEOUT), - "waiting for server 2 down"); - } finally { - qlogger.removeAppender(appender); - } + assertTrue(ClientBase.waitForServerDown("127.0.0.1:" + CLIENT_PORT_QP2, ClientBase.CONNECTION_TIMEOUT), + "waiting for server 2 down"); assertTrue(BaseTestMetricsProvider.MetricsProviderCapturingLifecycle.configureCalled.get(), "metrics provider lifecycle error"); assertTrue(BaseTestMetricsProvider.MetricsProviderCapturingLifecycle.startCalled.get(), "metrics provider lifecycle error"); @@ -1344,46 +1290,36 @@ public void testMetricsProviderConfiguration() throws Exception { ClientBase.setupTestEnv(); BaseTestMetricsProvider.MetricsProviderWithConfiguration.httpPort.set(0); - // setup the logger to capture all logs - ByteArrayOutputStream os = new ByteArrayOutputStream(); - WriterAppender appender = getConsoleAppender(os, Level.WARN); - Logger qlogger = Logger.getLogger("org.apache.zookeeper.server.quorum"); - qlogger.addAppender(appender); + final int CLIENT_PORT_QP1 = PortAssignment.unique(); + final int CLIENT_PORT_QP2 = PortAssignment.unique(); - try { - final int CLIENT_PORT_QP1 = PortAssignment.unique(); - final int CLIENT_PORT_QP2 = PortAssignment.unique(); + String quorumCfgSectionServer = "server.1=127.0.0.1:" + PortAssignment.unique() + ":" + PortAssignment.unique() + ";" + CLIENT_PORT_QP1 + "\n" + + "server.2=127.0.0.1:" + PortAssignment.unique() + ":" + PortAssignment.unique() + ";" + CLIENT_PORT_QP2 + "\n"; - String quorumCfgSectionServer = "server.1=127.0.0.1:" + PortAssignment.unique() + ":" + PortAssignment.unique() + ";" + CLIENT_PORT_QP1 + "\n" - + "server.2=127.0.0.1:" + PortAssignment.unique() + ":" + PortAssignment.unique() + ";" + CLIENT_PORT_QP2 + "\n"; + // server 1 boots with a MetricsProvider + String quorumCfgSectionServer1 = quorumCfgSectionServer + + "metricsProvider.className=" + + BaseTestMetricsProvider.MetricsProviderWithConfiguration.class.getName() + + "\n" + "metricsProvider.httpPort=1234"; - // server 1 boots with a MetricsProvider - String quorumCfgSectionServer1 = quorumCfgSectionServer - + "metricsProvider.className=" - + BaseTestMetricsProvider.MetricsProviderWithConfiguration.class.getName() - + "\n" + "metricsProvider.httpPort=1234"; + MainThread q1 = new MainThread(1, CLIENT_PORT_QP1, quorumCfgSectionServer1); + MainThread q2 = new MainThread(2, CLIENT_PORT_QP2, quorumCfgSectionServer); + q1.start(); + q2.start(); - MainThread q1 = new MainThread(1, CLIENT_PORT_QP1, quorumCfgSectionServer1); - MainThread q2 = new MainThread(2, CLIENT_PORT_QP2, quorumCfgSectionServer); - q1.start(); - q2.start(); + boolean isup1 = ClientBase.waitForServerUp("127.0.0.1:" + CLIENT_PORT_QP1, 30000); + boolean isup2 = ClientBase.waitForServerUp("127.0.0.1:" + CLIENT_PORT_QP2, 30000); + assertTrue(isup1, "Server 1 never came up"); + assertTrue(isup2, "Server 2 never came up"); - boolean isup1 = ClientBase.waitForServerUp("127.0.0.1:" + CLIENT_PORT_QP1, 30000); - boolean isup2 = ClientBase.waitForServerUp("127.0.0.1:" + CLIENT_PORT_QP2, 30000); - assertTrue(isup1, "Server 1 never came up"); - assertTrue(isup2, "Server 2 never came up"); - - q1.shutdown(); - q2.shutdown(); + q1.shutdown(); + q2.shutdown(); - assertTrue(ClientBase.waitForServerDown("127.0.0.1:" + CLIENT_PORT_QP1, ClientBase.CONNECTION_TIMEOUT), - "waiting for server 1 down"); + assertTrue(ClientBase.waitForServerDown("127.0.0.1:" + CLIENT_PORT_QP1, ClientBase.CONNECTION_TIMEOUT), + "waiting for server 1 down"); - assertTrue(ClientBase.waitForServerDown("127.0.0.1:" + CLIENT_PORT_QP2, ClientBase.CONNECTION_TIMEOUT), - "waiting for server 2 down"); - } finally { - qlogger.removeAppender(appender); - } + assertTrue(ClientBase.waitForServerDown("127.0.0.1:" + CLIENT_PORT_QP2, ClientBase.CONNECTION_TIMEOUT), + "waiting for server 2 down"); assertEquals(1234, BaseTestMetricsProvider.MetricsProviderWithConfiguration.httpPort.get()); } @@ -1396,13 +1332,9 @@ public void testFaultyMetricsProviderOnStop() throws Exception { ClientBase.setupTestEnv(); BaseTestMetricsProvider.MetricsProviderCapturingLifecycle.reset(); - // setup the logger to capture all logs - ByteArrayOutputStream os = new ByteArrayOutputStream(); - WriterAppender appender = getConsoleAppender(os, Level.WARN); - Logger qlogger = Logger.getLogger("org.apache.zookeeper.server.quorum"); - qlogger.addAppender(appender); + try (LoggerTestTool loggerTestTool = new LoggerTestTool("org.apache.zookeeper.server.quorum")) { + ByteArrayOutputStream os = loggerTestTool.getOutputStream(); - try { final int CLIENT_PORT_QP1 = PortAssignment.unique(); final int CLIENT_PORT_QP2 = PortAssignment.unique(); @@ -1433,23 +1365,20 @@ public void testFaultyMetricsProviderOnStop() throws Exception { assertTrue(ClientBase.waitForServerDown("127.0.0.1:" + CLIENT_PORT_QP2, ClientBase.CONNECTION_TIMEOUT), "waiting for server 2 down"); - } finally { - qlogger.removeAppender(appender); - } - - assertTrue(BaseTestMetricsProvider.MetricsProviderWithErrorInStop.stopCalled.get(), "metrics provider lifecycle error"); + assertTrue(BaseTestMetricsProvider.MetricsProviderWithErrorInStop.stopCalled.get(), "metrics provider lifecycle error"); - LineNumberReader r = new LineNumberReader(new StringReader(os.toString())); - String line; - boolean found = false; - Pattern p = Pattern.compile(".*Error while stopping metrics.*"); - while ((line = r.readLine()) != null) { - found = p.matcher(line).matches(); - if (found) { - break; + LineNumberReader r = new LineNumberReader(new StringReader(os.toString())); + String line; + boolean found = false; + Pattern p = Pattern.compile(".*Error while stopping metrics.*"); + while ((line = r.readLine()) != null) { + found = p.matcher(line).matches(); + if (found) { + break; + } } + assertTrue(found, "complains about metrics provider"); } - assertTrue(found, "complains about metrics provider"); } /** @@ -1459,13 +1388,9 @@ public void testFaultyMetricsProviderOnStop() throws Exception { public void testInvalidMetricsProvider() throws Exception { ClientBase.setupTestEnv(); - // setup the logger to capture all logs - ByteArrayOutputStream os = new ByteArrayOutputStream(); - WriterAppender appender = getConsoleAppender(os, Level.WARN); - Logger qlogger = Logger.getLogger("org.apache.zookeeper.server.quorum"); - qlogger.addAppender(appender); + try (LoggerTestTool loggerTestTool = new LoggerTestTool("org.apache.zookeeper.server.quorum")) { + ByteArrayOutputStream os = loggerTestTool.getOutputStream(); - try { final int CLIENT_PORT_QP1 = PortAssignment.unique(); String quorumCfgSection = "server.1=127.0.0.1:" + PortAssignment.unique() + ":" + PortAssignment.unique() + ";" + CLIENT_PORT_QP1 @@ -1484,21 +1409,18 @@ public void testInvalidMetricsProvider() throws Exception { assertTrue(ClientBase.waitForServerDown("127.0.0.1:" + CLIENT_PORT_QP1, ClientBase.CONNECTION_TIMEOUT), "waiting for server 1 down"); - } finally { - qlogger.removeAppender(appender); - } - - LineNumberReader r = new LineNumberReader(new StringReader(os.toString())); - String line; - boolean found = false; - Pattern p = Pattern.compile(".*BadClass.*"); - while ((line = r.readLine()) != null) { - found = p.matcher(line).matches(); - if (found) { - break; + LineNumberReader r = new LineNumberReader(new StringReader(os.toString())); + String line; + boolean found = false; + Pattern p = Pattern.compile(".*BadClass.*"); + while ((line = r.readLine()) != null) { + found = p.matcher(line).matches(); + if (found) { + break; + } } + assertTrue(found, "complains about metrics provider"); } - assertTrue(found, "complains about metrics provider"); } /** @@ -1508,13 +1430,9 @@ public void testInvalidMetricsProvider() throws Exception { public void testFaultyMetricsProviderOnStart() throws Exception { ClientBase.setupTestEnv(); - // setup the logger to capture all logs - ByteArrayOutputStream os = new ByteArrayOutputStream(); - WriterAppender appender = getConsoleAppender(os, Level.WARN); - Logger qlogger = Logger.getLogger("org.apache.zookeeper.server.quorum"); - qlogger.addAppender(appender); + try (LoggerTestTool loggerTestTool = new LoggerTestTool("org.apache.zookeeper.server.quorum")) { + ByteArrayOutputStream os = loggerTestTool.getOutputStream(); - try { final int CLIENT_PORT_QP1 = PortAssignment.unique(); String quorumCfgSection = "server.1=127.0.0.1:" + PortAssignment.unique() + ":" + PortAssignment.unique() + ";" + CLIENT_PORT_QP1 @@ -1534,21 +1452,18 @@ public void testFaultyMetricsProviderOnStart() throws Exception { assertTrue(ClientBase.waitForServerDown("127.0.0.1:" + CLIENT_PORT_QP1, ClientBase.CONNECTION_TIMEOUT), "waiting for server 1 down"); - } finally { - qlogger.removeAppender(appender); - } - - LineNumberReader r = new LineNumberReader(new StringReader(os.toString())); - String line; - boolean found = false; - Pattern p = Pattern.compile(".*MetricsProviderLifeCycleException.*"); - while ((line = r.readLine()) != null) { - found = p.matcher(line).matches(); - if (found) { - break; + LineNumberReader r = new LineNumberReader(new StringReader(os.toString())); + String line; + boolean found = false; + Pattern p = Pattern.compile(".*MetricsProviderLifeCycleException.*"); + while ((line = r.readLine()) != null) { + found = p.matcher(line).matches(); + if (found) { + break; + } } + assertTrue(found, "complains about metrics provider MetricsProviderLifeCycleException"); } - assertTrue(found, "complains about metrics provider MetricsProviderLifeCycleException"); } /** @@ -1558,13 +1473,9 @@ public void testFaultyMetricsProviderOnStart() throws Exception { public void testFaultyMetricsProviderOnConfigure() throws Exception { ClientBase.setupTestEnv(); - // setup the logger to capture all logs - ByteArrayOutputStream os = new ByteArrayOutputStream(); - WriterAppender appender = getConsoleAppender(os, Level.WARN); - Logger qlogger = Logger.getLogger("org.apache.zookeeper.server.quorum"); - qlogger.addAppender(appender); + try (LoggerTestTool loggerTestTool = new LoggerTestTool("org.apache.zookeeper.server.quorum")) { + ByteArrayOutputStream os = loggerTestTool.getOutputStream(); - try { final int CLIENT_PORT_QP1 = PortAssignment.unique(); String quorumCfgSection = "server.1=127.0.0.1:" + PortAssignment.unique() + ":" + PortAssignment.unique() + ";" + CLIENT_PORT_QP1 @@ -1584,21 +1495,18 @@ public void testFaultyMetricsProviderOnConfigure() throws Exception { assertTrue(ClientBase.waitForServerDown("127.0.0.1:" + CLIENT_PORT_QP1, ClientBase.CONNECTION_TIMEOUT), "waiting for server 1 down"); - } finally { - qlogger.removeAppender(appender); - } - - LineNumberReader r = new LineNumberReader(new StringReader(os.toString())); - String line; - boolean found = false; - Pattern p = Pattern.compile(".*MetricsProviderLifeCycleException.*"); - while ((line = r.readLine()) != null) { - found = p.matcher(line).matches(); - if (found) { - break; + LineNumberReader r = new LineNumberReader(new StringReader(os.toString())); + String line; + boolean found = false; + Pattern p = Pattern.compile(".*MetricsProviderLifeCycleException.*"); + while ((line = r.readLine()) != null) { + found = p.matcher(line).matches(); + if (found) { + break; + } } + assertTrue(found, "complains about metrics provider MetricsProviderLifeCycleException"); } - assertTrue(found, "complains about metrics provider MetricsProviderLifeCycleException"); } /** diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/test/LoggerTestTool.java b/zookeeper-server/src/test/java/org/apache/zookeeper/test/LoggerTestTool.java new file mode 100644 index 00000000000..c95a0d32d5e --- /dev/null +++ b/zookeeper-server/src/test/java/org/apache/zookeeper/test/LoggerTestTool.java @@ -0,0 +1,88 @@ +/* + * 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. + */ + +package org.apache.zookeeper.test; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.Appender; +import ch.qos.logback.core.Layout; +import ch.qos.logback.core.OutputStreamAppender; +import ch.qos.logback.core.encoder.LayoutWrappingEncoder; +import java.io.ByteArrayOutputStream; +import org.slf4j.LoggerFactory; + +public class LoggerTestTool implements AutoCloseable { + private final ByteArrayOutputStream os; + private Appender appender; + private Logger qlogger; + + public LoggerTestTool(Class cls) { + os = createLoggingStream(cls); + } + + public LoggerTestTool(String cls) { + os = createLoggingStream(cls); + } + + public ByteArrayOutputStream getOutputStream() { + return os; + } + + private ByteArrayOutputStream createLoggingStream(Class cls) { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + appender = getConsoleAppender(os); + qlogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(cls); + qlogger.addAppender(appender); + qlogger.setLevel(Level.INFO); + appender.start(); + return os; + } + + private ByteArrayOutputStream createLoggingStream(String cls) { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + appender = getConsoleAppender(os); + qlogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(cls); + qlogger.addAppender(appender); + qlogger.setLevel(Level.INFO); + appender.start(); + return os; + } + + private OutputStreamAppender getConsoleAppender(ByteArrayOutputStream os) { + Logger rootLogger = + (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); + Layout layout = ((LayoutWrappingEncoder) + ((OutputStreamAppender) rootLogger.getAppender("CONSOLE")).getEncoder()).getLayout(); + + OutputStreamAppender appender = new OutputStreamAppender<>(); + appender.setContext((LoggerContext) LoggerFactory.getILoggerFactory()); + appender.setOutputStream(os); + appender.setLayout(layout); + + return appender; + } + + @Override + public void close() throws Exception { + qlogger.detachAppender(appender); + os.close(); + } +} diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/test/ReadOnlyModeTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/test/ReadOnlyModeTest.java index 43bfb2ded38..c8f4ac42cc4 100644 --- a/zookeeper-server/src/test/java/org/apache/zookeeper/test/ReadOnlyModeTest.java +++ b/zookeeper-server/src/test/java/org/apache/zookeeper/test/ReadOnlyModeTest.java @@ -29,10 +29,6 @@ import java.io.StringReader; import java.util.concurrent.TimeoutException; import java.util.regex.Pattern; -import org.apache.log4j.Layout; -import org.apache.log4j.Level; -import org.apache.log4j.Logger; -import org.apache.log4j.WriterAppender; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.KeeperException.NotReadOnlyException; @@ -41,6 +37,7 @@ import org.apache.zookeeper.ZooDefs; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.ZooKeeper.States; +import org.apache.zookeeper.common.StringUtils; import org.apache.zookeeper.common.Time; import org.apache.zookeeper.test.ClientBase.CountdownWatcher; import org.junit.jupiter.api.AfterEach; @@ -294,16 +291,9 @@ public void testSeekForRwServer() throws Exception { qu.enableLocalSession(true); qu.startQuorum(); - // setup the logger to capture all logs - Layout layout = Logger.getRootLogger().getAppender("CONSOLE").getLayout(); - ByteArrayOutputStream os = new ByteArrayOutputStream(); - WriterAppender appender = new WriterAppender(layout, os); - appender.setImmediateFlush(true); - appender.setThreshold(Level.INFO); - Logger zlogger = Logger.getLogger("org.apache.zookeeper"); - zlogger.addAppender(appender); + try (LoggerTestTool loggerTestTool = new LoggerTestTool("org.apache.zookeeper")) { + ByteArrayOutputStream os = loggerTestTool.getOutputStream(); - try { qu.shutdown(2); CountdownWatcher watcher = new CountdownWatcher(); ZooKeeper zk = new ZooKeeper(qu.getConnString(), CONNECTION_TIMEOUT, watcher, true); @@ -323,22 +313,21 @@ public void testSeekForRwServer() throws Exception { // resume poor fellow qu.getPeer(1).peer.resume(); - } finally { - zlogger.removeAppender(appender); - } - os.close(); - LineNumberReader r = new LineNumberReader(new StringReader(os.toString())); - String line; - Pattern p = Pattern.compile(".*Majority server found.*"); - boolean found = false; - while ((line = r.readLine()) != null) { - if (p.matcher(line).matches()) { - found = true; - break; + String log = os.toString(); + assertFalse(StringUtils.isEmpty(log), "OutputStream doesn't have any log messages"); + + LineNumberReader r = new LineNumberReader(new StringReader(log)); + String line; + Pattern p = Pattern.compile(".*Majority server found.*"); + boolean found = false; + while ((line = r.readLine()) != null) { + if (p.matcher(line).matches()) { + found = true; + break; + } } + assertTrue(found, "Majority server wasn't found while connected to r/o server"); } - assertTrue(found, "Majority server wasn't found while connected to r/o server"); } - } diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/test/ReconfigExceptionTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/test/ReconfigExceptionTest.java index aae69aded87..9dc21ba272a 100644 --- a/zookeeper-server/src/test/java/org/apache/zookeeper/test/ReconfigExceptionTest.java +++ b/zookeeper-server/src/test/java/org/apache/zookeeper/test/ReconfigExceptionTest.java @@ -48,8 +48,8 @@ public class ReconfigExceptionTest extends ZKTestCase { // Use DigestAuthenticationProvider.base64Encode or // run ZooKeeper jar with org.apache.zookeeper.server.auth.DigestAuthenticationProvider to generate password. // An example: - // java -cp zookeeper-3.6.0-SNAPSHOT.jar:lib/log4j-1.2.17.jar:lib/slf4j-log4j12-1.7.5.jar: - // lib/slf4j-api-1.7.5.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider super:test + // java -cp zookeeper.jar:lib/slf4j-api-1.7.30.jar:lib/logback-classic-1.2.10.jar:lib/logback-core-1.2.10.jar:conf + // org.apache.zookeeper.server.auth.DigestAuthenticationProvider super:test // The password here is 'test'. private static String superDigest = "super:D/InIHSb7yEEbrWz8b9l71RjZJU="; private QuorumUtil qu; diff --git a/zookeeper-server/src/test/resources/log4j.properties b/zookeeper-server/src/test/resources/log4j.properties deleted file mode 100644 index 4a2ede95503..00000000000 --- a/zookeeper-server/src/test/resources/log4j.properties +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright 2012 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 -zookeeper.root.logger=INFO, CONSOLE - -zookeeper.console.threshold=INFO - -zookeeper.log.dir=. -zookeeper.log.file=zookeeper.log -zookeeper.log.threshold=INFO -zookeeper.log.maxfilesize=256MB -zookeeper.log.maxbackupindex=20 - -zookeeper.tracelog.dir=${zookeeper.log.dir} -zookeeper.tracelog.file=zookeeper_trace.log - -log4j.rootLogger=${zookeeper.root.logger} - -# -# console -# Add "console" to rootlogger above if you want to use this -# -log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender -log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold} -log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout -log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n - -# -# Add ROLLINGFILE to rootLogger to get log file output -# -log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender -log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold} -log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file} -log4j.appender.ROLLINGFILE.MaxFileSize=${zookeeper.log.maxfilesize} -log4j.appender.ROLLINGFILE.MaxBackupIndex=${zookeeper.log.maxbackupindex} -log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout -log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n - -# -# Add TRACEFILE to rootLogger to get log file output -# Log TRACE level and above messages to a log file -# -log4j.appender.TRACEFILE=org.apache.log4j.FileAppender -log4j.appender.TRACEFILE.Threshold=TRACE -log4j.appender.TRACEFILE.File=${zookeeper.tracelog.dir}/${zookeeper.tracelog.file} - -log4j.appender.TRACEFILE.layout=org.apache.log4j.PatternLayout -### Notice we are including log4j's NDC here (%x) -log4j.appender.TRACEFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L][%x] - %m%n diff --git a/zookeeper-server/src/test/resources/logback.xml b/zookeeper-server/src/test/resources/logback.xml new file mode 100644 index 00000000000..a1e627724a5 --- /dev/null +++ b/zookeeper-server/src/test/resources/logback.xml @@ -0,0 +1,36 @@ + + + + + + %d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n + + + INFO + + + + + + +