This is an automated email from the ASF dual-hosted git repository. pkarwasz pushed a commit to branch merge-server in repository https://gitbox.apache.org/repos/asf/logging-log4j-samples.git
commit 66c8fe77fc94899915ac443cc72c1d8e25891257 Author: Ralph Goers <[email protected]> AuthorDate: Mon Nov 28 22:39:59 2022 -0700 Move Log4j Server to its own repo --- log4j-server/pom.xml | 242 --------------- .../log4j/server/AbstractLogEventBridge.java | 44 --- .../logging/log4j/server/AbstractSocketServer.java | 217 ------------- .../log4j/server/InputStreamLogEventBridge.java | 108 ------- .../org/apache/logging/log4j/server/JmsServer.java | 149 --------- .../server/JsonInputStreamLogEventBridge.java | 89 ------ .../logging/log4j/server/LogEventBridge.java | 56 ---- .../server/ObjectInputStreamLogEventBridge.java | 69 ----- .../log4j/server/SecureTcpSocketServer.java | 41 --- .../logging/log4j/server/TcpSocketServer.java | 341 --------------------- .../logging/log4j/server/UdpSocketServer.java | 167 ---------- .../log4j/server/XmlInputStreamLogEventBridge.java | 54 ---- .../log4j/server/mom/jms/AbstractJmsReceiver.java | 69 ----- .../log4j/server/mom/jms/JmsQueueReceiver.java | 46 --- .../log4j/server/mom/jms/JmsTopicReceiver.java | 46 --- .../logging/log4j/server/mom/jms/package-info.java | 26 -- .../apache/logging/log4j/server/package-info.java | 24 -- log4j-server/src/site/markdown/index.md | 30 -- log4j-server/src/site/site.xml | 52 ---- .../log4j/server/AbstractSocketServerTest.java | 240 --------------- .../log4j/server/SslXmlSocketServerTest.java | 103 ------- .../log4j/server/TcpJsonSocketServerTest.java | 62 ---- .../log4j/server/TcpXmlSocketServerTest.java | 65 ---- .../logging/log4j/server/ThreadIdFilter.java | 40 --- .../logging/log4j/server/ThreadNameFilter.java | 39 --- .../logging/log4j/server/ThreadPriorityFilter.java | 40 --- .../log4j/server/UdpJsonSocketServerTest.java | 58 ---- .../log4j/server/UdpXmlSocketServerTest.java | 61 ---- .../mom/activemq/ActiveMqBrokerServiceHelper.java | 51 --- .../mom/activemq/ActiveMqBrokerServiceRule.java | 94 ------ .../log4j/server/mom/jms/JmsQueueReceiverTest.java | 42 --- .../log4j/core/net/ssl/client.log4j2-keystore.jks | Bin 6829 -> 0 bytes .../logging/log4j/core/net/ssl/truststore.jks | Bin 1487 -> 0 bytes 33 files changed, 2765 deletions(-) diff --git a/log4j-server/pom.xml b/log4j-server/pom.xml deleted file mode 100644 index 5a78828..0000000 --- a/log4j-server/pom.xml +++ /dev/null @@ -1,242 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - ~ 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. - --> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>org.apache.logging.log4j</groupId> - <artifactId>log4j-tools</artifactId> - <version>3.0.0-SNAPSHOT</version> - <relativePath>../</relativePath> - </parent> - <artifactId>log4j-server</artifactId> - <packaging>jar</packaging> - <name>Apache Log4j Server components</name> - <description>The Apache Log4j server components</description> - <properties> - <log4jParentDir>${basedir}/..</log4jParentDir> - <projectDir>/log4j-server</projectDir> - </properties> - <dependencies> - <dependency> - <groupId>org.apache.logging.log4j</groupId> - <artifactId>log4j-core</artifactId> - </dependency> - <dependency> - <groupId>org.apache.logging.log4j</groupId> - <artifactId>log4j-jms</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>org.apache.logging.log4j</groupId> - <artifactId>log4j-layout-jackson-json</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>org.apache.logging.log4j</groupId> - <artifactId>log4j-layout-jackson-xml</artifactId> - <version>${project.version}</version> - </dependency> - <!-- Used for JMS server (needs an implementation of course) --> - <dependency> - <groupId>org.jboss.spec.javax.jms</groupId> - <artifactId>jboss-jms-api_1.1_spec</artifactId> - <scope>provided</scope> - <optional>true</optional> - </dependency> - <!-- Required for JSON support --> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-databind</artifactId> - </dependency> - <!-- Required for XML support --> - <dependency> - <groupId>com.fasterxml.jackson.dataformat</groupId> - <artifactId>jackson-dataformat-xml</artifactId> - </dependency> - <!-- POM for jackson-dataformat-xml 2.8.3 depends on woodstox-core 5.0.2 --> - <dependency> - <groupId>com.fasterxml.woodstox</groupId> - <artifactId>woodstox-core</artifactId> - <version>5.0.2</version> - </dependency> - - <!-- TEST DEPENDENCIES --> - - <!-- Pull in useful test classes from API --> - <dependency> - <groupId>org.apache.logging.log4j</groupId> - <artifactId>log4j-core</artifactId> - <type>test-jar</type> - <scope>test</scope> - </dependency> - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.hamcrest</groupId> - <artifactId>hamcrest-all</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.mockito</groupId> - <artifactId>mockito-core</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.apache.activemq</groupId> - <artifactId>activemq-broker</artifactId> - <scope>test</scope> - </dependency> - </dependencies> - <build> - <plugins> - <!-- Include the standard NOTICE and LICENSE --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-remote-resources-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>process</goal> - </goals> - <configuration> - <skip>false</skip> - </configuration> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.apache.felix</groupId> - <artifactId>maven-bundle-plugin</artifactId> - <configuration> - <instructions> - <Export-Package>org.apache.logging.log4j.core.net.*</Export-Package> - </instructions> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-jar-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>test-jar</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - <reporting> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-changes-plugin</artifactId> - <version>${changes.plugin.version}</version> - <reportSets> - <reportSet> - <reports> - <report>changes-report</report> - </reports> - </reportSet> - </reportSets> - <configuration> - <issueLinkTemplate>%URL%/show_bug.cgi?id=%ISSUE%</issueLinkTemplate> - <useJql>true</useJql> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-checkstyle-plugin</artifactId> - <version>${checkstyle.plugin.version}</version> - <configuration> - <!--<propertiesLocation>${vfs.parent.dir}/checkstyle.properties</propertiesLocation> --> - <configLocation>${log4jParentDir}/checkstyle.xml</configLocation> - <suppressionsLocation>${log4jParentDir}/checkstyle-suppressions.xml</suppressionsLocation> - <enableRulesSummary>false</enableRulesSummary> - <propertyExpansion>basedir=${basedir}</propertyExpansion> - <propertyExpansion>licensedir=${log4jParentDir}/checkstyle-header.txt</propertyExpansion> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-javadoc-plugin</artifactId> - <version>${javadoc.plugin.version}</version> - <configuration> - <bottom><![CDATA[<p align="center">Copyright © {inceptionYear}-{currentYear} {organizationName}. All Rights Reserved.<br /> - Apache Logging, Apache Log4j, Log4j, Apache, the Apache feather logo, the Apache Logging project logo, - and the Apache Log4j logo are trademarks of The Apache Software Foundation.</p>]]></bottom> - <!-- module link generation is completely broken in the javadoc plugin for a multi-module non-aggregating - project --> - <detectOfflineLinks>false</detectOfflineLinks> - <linksource>true</linksource> - </configuration> - <reportSets> - <reportSet> - <id>non-aggregate</id> - <reports> - <report>javadoc</report> - </reports> - </reportSet> - </reportSets> - </plugin> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>findbugs-maven-plugin</artifactId> - <version>${findbugs.plugin.version}</version> - <configuration> - <fork>true</fork> - <jvmArgs>-Duser.language=en</jvmArgs> - <threshold>Normal</threshold> - <effort>Default</effort> - <excludeFilterFile>${log4jParentDir}/findbugs-exclude-filter.xml</excludeFilterFile> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-jxr-plugin</artifactId> - <version>${jxr.plugin.version}</version> - <reportSets> - <reportSet> - <id>non-aggregate</id> - <reports> - <report>jxr</report> - </reports> - </reportSet> - <reportSet> - <id>aggregate</id> - <reports> - <report>aggregate</report> - </reports> - </reportSet> - </reportSets> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-pmd-plugin</artifactId> - <version>${pmd.plugin.version}</version> - <configuration> - <targetJdk>${maven.compiler.target}</targetJdk> - </configuration> - </plugin> - </plugins> - </reporting> -</project> - diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/AbstractLogEventBridge.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/AbstractLogEventBridge.java deleted file mode 100644 index 5e368cb..0000000 --- a/log4j-server/src/main/java/org/apache/logging/log4j/server/AbstractLogEventBridge.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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.logging.log4j.server; - -import java.io.IOException; -import java.io.InputStream; - -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.status.StatusLogger; - -/** - * Abstract class for implementations of {@link LogEventBridge}. - * - * @param <T> - * The kind of input stream read - */ -public abstract class AbstractLogEventBridge<T extends InputStream> implements LogEventBridge<T> { - - protected static final int END = -1; - - protected static final Logger logger = StatusLogger.getLogger(); - - // The default is to return the same object as given. - @SuppressWarnings("unchecked") - @Override - public T wrapStream(final InputStream inputStream) throws IOException { - return (T) inputStream; - } - -} diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/AbstractSocketServer.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/AbstractSocketServer.java deleted file mode 100644 index 2024b6b..0000000 --- a/log4j-server/src/main/java/org/apache/logging/log4j/server/AbstractSocketServer.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * 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.logging.log4j.server; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.InetAddress; -import java.net.URI; -import java.net.URL; -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.core.LogEventListener; -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.config.Configuration; -import org.apache.logging.log4j.core.config.ConfigurationSource; -import org.apache.logging.log4j.core.config.xml.XmlConfiguration; -import org.apache.logging.log4j.core.config.xml.XmlConfigurationFactory; -import org.apache.logging.log4j.core.tools.BasicCommandLineArguments; -import org.apache.logging.log4j.core.tools.picocli.CommandLine.Option; -import org.apache.logging.log4j.core.util.Log4jThread; -import org.apache.logging.log4j.util.Strings; - -/** - * Abstract socket server for TCP and UDP implementations. - * - * @param <T> - * The kind of input stream read - * - * TODO Make a LifeCycle - */ -public abstract class AbstractSocketServer<T extends InputStream> extends LogEventListener implements Runnable { - - protected static class CommandLineArguments extends BasicCommandLineArguments { - - @Option(names = { "--config", "-c" }, description = "Log4j configuration file location (path or URL).") - private String configLocation; - - @Option(names = { "--interactive", "-i" }, description = "Accepts commands on standard input (\"exit\" is the only command).") - private boolean interactive; - - @Option(names = { "--port", "-p" }, description = "The server port number, or 0 to automatically allocate a port number.") - private int port; - - @Option(names = { "--localbindaddress", "-a" }, description = "Server socket local bind address.") - private InetAddress localBindAddress; - - @Option(names = {"--classes", "-C"}, description = "Additional classes to allow deserialization") - private List<String> allowedClasses; - - String getConfigLocation() { - return configLocation; - } - - int getPort() { - return port; - } - - protected boolean isInteractive() { - return interactive; - } - - void setConfigLocation(final String configLocation) { - this.configLocation = configLocation; - } - - void setInteractive(final boolean interactive) { - this.interactive = interactive; - } - - void setPort(final int port) { - this.port = port; - } - - InetAddress getLocalBindAddress() { - return localBindAddress; - } - - void setLocalBindAddress(final InetAddress localBindAddress) { - this.localBindAddress = localBindAddress; - } - - List<String> getAllowedClasses() { - return allowedClasses == null ? Collections.<String>emptyList() : allowedClasses; - } - - void setAllowedClasses(final List<String> allowedClasses) { - this.allowedClasses = allowedClasses; - } - } - - /** - * Factory that creates a Configuration for the server. - */ - protected static class ServerConfigurationFactory extends XmlConfigurationFactory { - - private final String path; - - public ServerConfigurationFactory(final String path) { - this.path = path; - } - - @Override - public Configuration getConfiguration(final LoggerContext loggerContext, final String name, - final URI configLocation) { - if (Strings.isNotEmpty(path)) { - File file = null; - ConfigurationSource source = null; - try { - file = new File(path); - final FileInputStream is = new FileInputStream(file); - source = new ConfigurationSource(is, file); - } catch (final FileNotFoundException ignored) { - // Ignore this error - } - if (source == null) { - try { - final URL url = new URL(path); - source = new ConfigurationSource(url.openStream(), url); - } catch (final IOException ignored) { - // Ignore this error - } - } - - try { - if (source != null) { - return new XmlConfiguration(loggerContext, source); - } - } catch (final Exception ignored) { - // Ignore this error. - } - System.err.println("Unable to process configuration at " + path + ", using default."); - } - return super.getConfiguration(loggerContext, name, configLocation); - } - } - - protected static final int MAX_PORT = 65534; - - private volatile boolean active = true; - - protected final LogEventBridge<T> logEventInput; - - protected final Logger logger; - - /** - * Creates a new socket server. - * - * @param port - * listen to this port - * @param logEventInput - * Use this input to read log events. - */ - public AbstractSocketServer(final int port, final LogEventBridge<T> logEventInput) { - this.logger = LogManager.getLogger(this.getClass().getName() + '.' + port); - this.logEventInput = Objects.requireNonNull(logEventInput, "LogEventInput"); - } - - protected boolean isActive() { - return this.active; - } - - protected void setActive(final boolean isActive) { - this.active = isActive; - } - - /** - * Start this server in a new thread. - * - * @return the new thread that running this server. - */ - public Thread startNewThread() { - final Thread thread = new Log4jThread(this); - thread.start(); - return thread; - } - - public abstract void shutdown() throws Exception; - - public void awaitTermination(final Thread serverThread) throws Exception { - final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); - while (true) { - final String line = reader.readLine(); - if (line == null - || line.equalsIgnoreCase("quit") - || line.equalsIgnoreCase("stop") - || line.equalsIgnoreCase("exit")) { - this.shutdown(); - serverThread.join(); - break; - } - } - } - -} diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/InputStreamLogEventBridge.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/InputStreamLogEventBridge.java deleted file mode 100644 index 6d66303..0000000 --- a/log4j-server/src/main/java/org/apache/logging/log4j/server/InputStreamLogEventBridge.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * 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.logging.log4j.server; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.Charset; - -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.LogEventListener; -import org.apache.logging.log4j.core.parser.ParseException; -import org.apache.logging.log4j.core.parser.TextLogEventParser; -import org.apache.logging.log4j.util.Strings; - -/** - * Reads and logs {@link LogEvent}s from an {@link InputStream}. - */ -public abstract class InputStreamLogEventBridge extends AbstractLogEventBridge<InputStream> { - - private final int bufferSize; - - private final Charset charset; - - private final String eventEndMarker; - - private final TextLogEventParser parser; - - public InputStreamLogEventBridge(final TextLogEventParser parser, final int bufferSize, final Charset charset, final String eventEndMarker) { - this.bufferSize = bufferSize; - this.charset = charset; - this.eventEndMarker = eventEndMarker; - this.parser = parser; - } - - abstract protected int[] getEventIndices(final String text, int beginIndex); - - @Override - public void logEvents(final InputStream inputStream, final LogEventListener logEventListener) - throws IOException, ParseException { - String workingText = Strings.EMPTY; - try { - // Allocate buffer once - final byte[] buffer = new byte[bufferSize]; - String textRemains = workingText = Strings.EMPTY; - while (true) { - // Process until the stream is EOF. - final int streamReadLength = inputStream.read(buffer); - if (streamReadLength == END) { - // The input stream is EOF - break; - } - final String text = workingText = textRemains + new String(buffer, 0, streamReadLength, charset); - int beginIndex = 0; - while (true) { - // Extract and log all XML events in the buffer - final int[] pair = getEventIndices(text, beginIndex); - final int eventStartMarkerIndex = pair[0]; - if (eventStartMarkerIndex < 0) { - // No more events or partial XML only in the buffer. - // Save the unprocessed string part - textRemains = text.substring(beginIndex); - break; - } - final int eventEndMarkerIndex = pair[1]; - if (eventEndMarkerIndex > 0) { - final int eventEndXmlIndex = eventEndMarkerIndex + eventEndMarker.length(); - final String textEvent = workingText = text.substring(eventStartMarkerIndex, eventEndXmlIndex); - final LogEvent logEvent = unmarshal(textEvent); - logEventListener.log(logEvent); - beginIndex = eventEndXmlIndex; - } else { - // No more events or partial XML only in the buffer. - // Save the unprocessed string part - textRemains = text.substring(beginIndex); - break; - } - } - } - } catch (final IOException ex) { - logger.error(workingText, ex); - } - } - - protected LogEvent unmarshal(final String jsonEvent) throws ParseException { - return this.parser.parseFrom(jsonEvent); - } - - @Override - public String toString() { - return "InputStreamLogEventBridge [bufferSize=" + bufferSize + ", charset=" + charset + ", eventEndMarker=" - + eventEndMarker + ", parser=" + parser + "]"; - } - -} diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/JmsServer.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/JmsServer.java deleted file mode 100644 index e46632c..0000000 --- a/log4j-server/src/main/java/org/apache/logging/log4j/server/JmsServer.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * 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.logging.log4j.server; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.Charset; -import java.util.Properties; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; - -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageConsumer; -import javax.jms.MessageListener; -import javax.jms.ObjectMessage; - -import org.apache.logging.log4j.LoggingException; -import org.apache.logging.log4j.core.AbstractLifeCycle; -import org.apache.logging.log4j.core.LifeCycle2; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.LogEventListener; -import org.apache.logging.log4j.core.net.JndiManager; -import org.apache.logging.log4j.jms.appender.JmsAppender; -import org.apache.logging.log4j.jms.appender.JmsManager; - -/** - * LogEventListener server that receives LogEvents over a JMS {@link javax.jms.Destination}. - * - * @since 2.1 - */ -public class JmsServer extends LogEventListener implements MessageListener, LifeCycle2 { - - private final AtomicReference<State> state = new AtomicReference<>(State.INITIALIZED); - private final JmsManager jmsManager; - private MessageConsumer messageConsumer; - - public JmsServer(final String connectionFactoryBindingName, final String connectionFactoryName, - final String providerURL, final String destinationBindingName, final String username, final char[] password, - final Properties jndiProperties) { - final String managerName = JmsServer.class.getName() + '@' + JmsServer.class.hashCode(); - final Properties jndiManager = JndiManager.createProperties(connectionFactoryBindingName, providerURL, null, - null, null, jndiProperties); - jmsManager = JmsManager.getJmsManager(managerName, jndiManager, connectionFactoryName, destinationBindingName, - username, password, false, JmsAppender.Builder.DEFAULT_RECONNECT_INTERVAL_MILLIS); - } - - @Override - public State getState() { - return state.get(); - } - - @Override - public void onMessage(final Message message) { - try { - if (message instanceof ObjectMessage) { - final Object body = ((ObjectMessage) message).getObject(); - if (body instanceof LogEvent) { - log((LogEvent) body); - } else { - LOGGER.warn("Expected ObjectMessage to contain LogEvent. Got type {} instead.", body.getClass()); - } - } else { - LOGGER.warn("Received message of type {} and JMSType {} which cannot be handled.", message.getClass(), - message.getJMSType()); - } - } catch (final JMSException e) { - LOGGER.catching(e); - } - } - - @Override - public void initialize() { - } - - @Override - public void start() { - if (state.compareAndSet(State.INITIALIZED, State.STARTING)) { - try { - messageConsumer = jmsManager.createMessageConsumer(); - messageConsumer.setMessageListener(this); - } catch (final JMSException e) { - throw new LoggingException(e); - } - } - } - - @Override - public void stop() { - stop(AbstractLifeCycle.DEFAULT_STOP_TIMEOUT, AbstractLifeCycle.DEFAULT_STOP_TIMEUNIT); - } - - @Override - public boolean stop(final long timeout, final TimeUnit timeUnit) { - boolean stopped = true; - try { - messageConsumer.close(); - } catch (final JMSException e) { - LOGGER.debug("Exception closing {}", messageConsumer, e); - stopped = false; - } - return stopped && jmsManager.stop(timeout, timeUnit); - } - - @Override - public boolean isStarted() { - return state.get() == State.STARTED; - } - - @Override - public boolean isStopped() { - return state.get() == State.STOPPED; - } - - /** - * Starts and runs this server until the user types "exit" into standard input. - * - * @throws IOException - */ - public void commandLineLoop() throws IOException { - System.out.println("Type \"exit\" to quit."); - final BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in, Charset.defaultCharset())); - while (true) { - final String line = stdin.readLine(); - if (line == null || line.equalsIgnoreCase("exit")) { - System.out.println("Exiting. Kill the application if it does not exit due to daemon threads."); - this.stop(); - return; - } - } - } - -} diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/JsonInputStreamLogEventBridge.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/JsonInputStreamLogEventBridge.java deleted file mode 100644 index 8444c74..0000000 --- a/log4j-server/src/main/java/org/apache/logging/log4j/server/JsonInputStreamLogEventBridge.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * 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.logging.log4j.server; - -import java.io.InputStream; -import java.nio.charset.Charset; - -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.jackson.json.parser.JsonLogEventParser; -import org.apache.logging.log4j.util.Chars; - -/** - * Reads and logs JSON {@link LogEvent}s from an {@link InputStream}.. - */ -public class JsonInputStreamLogEventBridge extends InputStreamLogEventBridge { - - private static final int[] END_PAIR = new int[] { END, END }; - private static final char EVENT_END_MARKER = '}'; - private static final char EVENT_START_MARKER = '{'; - private static final char JSON_ESC = '\\'; - private static final char JSON_STR_DELIM = Chars.DQUOTE; - - public JsonInputStreamLogEventBridge() { - this(1024, Charset.defaultCharset()); - } - - public JsonInputStreamLogEventBridge(final int bufferSize, final Charset charset) { - super(new JsonLogEventParser(), bufferSize, charset, - String.valueOf(EVENT_END_MARKER)); - } - - @Override - protected int[] getEventIndices(final String text, final int beginIndex) { - // Scan the text for the end of the next JSON object. - final int start = text.indexOf(EVENT_START_MARKER, beginIndex); - if (start == END) { - return END_PAIR; - } - final char[] charArray = text.toCharArray(); - int stack = 0; - boolean inStr = false; - boolean inEsc = false; - for (int i = start; i < charArray.length; i++) { - final char c = charArray[i]; - if (inEsc) { - // Skip this char and continue - inEsc = false; - } else { - switch (c) { - case EVENT_START_MARKER: - if (!inStr) { - stack++; - } - break; - case EVENT_END_MARKER: - if (!inStr) { - stack--; - } - break; - case JSON_STR_DELIM: - inStr = !inStr; - break; - case JSON_ESC: - inEsc = true; - break; - } - if (stack == 0) { - return new int[] { start, i }; - } - } - } - return END_PAIR; - } - -} diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/LogEventBridge.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/LogEventBridge.java deleted file mode 100644 index 7c915fd..0000000 --- a/log4j-server/src/main/java/org/apache/logging/log4j/server/LogEventBridge.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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.logging.log4j.server; - -import java.io.IOException; -import java.io.InputStream; - -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.LogEventListener; -import org.apache.logging.log4j.core.parser.ParseException; - -/** - * Reads {@link LogEvent}s from the given input stream and logs them as they are discovered on the given logger. - * - * <p> - * Should be stateless. - * </p> - * - * @param <T> - * The kind of {@link InputStream} to wrap and read. - */ -public interface LogEventBridge<T extends InputStream> { - - /** - * Reads {@link LogEvent}s from the given input stream and logs them as they are discovered on the given logger. - * - * @param inputStream - * the input stream to read - * @param logEventListener - * TODO - */ - void logEvents(T inputStream, LogEventListener logEventListener) throws IOException, ParseException; - - /** - * Wraps the given stream if needed. - * - * @param inputStream - * the stream to wrap - * @return the wrapped stream or the given stream. - */ - T wrapStream(InputStream inputStream) throws IOException; -} diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/ObjectInputStreamLogEventBridge.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/ObjectInputStreamLogEventBridge.java deleted file mode 100644 index c5ab4eb..0000000 --- a/log4j-server/src/main/java/org/apache/logging/log4j/server/ObjectInputStreamLogEventBridge.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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.logging.log4j.server; - -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; -import java.util.Collections; -import java.util.List; - -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.LogEventListener; -import org.apache.logging.log4j.util.FilteredObjectInputStream; -import org.apache.logging.log4j.core.layout.SerializedLayout; - -/** - * Reads and logs serialized {@link LogEvent} objects (created with {@link SerializedLayout}) from an {@link ObjectInputStream}. - * - * @deprecated Java Serialization has inherent security weaknesses, see https://www.owasp.org/index.php/Deserialization_of_untrusted_data . - * Therefore {@link SerializedLayout} is deprecated, and so is this class. We recommend using {@link JsonInputStreamLogEventBridge} instead. - */ -@Deprecated -public class ObjectInputStreamLogEventBridge extends AbstractLogEventBridge<ObjectInputStream> { - - private final List<String> allowedClasses; - - public ObjectInputStreamLogEventBridge() { - this(Collections.<String>emptyList()); - } - - /** - * Constructs an ObjectInputStreamLogEventBridge with additional allowed classes to deserialize. - * - * @param allowedClasses class names to also allow for deserialization - * @since 2.8.2 - */ - public ObjectInputStreamLogEventBridge(final List<String> allowedClasses) { - this.allowedClasses = allowedClasses; - } - - @Override - public void logEvents(final ObjectInputStream inputStream, final LogEventListener logEventListener) - throws IOException { - try { - logEventListener.log((LogEvent) inputStream.readObject()); - } catch (final ClassNotFoundException e) { - throw new IOException(e); - } - } - - @Override - public ObjectInputStream wrapStream(final InputStream inputStream) throws IOException { - return new FilteredObjectInputStream(inputStream, allowedClasses); - } -} diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/SecureTcpSocketServer.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/SecureTcpSocketServer.java deleted file mode 100644 index 39f2afc..0000000 --- a/log4j-server/src/main/java/org/apache/logging/log4j/server/SecureTcpSocketServer.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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.logging.log4j.server; - -import java.io.IOException; -import java.io.InputStream; - -import org.apache.logging.log4j.core.net.ssl.SslConfiguration; - -/** - * Listens for events over a secure socket connection (SSL/TLS). - * - * @param <T> - * The kind of input stream read - */ -public class SecureTcpSocketServer<T extends InputStream> extends TcpSocketServer<T> { - - public static SecureTcpSocketServer<InputStream> createJsonServer(final int port, final SslConfiguration sslConfiguration) throws IOException { - return new SecureTcpSocketServer<>(port, new JsonInputStreamLogEventBridge(), sslConfiguration); - } - - public SecureTcpSocketServer(final int port, final LogEventBridge<T> logEventInput, - final SslConfiguration sslConfig) throws IOException { - super(port, logEventInput, sslConfig.getSslServerSocketFactory().createServerSocket(port)); - } - -} diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/TcpSocketServer.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/TcpSocketServer.java deleted file mode 100644 index c3f5ae7..0000000 --- a/log4j-server/src/main/java/org/apache/logging/log4j/server/TcpSocketServer.java +++ /dev/null @@ -1,341 +0,0 @@ -/* - * 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.logging.log4j.server; - -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; -import java.io.OptionalDataException; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.net.Socket; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -import org.apache.logging.log4j.core.config.ConfigurationFactory; -import org.apache.logging.log4j.core.parser.ParseException; -import org.apache.logging.log4j.core.util.Closer; -import org.apache.logging.log4j.core.util.Log4jThread; -import org.apache.logging.log4j.core.tools.picocli.CommandLine; -import org.apache.logging.log4j.core.tools.picocli.CommandLine.Command; -import org.apache.logging.log4j.core.tools.picocli.CommandLine.Option; -import org.apache.logging.log4j.message.EntryMessage; - -/** - * Listens for Log4j events on a TCP server socket and passes them on to Log4j. - * - * @param <T> - * The kind of input stream read - * @see #main(String[]) - */ -public class TcpSocketServer<T extends InputStream> extends AbstractSocketServer<T> { - - @Command(name = "TcpSocketServer") - protected static class CommandLineArguments extends AbstractSocketServer.CommandLineArguments { - - @Option(names = { "--backlog", "-b" }, description = "Server socket backlog. Must be a positive integer.") - // Same default as ServerSocket - private int backlog = 50; - - int getBacklog() { - return backlog; - } - - void setBacklog(final int backlog) { - this.backlog = backlog; - } - } - - /** - * Thread that processes the events. - */ - private class SocketHandler extends Log4jThread { - - private final T inputStream; - private final Socket socket; - - private volatile boolean shutdown = false; - - public SocketHandler(final Socket socket) throws IOException { - this.socket = socket; - this.inputStream = logEventInput.wrapStream(socket.getInputStream()); - } - - @Override - public void run() { - final EntryMessage entry = logger.traceEntry(); - boolean closed = false; - try { - try { - while (!shutdown) { - logEventInput.logEvents(inputStream, TcpSocketServer.this); - } - } catch (final EOFException e) { - closed = true; - } catch (final OptionalDataException e) { - logger.error("OptionalDataException eof=" + e.eof + " length=" + e.length, e); - } catch (final IOException e) { - logger.error("IOException encountered while reading from socket", e); - } catch (ParseException e) { - logger.error("ParseException encountered while reading from socket", e); - } - if (!closed) { - Closer.closeSilently(inputStream); - } - } finally { - handlers.remove(Long.valueOf(getId())); - } - logger.traceExit(entry); - } - - public void shutdown() { - this.shutdown = true; - if (socket != null) { - Closer.closeSilently(socket); - } - interrupt(); - } - } - - /** - * Creates a socket server that reads JSON log events. - * - * @param port - * The port number, or 0 to automatically allocate a port number. - * @return a new a socket server - * @throws IOException - * if an I/O error occurs when opening the socket. - */ - public static TcpSocketServer<InputStream> createJsonSocketServer(final int port) throws IOException { - LOGGER.entry("createJsonSocketServer", port); - final TcpSocketServer<InputStream> socketServer = new TcpSocketServer<>(port, new JsonInputStreamLogEventBridge()); - return LOGGER.exit(socketServer); - } - - /** - * Creates a socket server that reads JSON log events. - * - * @param port - * The port number, or 0 to automatically allocate a port number. - * @param backlog - * The server socket backlog. - * @param localBindAddress - * The local InetAddress the server will bind to - * @return a new a socket server - * @throws IOException - * if an I/O error occurs when opening the socket. - * @since 2.9 - */ - public static TcpSocketServer<InputStream> createJsonSocketServer(final int port, final int backlog, - final InetAddress localBindAddress) throws IOException { - LOGGER.entry("createJsonSocketServer", port, backlog, localBindAddress); - final TcpSocketServer<InputStream> socketServer = new TcpSocketServer<>(port, backlog, localBindAddress, - new JsonInputStreamLogEventBridge()); - return LOGGER.exit(socketServer); - } - - /** - * Creates a socket server that reads XML log events. - * - * @param port - * The port number, or 0 to automatically allocate a port number. - * @return a new a socket server - * @throws IOException - * if an I/O error occurs when opening the socket. - */ - public static TcpSocketServer<InputStream> createXmlSocketServer(final int port) throws IOException { - LOGGER.entry(port); - final TcpSocketServer<InputStream> socketServer = new TcpSocketServer<>(port, new XmlInputStreamLogEventBridge()); - return LOGGER.exit(socketServer); - } - - /** - * Creates a socket server that reads XML log events. - * - * @param port - * The port number, or 0 to automatically allocate a port number. - * @param backlog - * The server socket backlog. - * @param localBindAddress - * The local InetAddress the server will bind to - * @return a new a socket server - * @throws IOException - * if an I/O error occurs when opening the socket. - * @since 2.9 - */ - public static TcpSocketServer<InputStream> createXmlSocketServer(final int port, - final int backlog, final InetAddress localBindAddress - ) throws IOException { - LOGGER.entry(port); - final TcpSocketServer<InputStream> socketServer = new TcpSocketServer<>(port, backlog, localBindAddress, - new XmlInputStreamLogEventBridge()); - return LOGGER.exit(socketServer); - } - - /** - * Main startup for the server. Run with "--help" for to print command line help on the console. - * - * @param args - * The command line arguments. - * @throws Exception - * if an error occurs. - */ - public static void main(final String[] args) throws Exception { - CommandLineArguments cla = CommandLine.populateCommand(new CommandLineArguments(), args); - if (cla.isHelp() || cla.backlog < 0 || cla.getPort() < 0) { - CommandLine.usage(cla, System.err); - return; - } - if (cla.getConfigLocation() != null) { - ConfigurationFactory.setConfigurationFactory(new ServerConfigurationFactory(cla.getConfigLocation())); - } - final TcpSocketServer<InputStream> socketServer = TcpSocketServer.createJsonSocketServer( - cla.getPort(), cla.getBacklog(), cla.getLocalBindAddress()); - final Thread serverThread = socketServer.startNewThread(); - if (cla.isInteractive()) { - socketServer.awaitTermination(serverThread); - } - } - - private final ConcurrentMap<Long, SocketHandler> handlers = new ConcurrentHashMap<>(); - - private final ServerSocket serverSocket; - - /** - * Constructor. - * - * @param port - * The port number, or 0 to automatically allocate a port number. - * @param backlog - * The server socket backlog. - * @param localBindAddress - * The local InetAddress the server will bind to - * @param logEventInput - * the log even input - * @throws IOException - * if an I/O error occurs when opening the socket. - * @since 2.7 - */ - @SuppressWarnings("resource") - public TcpSocketServer(final int port, final int backlog, final InetAddress localBindAddress, final LogEventBridge<T> logEventInput) throws IOException { - this(port, logEventInput, new ServerSocket(port, backlog, localBindAddress)); - } - - /** - * Constructor. - * - * @param port - * The port number, or 0 to automatically allocate a port number. - * @param logEventInput - * the log even input - * @throws IOException - * if an I/O error occurs when opening the socket. - */ - @SuppressWarnings("resource") - public TcpSocketServer(final int port, final LogEventBridge<T> logEventInput) throws IOException { - this(port, logEventInput, new ServerSocket(port)); - } - - /** - * Constructor. - * - * @param port - * to listen. - * @param logEventInput - * the log even input - * @param serverSocket - * the socket server - * @throws IOException - * if an I/O error occurs when opening the socket. - */ - public TcpSocketServer(final int port, final LogEventBridge<T> logEventInput, final ServerSocket serverSocket) - throws IOException { - super(port, logEventInput); - this.serverSocket = serverSocket; - } - - /** - * Accept incoming events and processes them. - */ - @Override - public void run() { - final EntryMessage entry = logger.traceEntry(); - while (isActive()) { - if (serverSocket.isClosed()) { - return; - } - try { - // Accept incoming connections. - logger.debug("Listening for a connection {}...", serverSocket); - @SuppressWarnings("resource") // clientSocket is closed during SocketHandler shutdown - final Socket clientSocket = serverSocket.accept(); - logger.debug("Accepted connection on {}...", serverSocket); - logger.debug("Socket accepted: {}", clientSocket); - clientSocket.setSoLinger(true, 0); - - // accept() will block until a client connects to the server. - // If execution reaches this point, then it means that a client - // socket has been accepted. - - final SocketHandler handler = new SocketHandler(clientSocket); - handlers.put(Long.valueOf(handler.getId()), handler); - handler.start(); - } catch (final IOException e) { - if (serverSocket.isClosed()) { - // OK we're done. - logger.traceExit(entry); - return; - } - logger.error("Exception encountered on accept. Ignoring. Stack trace :", e); - } - } - for (final Map.Entry<Long, SocketHandler> handlerEntry : handlers.entrySet()) { - final SocketHandler handler = handlerEntry.getValue(); - handler.shutdown(); - try { - handler.join(); - } catch (final InterruptedException ignored) { - // Ignore the exception - } - } - logger.traceExit(entry); - } - - /** - * Shutdown the server. - * - * @throws IOException if the server socket could not be closed - */ - @Override - public void shutdown() throws IOException { - final EntryMessage entry = logger.traceEntry(); - setActive(false); - //Thread.currentThread().interrupt(); - serverSocket.close(); - logger.traceExit(entry); - } - - @Override - public String toString() { - return "TcpSocketServer [serverSocket=" + serverSocket + ", handlers=" + handlers + ", logEventInput=" - + logEventInput + "]"; - } -} diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/UdpSocketServer.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/UdpSocketServer.java deleted file mode 100644 index 6148ad8..0000000 --- a/log4j-server/src/main/java/org/apache/logging/log4j/server/UdpSocketServer.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * 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.logging.log4j.server; - -import java.io.ByteArrayInputStream; -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; -import java.io.OptionalDataException; -import java.net.DatagramPacket; -import java.net.DatagramSocket; -import java.util.List; - -import org.apache.logging.log4j.core.config.ConfigurationFactory; -import org.apache.logging.log4j.core.parser.ParseException; -import org.apache.logging.log4j.core.tools.picocli.CommandLine; - -/** - * Listens for Log4j events on a datagram socket and passes them on to Log4j. - * - * @param <T> - * The kind of input stream read - * @see #main(String[]) - */ -public class UdpSocketServer<T extends InputStream> extends AbstractSocketServer<T> { - - /** - * Creates a socket server that reads JSON log events. - * - * @param port - * the port to listen - * @return a new a socket server - * @throws IOException - * if an I/O error occurs when opening the socket. - */ - public static UdpSocketServer<InputStream> createJsonSocketServer(final int port) throws IOException { - return new UdpSocketServer<>(port, new JsonInputStreamLogEventBridge()); - } - - /** - * Creates a socket server that reads XML log events. - * - * @param port - * the port to listen - * @return a new a socket server - * @throws IOException - * if an I/O error occurs when opening the socket. - */ - public static UdpSocketServer<InputStream> createXmlSocketServer(final int port) throws IOException { - return new UdpSocketServer<>(port, new XmlInputStreamLogEventBridge()); - } - - /** - * Main startup for the server. Run with "--help" for to print command line help on the console. - * - * @param args - * The command line arguments. - * @throws Exception - * if an error occurs. - */ - public static void main(final String[] args) throws Exception { - final CommandLineArguments cla = CommandLine.populateCommand(new CommandLineArguments(), args); - if (cla.isHelp() || cla.getPort() < 0) { - CommandLine.usage(cla, System.err); - return; - } - if (cla.getConfigLocation() != null) { - ConfigurationFactory.setConfigurationFactory(new ServerConfigurationFactory(cla.getConfigLocation())); - } - final UdpSocketServer<InputStream> socketServer = UdpSocketServer - .createJsonSocketServer(cla.getPort()); - final Thread serverThread = socketServer.startNewThread(); - if (cla.isInteractive()) { - socketServer.awaitTermination(serverThread); - } - } - - private final DatagramSocket datagramSocket; - - // max size so we only have to deal with one packet - private final int maxBufferSize = 1024 * 65 + 1024; - - /** - * Constructor. - * - * @param port - * to listen on. - * @param logEventInput - * @throws IOException - * If an error occurs. - */ - public UdpSocketServer(final int port, final LogEventBridge<T> logEventInput) throws IOException { - super(port, logEventInput); - this.datagramSocket = new DatagramSocket(port); - } - - /** - * Accept incoming events and processes them. - */ - @Override - public void run() { - while (isActive()) { - if (datagramSocket.isClosed()) { - // OK we're done. - return; - } - try { - final byte[] buf = new byte[maxBufferSize]; - final DatagramPacket packet = new DatagramPacket(buf, buf.length); - datagramSocket.receive(packet); - final ByteArrayInputStream bais = new ByteArrayInputStream(packet.getData(), packet.getOffset(), packet.getLength()); - logEventInput.logEvents(logEventInput.wrapStream(bais), this); - } catch (final OptionalDataException e) { - if (datagramSocket.isClosed()) { - // OK we're done. - return; - } - logger.error("OptionalDataException eof=" + e.eof + " length=" + e.length, e); - } catch (final EOFException e) { - if (datagramSocket.isClosed()) { - // OK we're done. - return; - } - logger.info("EOF encountered"); - } catch (final IOException e) { - if (datagramSocket.isClosed()) { - // OK we're done. - return; - } - logger.error("Exception encountered on accept. Ignoring. Stack Trace :", e); - } catch (ParseException e) { - logger.error("Unable to parse log event", e); - } - } - } - - /** - * Shutdown the server. - */ - @Override - public void shutdown() { - this.setActive(false); - //Thread.currentThread().interrupt(); - datagramSocket.close(); - } - - @Override - public String toString() { - return "UdpSocketServer [datagramSocket=" + datagramSocket + ", maxBufferSize=" + maxBufferSize - + ", logEventInput=" + logEventInput + "]"; - } -} diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/XmlInputStreamLogEventBridge.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/XmlInputStreamLogEventBridge.java deleted file mode 100644 index 3c4a1e0..0000000 --- a/log4j-server/src/main/java/org/apache/logging/log4j/server/XmlInputStreamLogEventBridge.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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.logging.log4j.server; - -import java.io.InputStream; -import java.nio.charset.Charset; - -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.jackson.xml.parser.XmlLogEventParser; - -/** - * Reads and logs {@link LogEvent}s from an {@link InputStream}. - */ -public class XmlInputStreamLogEventBridge extends InputStreamLogEventBridge { - - private static final String EVENT_END = "</Event>"; - private static final String EVENT_START_NS_N = "<Event>"; - private static final String EVENT_START_NS_Y = "<Event "; - - public XmlInputStreamLogEventBridge() { - this(1024, Charset.defaultCharset()); - } - - public XmlInputStreamLogEventBridge(final int bufferSize, final Charset charset) { - super(new XmlLogEventParser(), bufferSize, charset, EVENT_END); - } - - @Override - protected int[] getEventIndices(final String text, final int beginIndex) { - int start = text.indexOf(EVENT_START_NS_Y, beginIndex); - int startLen = EVENT_START_NS_Y.length(); - if (start < 0) { - start = text.indexOf(EVENT_START_NS_N, beginIndex); - startLen = EVENT_START_NS_N.length(); - } - final int end = start < 0 ? -1 : text.indexOf(EVENT_END, start + startLen); - return new int[] { start, end }; - } - -} diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/AbstractJmsReceiver.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/AbstractJmsReceiver.java deleted file mode 100644 index a85d2f6..0000000 --- a/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/AbstractJmsReceiver.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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.logging.log4j.server.mom.jms; - -import java.util.Properties; - -import org.apache.logging.log4j.server.JmsServer; - -/** - * Common JMS server functionality. - * - * @since 2.6 - */ -public abstract class AbstractJmsReceiver { - - class CommandLineArgs { - - } - - /** - * Prints out usage information to {@linkplain System#err standard error}. - */ - protected abstract void usage(); - - /** - * Executes a JmsServer with the given command line arguments. - * - * @param interactive - * Whether or not this is an interactive application by providing a command line and exit on error. - * @param args - * command line arguments - * - * @throws Exception - */ - protected void doMain(boolean interactive, final String... args) throws Exception { - // TODO Too many args, Use picocli - if (args.length < 5) { - usage(); - if (interactive) { - System.exit(1); - } - } - final Properties properties = new Properties(); - for (int index = 5; index < args.length; index += 2) { - properties.put(args[index], args[index + 1]); - } - final JmsServer server = new JmsServer(args[0], "ConnectionFactory", args[1], args[2], args[3], - args[4].toCharArray(), properties); - server.start(); - if (interactive) { - server.commandLineLoop(); - } - } -} diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/JmsQueueReceiver.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/JmsQueueReceiver.java deleted file mode 100644 index f7cadc8..0000000 --- a/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/JmsQueueReceiver.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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.logging.log4j.server.mom.jms; - -/** - * Receives Log Events over a JMS Queue. This implementation expects that all messages will - * contain a serialized LogEvent. - */ -public class JmsQueueReceiver extends AbstractJmsReceiver { - - JmsQueueReceiver() { - // Usage is to call main() - } - - /** - * Main startup for the receiver. - * - * @param args The command line arguments. - * @throws Exception if an error occurs. - */ - public static void main(final String[] args) throws Exception { - new JmsQueueReceiver().doMain(true, args); - } - - @Override - protected void usage() { - System.err.println("Wrong number of arguments."); - System.err.println("Usage: java " + JmsQueueReceiver.class.getName() - + " QueueConnectionFactoryBindingName QueueBindingName username password [jndiPropertyKey jndiPropertyValue]*"); - } -} diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/JmsTopicReceiver.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/JmsTopicReceiver.java deleted file mode 100644 index 8e50cdf..0000000 --- a/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/JmsTopicReceiver.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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.logging.log4j.server.mom.jms; - -/** - * Receives Topic messages that contain LogEvents. This implementation expects that all messages - * are serialized log events. - */ -public class JmsTopicReceiver extends AbstractJmsReceiver { - - private JmsTopicReceiver() { - // Usage is to call main() - } - - /** - * Main startup for the receiver. - * - * @param args The command line arguments. - * @throws Exception if an error occurs. - */ - public static void main(final String[] args) throws Exception { - new JmsTopicReceiver().doMain(true, args); - } - - @Override - protected void usage() { - System.err.println("Wrong number of arguments."); - System.err.println("Usage: java " + JmsTopicReceiver.class.getName() - + " TopicConnectionFactoryBindingName TopicBindingName username password [jndiPropertyKey jndiPropertyValue]*"); - } -} diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/package-info.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/package-info.java deleted file mode 100644 index dd9c90e..0000000 --- a/log4j-server/src/main/java/org/apache/logging/log4j/server/mom/jms/package-info.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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. - */ - -/** - * Supporting network code for JMS appenders. - * - * <p>Note that you can use JmsQueueReceiver or JmsTopicReceiver as executable main classes to receive log events over - * JMS (sent via the appropriate JMS appender) that can be subsequently logged according to the configuration given to - * the running process. Of course, use of these classes as standalone executables are entirely optional and can - * be used directly in your application (e.g., through your Spring {@code beans.xml} configuration).</p> - */ -package org.apache.logging.log4j.server.mom.jms; diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/package-info.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/package-info.java deleted file mode 100644 index c446a9d..0000000 --- a/log4j-server/src/main/java/org/apache/logging/log4j/server/package-info.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * 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. - */ - -/** - * Standalone server classes for consuming log events over a network. Each of the various servers should be used with - * another Log4j configuration to handle incoming {@link org.apache.logging.log4j.core.LogEvent}s. It is recommended - * to consider using the <a href="../../../../../../../../../manual/appenders.html#FlumeAppender">Flume Appender</a> - * for highly reliable networked logging. - */ -package org.apache.logging.log4j.server; diff --git a/log4j-server/src/site/markdown/index.md b/log4j-server/src/site/markdown/index.md deleted file mode 100644 index b3d96ba..0000000 --- a/log4j-server/src/site/markdown/index.md +++ /dev/null @@ -1,30 +0,0 @@ -<!-- vim: set syn=markdown : --> -<!-- - 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. ---> - -# Log4j Server components - -## Log4j Server components - -Standalone server classes for consuming log events over a network. Each of the various servers should be used with -another Log4j configuration to handle incoming log events. It is recommended to consider using the -[Flume Appender](../manual/appenders.html#FlumeAppender) for highly reliable networked logging. - -## Requirements - -The Log4j Server components requires the Log4j 2 API and core. This component was introduced in Log4j 2.8.2, -before it was part of log4j-core. For more information, see [Runtime Dependencies](../manual/runtime-dependencies.html). diff --git a/log4j-server/src/site/site.xml b/log4j-server/src/site/site.xml deleted file mode 100644 index f863dbf..0000000 --- a/log4j-server/src/site/site.xml +++ /dev/null @@ -1,52 +0,0 @@ -<!-- - 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. - ---> -<project name="Log4j IOStreams" - xmlns="http://maven.apache.org/DECORATION/1.4.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/DECORATION/1.4.0 http://maven.apache.org/xsd/decoration-1.4.0.xsd"> - <body> - <links> - <item name="Apache" href="http://www.apache.org/" /> - <item name="Logging Services" href="http://logging.apache.org/"/> - <item name="Log4j" href="../index.html"/> - </links> - - <!-- Component-specific reports --> - <menu ref="reports"/> - - <!-- Overall Project Info --> - <menu name="Log4j Project Information" img="icon-info-sign"> - <item name="Dependencies" href="../dependencies.html" /> - <item name="Dependency Convergence" href="../dependency-convergence.html" /> - <item name="Dependency Management" href="../dependency-management.html" /> - <item name="Project Team" href="../team-list.html" /> - <item name="Mailing Lists" href="../mail-lists.html" /> - <item name="Issue Tracking" href="../issue-tracking.html" /> - <item name="Project License" href="../license.html" /> - <item name="Source Repository" href="../source-repository.html" /> - <item name="Project Summary" href="../project-summary.html" /> - </menu> - - <menu name="Log4j Project Reports" img="icon-cog"> - <item name="Changes Report" href="../changes-report.html" /> - <item name="JIRA Report" href="../jira-report.html" /> - <item name="Surefire Report" href="../surefire-report.html" /> - <item name="RAT Report" href="../rat-report.html" /> - </menu> - </body> -</project> diff --git a/log4j-server/src/test/java/org/apache/logging/log4j/server/AbstractSocketServerTest.java b/log4j-server/src/test/java/org/apache/logging/log4j/server/AbstractSocketServerTest.java deleted file mode 100644 index 758716b..0000000 --- a/log4j-server/src/test/java/org/apache/logging/log4j/server/AbstractSocketServerTest.java +++ /dev/null @@ -1,240 +0,0 @@ -/* - * 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.logging.log4j.server; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.io.IOException; -import java.io.Serializable; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -import org.apache.logging.log4j.Level; -import org.apache.logging.log4j.core.Appender; -import org.apache.logging.log4j.core.Filter; -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.Logger; -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.appender.AppenderLoggingException; -import org.apache.logging.log4j.core.appender.ConsoleAppender; -import org.apache.logging.log4j.core.appender.SocketAppender; -import org.apache.logging.log4j.core.layout.PatternLayout; -import org.apache.logging.log4j.core.net.Protocol; -import org.apache.logging.log4j.jackson.json.layout.JsonLayout; -import org.apache.logging.log4j.jackson.xml.layout.XmlLayout; -import org.apache.logging.log4j.test.AvailablePortFinder; -import org.apache.logging.log4j.test.appender.ListAppender; -import org.junit.After; -import org.junit.Ignore; -import org.junit.Test; - -/** - * - */ -public abstract class AbstractSocketServerTest { - - protected static Thread thread; - - private static final String MESSAGE = "This is test message"; - - private static final String MESSAGE_2 = "This is test message 2"; - - private static final String MESSAGE_WITH_SPECIAL_CHARS = "{This}\n[is]\"n\"a\"\r\ntrue:\n\ttest,\nmessage"; - - static final int PORT_NUM = AvailablePortFinder.getNextAvailable(); - - static final int PORT = PORT_NUM; - - private final LoggerContext ctx = LoggerContext.getContext(false); - - private final boolean expectLengthException; - - protected final int port; - - protected final Protocol protocol; - - private final Logger rootLogger = ctx.getLogger(AbstractSocketServerTest.class.getSimpleName()); - - protected AbstractSocketServerTest(final Protocol protocol, final int port, final boolean expectLengthException) { - this.protocol = protocol; - this.port = port; - this.expectLengthException = expectLengthException; - } - - protected Layout<String> createJsonLayout() { - // @formatter: off - return JsonLayout.newBuilder() - .setLocationInfo(true) - .setProperties(true) - .setPropertiesAsList(false) - .setComplete(false) - .setCompact(false) - .setEventEol(false) - .setIncludeStacktrace(true) - .build(); - // @formatter: on - - //return JsonLayout.createLayout(null, true, true, false, false, false, false, null, null, null, true); - } - - protected abstract Layout<? extends Serializable> createLayout(); - - protected Layout<String> createXmlLayout() { - return XmlLayout.newBuilder() - .setLocationInfo(true) - .setProperties(true) - .setComplete(false) - .setCompact(false) - .setIncludeStacktrace(true) - .build(); - } - - @After - public void tearDown() { - final Map<String, Appender> map = rootLogger.getAppenders(); - for (final Map.Entry<String, Appender> entry : map.entrySet()) { - final Appender appender = entry.getValue(); - rootLogger.removeAppender(appender); - appender.stop(); - } - } - - @Test - @Ignore("Broken test?") - public void test1000ShortMessages() throws Exception { - testServer(1000); - } - - @Test - @Ignore("Broken test?") - public void test100ShortMessages() throws Exception { - testServer(100); - } - - @Test - public void test10ShortMessages() throws Exception { - testServer(10); - } - - @Test - public void test1ShortMessages() throws Exception { - testServer(1); - } - - @Test - public void test2ShortMessages() throws Exception { - testServer(2); - } - - @Test - public void test64KBMessages() throws Exception { - final char[] a64K = new char[1024 * 64]; - Arrays.fill(a64K, 'a'); - final String m1 = new String(a64K); - final String m2 = MESSAGE_2 + m1; - if (expectLengthException) { - try { - testServer(m1, m2); - } catch (final AppenderLoggingException are) { - assertTrue("", are.getCause() != null && are.getCause() instanceof IOException); - // Failure expected. - } - } else { - testServer(m1, m2); - } - } - - - @Test - public void testMessagesWithSpecialChars() throws Exception { - testServer(MESSAGE_WITH_SPECIAL_CHARS); - } - - - private void testServer(final int size) throws Exception { - final String[] messages = new String[size]; - for (int i = 0; i < messages.length; i++) { - messages[i] = MESSAGE + " " + i; - } - testServer(messages); - } - - protected void testServer(final String... messages) throws Exception { - final Filter socketFilter = new ThreadNameFilter(Filter.Result.NEUTRAL, Filter.Result.DENY); - final Filter serverFilter = new ThreadNameFilter(Filter.Result.DENY, Filter.Result.NEUTRAL); - final Layout<? extends Serializable> socketLayout = createLayout(); - final SocketAppender socketAppender = createSocketAppender(socketFilter, socketLayout); - socketAppender.start(); - final ListAppender listAppender = new ListAppender("Events", serverFilter, null, false, false); - listAppender.start(); - final PatternLayout layout = PatternLayout.newBuilder().setPattern("%m %ex%n").build(); - final ConsoleAppender console = ConsoleAppender.createDefaultAppenderForLayout(layout); - final Logger serverLogger = ctx.getLogger(this.getClass().getName()); - serverLogger.addAppender(console); - serverLogger.setAdditive(false); - - // set appender on root and set level to debug - rootLogger.addAppender(socketAppender); - rootLogger.addAppender(listAppender); - rootLogger.setAdditive(false); - rootLogger.setLevel(Level.DEBUG); - for (final String message : messages) { - rootLogger.debug(message); - } - final int MAX_TRIES = 400; - for (int i = 0; i < MAX_TRIES; i++) { - if (listAppender.getEvents().size() < messages.length) { - try { - // Let the server-side read the messages. - Thread.sleep(50); - } catch (final Exception e) { - e.printStackTrace(); - } - } else { - break; - } - } - final List<LogEvent> events = listAppender.getEvents(); - assertNotNull("No event retrieved", events); - assertEquals("Incorrect number of events received", messages.length, events.size()); - for (int i = 0; i < messages.length; i++) { - assertTrue("Incorrect event", events.get(i).getMessage().getFormattedMessage().equals(messages[i])); - } - } - - protected SocketAppender createSocketAppender(final Filter socketFilter, - final Layout<? extends Serializable> socketLayout) { - // @formatter:off - return SocketAppender.newBuilder() - .setProtocol(this.protocol) - .setHost("localhost") - .setPort(this.port) - .setReconnectDelayMillis(-1) - .setName("test") - .setImmediateFlush(true) - .setImmediateFail(false) - .setIgnoreExceptions(false) - .setLayout(socketLayout).setFilter(socketFilter) - .build(); - // @formatter:on - } - -} diff --git a/log4j-server/src/test/java/org/apache/logging/log4j/server/SslXmlSocketServerTest.java b/log4j-server/src/test/java/org/apache/logging/log4j/server/SslXmlSocketServerTest.java deleted file mode 100644 index 6d08723..0000000 --- a/log4j-server/src/test/java/org/apache/logging/log4j/server/SslXmlSocketServerTest.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * 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.logging.log4j.server; - -import java.io.IOException; -import java.io.InputStream; -import java.io.Serializable; -import java.nio.charset.Charset; - -import org.apache.logging.log4j.core.Filter; -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.appender.SocketAppender; -import org.apache.logging.log4j.core.net.Protocol; -import org.apache.logging.log4j.core.net.ssl.KeyStoreConfiguration; -import org.apache.logging.log4j.core.net.ssl.SslConfiguration; -import org.apache.logging.log4j.core.net.ssl.StoreConfigurationException; -import org.apache.logging.log4j.core.net.ssl.TestConstants; -import org.apache.logging.log4j.core.net.ssl.TrustStoreConfiguration; -import org.junit.AfterClass; -import org.junit.BeforeClass; - -public class SslXmlSocketServerTest extends AbstractSocketServerTest { - - private static TcpSocketServer<InputStream> server; - - private static SslConfiguration sslConfiguration; - - private static void initServerSocketFactory() throws StoreConfigurationException { - final KeyStoreConfiguration ksc = new KeyStoreConfiguration(TestConstants.KEYSTORE_FILE, - TestConstants.KEYSTORE_PWD(), TestConstants.KEYSTORE_TYPE, null); - final TrustStoreConfiguration tsc = new TrustStoreConfiguration(TestConstants.TRUSTSTORE_FILE, - TestConstants.TRUSTSTORE_PWD(), null, null); - sslConfiguration = SslConfiguration.createSSLConfiguration(null, ksc, tsc); - } - - @Override - protected SocketAppender createSocketAppender(final Filter socketFilter, - final Layout<? extends Serializable> socketLayout) { - // @formatter:off - return SocketAppender.newBuilder() - .setProtocol(this.protocol) - .setHost("localhost") - .setPort(this.port) - .setReconnectDelayMillis(-1) - .setName("test") - .setImmediateFlush(true) - .setImmediateFail(false) - .setIgnoreExceptions(false) - .setLayout(socketLayout).setFilter(socketFilter) - .setSslConfiguration(sslConfiguration) - .build(); - // @formatter:on - } - - @BeforeClass - public static void setupClass() throws Exception { - LoggerContext.getContext(false).reconfigure(); - initServerSocketFactory(); - // Use a large buffer just to test the code, the UDP test uses a tiny buffer - server = new SecureTcpSocketServer<>(PORT_NUM, new XmlInputStreamLogEventBridge(1024 * 100, - Charset.defaultCharset()), sslConfiguration); - thread = server.startNewThread(); - } - - @AfterClass - public static void tearDownClass() { - try { - server.shutdown(); - } catch (final IOException e) { - e.printStackTrace(); - } - try { - thread.join(); - } catch (final InterruptedException e) { - // ignore - } - } - - public SslXmlSocketServerTest() { - super(Protocol.SSL, PORT, false); - } - - @Override - protected Layout<String> createLayout() { - return super.createXmlLayout(); - } - -} diff --git a/log4j-server/src/test/java/org/apache/logging/log4j/server/TcpJsonSocketServerTest.java b/log4j-server/src/test/java/org/apache/logging/log4j/server/TcpJsonSocketServerTest.java deleted file mode 100644 index 63470dd..0000000 --- a/log4j-server/src/test/java/org/apache/logging/log4j/server/TcpJsonSocketServerTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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.logging.log4j.server; - -import java.io.IOException; -import java.io.InputStream; - -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.net.Protocol; -import org.junit.AfterClass; -import org.junit.BeforeClass; - -public class TcpJsonSocketServerTest extends AbstractSocketServerTest { - - private static TcpSocketServer<InputStream> server; - - @BeforeClass - public static void setupClass() throws Exception { - LoggerContext.getContext(false).reconfigure(); - server = TcpSocketServer.createJsonSocketServer(PORT_NUM); - thread = server.startNewThread(); - } - - @AfterClass - public static void tearDownClass() { - try { - server.shutdown(); - } catch (final IOException e) { - e.printStackTrace(); - } - try { - thread.join(); - } catch (final InterruptedException e) { - // ignore - } - } - - public TcpJsonSocketServerTest() { - super(Protocol.TCP, PORT, false); - } - - @Override - protected Layout<String> createLayout() { - return super.createJsonLayout(); - } - -} diff --git a/log4j-server/src/test/java/org/apache/logging/log4j/server/TcpXmlSocketServerTest.java b/log4j-server/src/test/java/org/apache/logging/log4j/server/TcpXmlSocketServerTest.java deleted file mode 100644 index 6a0ad13..0000000 --- a/log4j-server/src/test/java/org/apache/logging/log4j/server/TcpXmlSocketServerTest.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * 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.logging.log4j.server; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.Charset; - -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.net.Protocol; -import org.junit.AfterClass; -import org.junit.BeforeClass; - -public class TcpXmlSocketServerTest extends AbstractSocketServerTest { - - private static TcpSocketServer<InputStream> server; - - @BeforeClass - public static void setupClass() throws Exception { - LoggerContext.getContext(false).reconfigure(); - // Use a large buffer just to test the code, the UDP test uses a tiny buffer - server = new TcpSocketServer<>(PORT_NUM, new XmlInputStreamLogEventBridge(1024 * 100, - Charset.defaultCharset())); - thread = server.startNewThread(); - } - - @AfterClass - public static void tearDownClass() { - try { - server.shutdown(); - } catch (final IOException e) { - e.printStackTrace(); - } - try { - thread.join(); - } catch (final InterruptedException e) { - // ignore - } - } - - public TcpXmlSocketServerTest() { - super(Protocol.TCP, PORT, false); - } - - @Override - protected Layout<String> createLayout() { - return super.createXmlLayout(); - } - -} diff --git a/log4j-server/src/test/java/org/apache/logging/log4j/server/ThreadIdFilter.java b/log4j-server/src/test/java/org/apache/logging/log4j/server/ThreadIdFilter.java deleted file mode 100644 index d98e3f4..0000000 --- a/log4j-server/src/test/java/org/apache/logging/log4j/server/ThreadIdFilter.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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.logging.log4j.server; - -import org.apache.logging.log4j.core.Filter; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.filter.AbstractFilter; - -/** - * TODO Should use thread ID cache? - * @since 2.6 - */ -public class ThreadIdFilter extends AbstractFilter { - - private static final long serialVersionUID = 1L; - - public ThreadIdFilter(final Result onMatch, final Result onMismatch) { - super(onMatch, onMismatch); - } - - @Override - public Filter.Result filter(final LogEvent event) { - return event.getThreadId() == Thread.currentThread().getId() ? onMatch : onMismatch; - } -} \ No newline at end of file diff --git a/log4j-server/src/test/java/org/apache/logging/log4j/server/ThreadNameFilter.java b/log4j-server/src/test/java/org/apache/logging/log4j/server/ThreadNameFilter.java deleted file mode 100644 index 4204ac1..0000000 --- a/log4j-server/src/test/java/org/apache/logging/log4j/server/ThreadNameFilter.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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.logging.log4j.server; - -import org.apache.logging.log4j.core.Filter; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.filter.AbstractFilter; - -/** - * TODO Should use thread name cache? - */ -public class ThreadNameFilter extends AbstractFilter { - - private static final long serialVersionUID = 1L; - - public ThreadNameFilter(final Result onMatch, final Result onMismatch) { - super(onMatch, onMismatch); - } - - @Override - public Filter.Result filter(final LogEvent event) { - return event.getThreadName().equals(Thread.currentThread().getName()) ? onMatch : onMismatch; - } -} \ No newline at end of file diff --git a/log4j-server/src/test/java/org/apache/logging/log4j/server/ThreadPriorityFilter.java b/log4j-server/src/test/java/org/apache/logging/log4j/server/ThreadPriorityFilter.java deleted file mode 100644 index 6074f86..0000000 --- a/log4j-server/src/test/java/org/apache/logging/log4j/server/ThreadPriorityFilter.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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.logging.log4j.server; - -import org.apache.logging.log4j.core.Filter; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.filter.AbstractFilter; - -/** - * TODO Should use thread priority cache? - * @since 2.6 - */ -public class ThreadPriorityFilter extends AbstractFilter { - - private static final long serialVersionUID = 1L; - - public ThreadPriorityFilter(final Result onMatch, final Result onMismatch) { - super(onMatch, onMismatch); - } - - @Override - public Filter.Result filter(final LogEvent event) { - return event.getThreadPriority() == Thread.currentThread().getPriority() ? onMatch : onMismatch; - } -} \ No newline at end of file diff --git a/log4j-server/src/test/java/org/apache/logging/log4j/server/UdpJsonSocketServerTest.java b/log4j-server/src/test/java/org/apache/logging/log4j/server/UdpJsonSocketServerTest.java deleted file mode 100644 index e6b6d93..0000000 --- a/log4j-server/src/test/java/org/apache/logging/log4j/server/UdpJsonSocketServerTest.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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.logging.log4j.server; - -import java.io.InputStream; -import java.io.Serializable; - -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.net.Protocol; -import org.junit.AfterClass; -import org.junit.BeforeClass; - -public class UdpJsonSocketServerTest extends AbstractSocketServerTest { - - private static UdpSocketServer<InputStream> server; - - @BeforeClass - public static void setupClass() throws Exception { - LoggerContext.getContext(false).reconfigure(); - server = UdpSocketServer.createJsonSocketServer(PORT_NUM); - thread = server.startNewThread(); - } - - @AfterClass - public static void tearDownClass() { - server.shutdown(); - try { - thread.join(); - } catch (final InterruptedException e) { - // ignore - } - } - - public UdpJsonSocketServerTest() { - super(Protocol.UDP, PORT, true); - } - - @Override - protected Layout<? extends Serializable> createLayout() { - return super.createJsonLayout(); - } - -} diff --git a/log4j-server/src/test/java/org/apache/logging/log4j/server/UdpXmlSocketServerTest.java b/log4j-server/src/test/java/org/apache/logging/log4j/server/UdpXmlSocketServerTest.java deleted file mode 100644 index 9cbb07f..0000000 --- a/log4j-server/src/test/java/org/apache/logging/log4j/server/UdpXmlSocketServerTest.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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.logging.log4j.server; - -import java.io.InputStream; -import java.io.Serializable; -import java.nio.charset.Charset; - -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.LoggerContext; -import org.apache.logging.log4j.core.net.Protocol; -import org.junit.AfterClass; -import org.junit.BeforeClass; - -public class UdpXmlSocketServerTest extends AbstractSocketServerTest { - - private static UdpSocketServer<InputStream> server; - - @BeforeClass - public static void setupClass() throws Exception { - LoggerContext.getContext(false).reconfigure(); - // Use a tiny buffer just to test the code, the TCP test uses a large buffer - server = new UdpSocketServer<>(PORT_NUM, new XmlInputStreamLogEventBridge(100, - Charset.defaultCharset())); - thread = server.startNewThread(); - } - - @AfterClass - public static void tearDownClass() { - server.shutdown(); - try { - thread.join(); - } catch (final InterruptedException e) { - // ignore - } - } - - public UdpXmlSocketServerTest() { - super(Protocol.UDP, PORT, true); - } - - @Override - protected Layout<? extends Serializable> createLayout() { - return super.createXmlLayout(); - } - -} diff --git a/log4j-server/src/test/java/org/apache/logging/log4j/server/mom/activemq/ActiveMqBrokerServiceHelper.java b/log4j-server/src/test/java/org/apache/logging/log4j/server/mom/activemq/ActiveMqBrokerServiceHelper.java deleted file mode 100644 index e1fb522..0000000 --- a/log4j-server/src/test/java/org/apache/logging/log4j/server/mom/activemq/ActiveMqBrokerServiceHelper.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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.logging.log4j.server.mom.activemq; - -import java.io.IOException; - -import org.apache.activemq.broker.BrokerService; - -/** - * Helps starts an embedded Apache ActiveMQ service broker. - */ -public class ActiveMqBrokerServiceHelper { - - public static BrokerService startBrokerService(final String brokerName, String brokerUrlString, final int port) - throws Exception { - // TODO Abstract out scheme - brokerUrlString = "tcp://localhost:" + port; - final BrokerService broker = new BrokerService(); - // configure the Broker - broker.setBrokerName(brokerName); - broker.addConnector(brokerUrlString); - broker.setPersistent(false); - broker.start(); - broker.waitUntilStarted(); - return broker; - } - - public static void stopBrokerService(final BrokerService brokerService) throws IOException, Exception { - if (brokerService != null) { - brokerService.deleteAllMessages(); - brokerService.stop(); - brokerService.waitUntilStopped(); - } - } - -} diff --git a/log4j-server/src/test/java/org/apache/logging/log4j/server/mom/activemq/ActiveMqBrokerServiceRule.java b/log4j-server/src/test/java/org/apache/logging/log4j/server/mom/activemq/ActiveMqBrokerServiceRule.java deleted file mode 100644 index a3116ac..0000000 --- a/log4j-server/src/test/java/org/apache/logging/log4j/server/mom/activemq/ActiveMqBrokerServiceRule.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * 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.logging.log4j.server.mom.activemq; - -import org.apache.activemq.broker.BrokerService; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.TestMarkers; -import org.junit.rules.TestRule; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; - -/** - * JUnit {@link TestRule} to manage an in-JVM Apache ActiveMQ broker with socket - * communications between clients and broker. - */ -public class ActiveMqBrokerServiceRule implements TestRule { - - static final Logger logger = LogManager.getLogger(ActiveMqBrokerServiceRule.class); - - /** - * Apache Active MQ uses this property name to lookup which port to use to - * connect to a broker. - */ - public static final String PORT_PROPERTY_NAME = "org.apache.activemq.AMQ_PORT"; - - private final String brokerName; - - private String brokerUrlString; - - private final String portPropertyName; - - public ActiveMqBrokerServiceRule(final String brokerName, final String portPropertyName) { - this.brokerName = brokerName; - this.portPropertyName = portPropertyName; - } - - @Override - public Statement apply(final Statement base, final Description description) { - return new Statement() { - - @Override - public void evaluate() throws Throwable { - final BrokerService broker = ActiveMqBrokerServiceHelper.startBrokerService(brokerName, brokerUrlString, - Integer.parseInt(System.getProperty(portPropertyName))); - logger.debug(TestMarkers.TEST_RULE_LIFE_CYCLE, "{} started Apache Active MQ {}", - this.getClass().getSimpleName(), this); - try { - base.evaluate(); - } finally { - ActiveMqBrokerServiceHelper.stopBrokerService(broker); - logger.debug(TestMarkers.TEST_RULE_LIFE_CYCLE, "{} stopped Apache Active MQ {}", - this.getClass().getSimpleName(), this); - } - } - - }; - } - - public String getBrokerName() { - return brokerName; - } - - public String getBrokerUrlString() { - return brokerUrlString; - } - - @Override - public String toString() { - final StringBuilder builder = new StringBuilder(); - builder.append("ActiveMqBrokerServiceRule [brokerName="); - builder.append(brokerName); - builder.append(", bindAddress="); - builder.append(brokerUrlString); - builder.append("]"); - return builder.toString(); - } - -} diff --git a/log4j-server/src/test/java/org/apache/logging/log4j/server/mom/jms/JmsQueueReceiverTest.java b/log4j-server/src/test/java/org/apache/logging/log4j/server/mom/jms/JmsQueueReceiverTest.java deleted file mode 100644 index ba6ea87..0000000 --- a/log4j-server/src/test/java/org/apache/logging/log4j/server/mom/jms/JmsQueueReceiverTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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.logging.log4j.server.mom.jms; - -import org.apache.logging.log4j.server.mom.activemq.ActiveMqBrokerServiceRule; -import org.apache.logging.log4j.test.AvailablePortSystemPropertyTestRule; -import org.apache.logging.log4j.test.RuleChainFactory; -import org.junit.ClassRule; -import org.junit.Test; -import org.junit.rules.RuleChain; - -public class JmsQueueReceiverTest { - - private static final AvailablePortSystemPropertyTestRule portRule = AvailablePortSystemPropertyTestRule - .create(ActiveMqBrokerServiceRule.PORT_PROPERTY_NAME); - - private static final ActiveMqBrokerServiceRule activeMqBrokerServiceRule = new ActiveMqBrokerServiceRule( - JmsQueueReceiverTest.class.getName(), portRule.getName()); - - @ClassRule - public static RuleChain ruleChain = RuleChainFactory.create(portRule, activeMqBrokerServiceRule); - - @Test - public void testMain() throws Exception { - new JmsQueueReceiver().doMain(false, new String[] { "org.apache.activemq.jndi.ActiveMQInitialContextFactory", - "tcp://localhost:" + portRule.getPort(), "testq", "admin", "admin", "queue.testq", "testq" }); - } -} diff --git a/log4j-server/src/test/resources/org/apache/logging/log4j/core/net/ssl/client.log4j2-keystore.jks b/log4j-server/src/test/resources/org/apache/logging/log4j/core/net/ssl/client.log4j2-keystore.jks deleted file mode 100644 index 36f11b6..0000000 Binary files a/log4j-server/src/test/resources/org/apache/logging/log4j/core/net/ssl/client.log4j2-keystore.jks and /dev/null differ diff --git a/log4j-server/src/test/resources/org/apache/logging/log4j/core/net/ssl/truststore.jks b/log4j-server/src/test/resources/org/apache/logging/log4j/core/net/ssl/truststore.jks deleted file mode 100644 index 0e6aaf2..0000000 Binary files a/log4j-server/src/test/resources/org/apache/logging/log4j/core/net/ssl/truststore.jks and /dev/null differ
