logging-log4j-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Matt Sicker <boa...@gmail.com>
Subject Re: [1/2] logging-log4j2 git commit: Deprecate org.apache.logging.log4j.core.util.NullOutputStream.NULL_OUTPUT_STREAM in favor of org.apache.logging.log4j.core.util.NullOutputStream.getInstance().
Date Thu, 08 Sep 2016 14:11:35 GMT
We can just convert everything to LF. Needs to be done on all active
branches, though, or else we'll get crazy merge conflicts I think.

On 8 September 2016 at 02:15, Gary Gregory <garydgregory@gmail.com> wrote:

> Let's all agree to 'something' and have that 'something' tested. Then we
> can add it to our site docs.
>
> Gary
>
> On Thu, Sep 8, 2016 at 12:10 AM, Remko Popma <remko.popma@gmail.com>
> wrote:
>
>> Guys, would it be possible to do something about the commit mails showing
>> all lines as changed?
>>
>> It seems that we need to take two steps:
>> 1. Change Eclipse settings: http://stackoverflow.com/a/24337518/1446916
>> 2. Convert CRLF to unix LF in existing files.
>>
>> Apparently there's no need to configure.gitattributes or core.autocrlf
>>
>> There is no way to see what changed at the moment...
>>
>> Remko
>>
>> Sent from my iPhone
>>
>> > On 2016/09/08, at 12:54, ggregory@apache.org wrote:
>> >
>> > Repository: logging-log4j2
>> > Updated Branches:
>> >  refs/heads/master d85a0589b -> f73f89b14
>> >
>> >
>> > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f
>> 73f89b1/log4j-core/src/main/java/org/apache/logging/log4j/co
>> re/net/TcpSocketManager.java
>> > ----------------------------------------------------------------------
>> > diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/net
>> /TcpSocketManager.java
>> > index 855b99a..444c250 100644
>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net
>> /TcpSocketManager.java
>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net
>> /TcpSocketManager.java
>> > @@ -1,327 +1,327 @@
>> > -/*
>> > - * 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.core.net;
>> > -
>> > -import java.io.IOException;
>> > -import java.io.OutputStream;
>> > -import java.io.Serializable;
>> > -import java.net.ConnectException;
>> > -import java.net.InetAddress;
>> > -import java.net.InetSocketAddress;
>> > -import java.net.Socket;
>> > -import java.net.UnknownHostException;
>> > -import java.util.HashMap;
>> > -import java.util.Map;
>> > -import java.util.concurrent.CountDownLatch;
>> > -
>> > -import org.apache.logging.log4j.core.Layout;
>> > -import org.apache.logging.log4j.core.appender.AppenderLoggingExcept
>> ion;
>> > -import org.apache.logging.log4j.core.appender.ManagerFactory;
>> > -import org.apache.logging.log4j.core.appender.OutputStreamManager;
>> > -import org.apache.logging.log4j.core.util.Log4jThread;
>> > -import org.apache.logging.log4j.core.util.NullOutputStream;
>> > -import org.apache.logging.log4j.util.Strings;
>> > -
>> > -/**
>> > - * Manager of TCP Socket connections.
>> > - */
>> > -public class TcpSocketManager extends AbstractSocketManager {
>> > -    /**
>> > -      The default reconnection delay (30000 milliseconds or 30
>> seconds).
>> > -     */
>> > -    public static final int DEFAULT_RECONNECTION_DELAY_MILLIS   =
>> 30000;
>> > -    /**
>> > -      The default port number of remote logging server (4560).
>> > -     */
>> > -    private static final int DEFAULT_PORT = 4560;
>> > -
>> > -    private static final TcpSocketManagerFactory FACTORY = new
>> TcpSocketManagerFactory();
>> > -
>> > -    private final int reconnectionDelay;
>> > -
>> > -    private Reconnector reconnector;
>> > -
>> > -    private Socket socket;
>> > -
>> > -    private final boolean retry;
>> > -
>> > -    private final boolean immediateFail;
>> > -
>> > -    private final int connectTimeoutMillis;
>> > -
>> > -    /**
>> > -     * The Constructor.
>> > -     * @param name The unique name of this connection.
>> > -     * @param os The OutputStream.
>> > -     * @param socket The Socket.
>> > -     * @param inetAddress The Internet address of the host.
>> > -     * @param host The name of the host.
>> > -     * @param port The port number on the host.
>> > -     * @param connectTimeoutMillis the connect timeout in milliseconds.
>> > -     * @param delay Reconnection interval.
>> > -     * @param immediateFail True if the write should fail if no socket
>> is immediately available.
>> > -     * @param layout The Layout.
>> > -     * @param bufferSize The buffer size.
>> > -     */
>> > -    public TcpSocketManager(final String name, final OutputStream os,
>> final Socket socket, final InetAddress inetAddress,
>> > -                            final String host, final int port, final
>> int connectTimeoutMillis, final int delay,
>> > -                            final boolean immediateFail, final
>> Layout<? extends Serializable> layout, final int bufferSize) {
>> > -        super(name, os, inetAddress, host, port, layout, true,
>> bufferSize);
>> > -        this.connectTimeoutMillis = connectTimeoutMillis;
>> > -        this.reconnectionDelay = delay;
>> > -        this.socket = socket;
>> > -        this.immediateFail = immediateFail;
>> > -        retry = delay > 0;
>> > -        if (socket == null) {
>> > -            reconnector = createReconnector();
>> > -            reconnector.start();
>> > -        }
>> > -    }
>> > -
>> > -    /**
>> > -     * Obtain a TcpSocketManager.
>> > -     * @param host The host to connect to.
>> > -     * @param port The port on the host.
>> > -     * @param connectTimeoutMillis the connect timeout in milliseconds
>> > -     * @param reconnectDelayMillis The interval to pause between
>> retries.
>> > -     * @param bufferSize The buffer size.
>> > -     * @return A TcpSocketManager.
>> > -     */
>> > -    public static TcpSocketManager getSocketManager(final String host,
>> int port, final int connectTimeoutMillis,
>> > -            int reconnectDelayMillis, final boolean immediateFail,
>> final Layout<? extends Serializable> layout, final int bufferSize) {
>> > -        if (Strings.isEmpty(host)) {
>> > -            throw new IllegalArgumentException("A host name is
>> required");
>> > -        }
>> > -        if (port <= 0) {
>> > -            port = DEFAULT_PORT;
>> > -        }
>> > -        if (reconnectDelayMillis == 0) {
>> > -            reconnectDelayMillis = DEFAULT_RECONNECTION_DELAY_MILLIS;
>> > -        }
>> > -        return (TcpSocketManager) getManager("TCP:" + host + ':' +
>> port, new FactoryData(
>> > -                host, port, connectTimeoutMillis,
>> reconnectDelayMillis, immediateFail, layout, bufferSize), FACTORY);
>> > -    }
>> > -
>> > -    @Override
>> > -    protected void write(final byte[] bytes, final int offset, final
>> int length, final boolean immediateFlush)  {
>> > -        if (socket == null) {
>> > -            if (reconnector != null && !immediateFail) {
>> > -                reconnector.latch();
>> > -            }
>> > -            if (socket == null) {
>> > -                final String msg = "Error writing to " + getName() + "
>> socket not available";
>> > -                throw new AppenderLoggingException(msg);
>> > -            }
>> > -        }
>> > -        synchronized (this) {
>> > -            try {
>> > -                final OutputStream outputStream = getOutputStream();
>> > -                outputStream.write(bytes, offset, length);
>> > -                if (immediateFlush) {
>> > -                    outputStream.flush();
>> > -                }
>> > -            } catch (final IOException ex) {
>> > -                if (retry && reconnector == null) {
>> > -                    reconnector = createReconnector();
>> > -                    reconnector.start();
>> > -                }
>> > -                final String msg = "Error writing to " + getName();
>> > -                throw new AppenderLoggingException(msg, ex);
>> > -            }
>> > -        }
>> > -    }
>> > -
>> > -    @Override
>> > -    protected synchronized boolean closeOutputStream() {
>> > -        boolean closed = super.closeOutputStream();
>> > -        if (reconnector != null) {
>> > -            reconnector.shutdown();
>> > -            reconnector.interrupt();
>> > -            reconnector = null;
>> > -        }
>> > -        final Socket oldSocket = socket;
>> > -        socket = null;
>> > -        if (oldSocket != null) {
>> > -            try {
>> > -                oldSocket.close();
>> > -            } catch (final IOException e) {
>> > -                LOGGER.error("Could not close socket {}", socket);
>> > -                return false;
>> > -            }
>> > -        }
>> > -        return closed;
>> > -    }
>> > -
>> > -    public int getConnectTimeoutMillis() {
>> > -        return connectTimeoutMillis;
>> > -    }
>> > -
>> > -    /**
>> > -     * Gets this TcpSocketManager's content format. Specified by:
>> > -     * <ul>
>> > -     * <li>Key: "protocol" Value: "tcp"</li>
>> > -     * <li>Key: "direction" Value: "out"</li>
>> > -     * </ul>
>> > -     *
>> > -     * @return Map of content format keys supporting TcpSocketManager
>> > -     */
>> > -    @Override
>> > -    public Map<String, String> getContentFormat() {
>> > -        final Map<String, String> result = new
>> HashMap<>(super.getContentFormat());
>> > -        result.put("protocol", "tcp");
>> > -        result.put("direction", "out");
>> > -        return result;
>> > -    }
>> > -
>> > -    /**
>> > -     * Handles reconnecting to a Thread.
>> > -     */
>> > -    private class Reconnector extends Log4jThread {
>> > -
>> > -        private final CountDownLatch latch = new CountDownLatch(1);
>> > -
>> > -        private boolean shutdown = false;
>> > -
>> > -        private final Object owner;
>> > -
>> > -        public Reconnector(final OutputStreamManager owner) {
>> > -            super("TcpSocketManager-Reconnector");
>> > -            this.owner = owner;
>> > -        }
>> > -
>> > -        public void latch()  {
>> > -            try {
>> > -                latch.await();
>> > -            } catch (final InterruptedException ex) {
>> > -                // Ignore the exception.
>> > -            }
>> > -        }
>> > -
>> > -        public void shutdown() {
>> > -            shutdown = true;
>> > -        }
>> > -
>> > -        @Override
>> > -        public void run() {
>> > -            while (!shutdown) {
>> > -                try {
>> > -                    sleep(reconnectionDelay);
>> > -                    final Socket sock = createSocket(inetAddress,
>> port);
>> > -                    final OutputStream newOS = sock.getOutputStream();
>> > -                    synchronized (owner) {
>> > -                        try {
>> > -                            getOutputStream().close();
>> > -                        } catch (final IOException ioe) {
>> > -                            // Ignore this.
>> > -                        }
>> > -
>> > -                        setOutputStream(newOS);
>> > -                        socket = sock;
>> > -                        reconnector = null;
>> > -                        shutdown = true;
>> > -                    }
>> > -                    LOGGER.debug("Connection to " + host + ':' + port
>> + " reestablished.");
>> > -                } catch (final InterruptedException ie) {
>> > -                    LOGGER.debug("Reconnection interrupted.");
>> > -                } catch (final ConnectException ex) {
>> > -                    LOGGER.debug(host + ':' + port + " refused
>> connection");
>> > -                } catch (final IOException ioe) {
>> > -                    LOGGER.debug("Unable to reconnect to " + host +
>> ':' + port);
>> > -                } finally {
>> > -                    latch.countDown();
>> > -                }
>> > -            }
>> > -        }
>> > -    }
>> > -
>> > -    private Reconnector createReconnector() {
>> > -        final Reconnector recon = new Reconnector(this);
>> > -        recon.setDaemon(true);
>> > -        recon.setPriority(Thread.MIN_PRIORITY);
>> > -        return recon;
>> > -    }
>> > -
>> > -    protected Socket createSocket(final InetAddress host, final int
>> port) throws IOException {
>> > -        return createSocket(host.getHostName(), port);
>> > -    }
>> > -
>> > -    protected Socket createSocket(final String host, final int port)
>> throws IOException {
>> > -        final InetSocketAddress address = new InetSocketAddress(host,
>> port);
>> > -        final Socket newSocket = new Socket();
>> > -        newSocket.connect(address, connectTimeoutMillis);
>> > -        return newSocket;
>> > -    }
>> > -
>> > -    /**
>> > -     * Data for the factory.
>> > -     */
>> > -    private static class FactoryData {
>> > -        private final String host;
>> > -        private final int port;
>> > -        private final int connectTimeoutMillis;
>> > -        private final int reconnectDelayMillis;
>> > -        private final boolean immediateFail;
>> > -        private final Layout<? extends Serializable> layout;
>> > -        private final int bufferSize;
>> > -
>> > -        public FactoryData(final String host, final int port, final
>> int connectTimeoutMillis, final int reconnectDelayMillis,
>> > -                           final boolean immediateFail, final Layout<?
>> extends Serializable> layout, final int bufferSize) {
>> > -            this.host = host;
>> > -            this.port = port;
>> > -            this.connectTimeoutMillis = connectTimeoutMillis;
>> > -            this.reconnectDelayMillis = reconnectDelayMillis;
>> > -            this.immediateFail = immediateFail;
>> > -            this.layout = layout;
>> > -            this.bufferSize = bufferSize;
>> > -        }
>> > -    }
>> > -
>> > -    /**
>> > -     * Factory to create a TcpSocketManager.
>> > -     */
>> > -    protected static class TcpSocketManagerFactory implements
>> ManagerFactory<TcpSocketManager, FactoryData> {
>> > -        @Override
>> > -        public TcpSocketManager createManager(final String name, final
>> FactoryData data) {
>> > -
>> > -            InetAddress inetAddress;
>> > -            OutputStream os;
>> > -            try {
>> > -                inetAddress = InetAddress.getByName(data.host);
>> > -            } catch (final UnknownHostException ex) {
>> > -                LOGGER.error("Could not find address of " + data.host,
>> ex, ex);
>> > -                return null;
>> > -            }
>> > -            try {
>> > -                // LOG4J2-1042
>> > -                final Socket socket = new Socket();
>> > -                socket.connect(new InetSocketAddress(data.host,
>> data.port), data.connectTimeoutMillis);
>> > -                os = socket.getOutputStream();
>> > -                return new TcpSocketManager(name, os, socket,
>> inetAddress, data.host, data.port,
>> > -                        data.connectTimeoutMillis,
>> data.reconnectDelayMillis, data.immediateFail, data.layout,
>> data.bufferSize);
>> > -            } catch (final IOException ex) {
>> > -                LOGGER.error("TcpSocketManager (" + name + ") " + ex,
>> ex);
>> > -                os = NullOutputStream.NULL_OUTPUT_STREAM;
>> > -            }
>> > -            if (data.reconnectDelayMillis == 0) {
>> > -                return null;
>> > -            }
>> > -            return new TcpSocketManager(name, os, null, inetAddress,
>> data.host, data.port, data.connectTimeoutMillis,
>> > -                    data.reconnectDelayMillis, data.immediateFail,
>> data.layout, data.bufferSize);
>> > -        }
>> > -    }
>> > -
>> > -}
>> > +/*
>> > + * 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.core.net;
>> > +
>> > +import java.io.IOException;
>> > +import java.io.OutputStream;
>> > +import java.io.Serializable;
>> > +import java.net.ConnectException;
>> > +import java.net.InetAddress;
>> > +import java.net.InetSocketAddress;
>> > +import java.net.Socket;
>> > +import java.net.UnknownHostException;
>> > +import java.util.HashMap;
>> > +import java.util.Map;
>> > +import java.util.concurrent.CountDownLatch;
>> > +
>> > +import org.apache.logging.log4j.core.Layout;
>> > +import org.apache.logging.log4j.core.appender.AppenderLoggingExcept
>> ion;
>> > +import org.apache.logging.log4j.core.appender.ManagerFactory;
>> > +import org.apache.logging.log4j.core.appender.OutputStreamManager;
>> > +import org.apache.logging.log4j.core.util.Log4jThread;
>> > +import org.apache.logging.log4j.core.util.NullOutputStream;
>> > +import org.apache.logging.log4j.util.Strings;
>> > +
>> > +/**
>> > + * Manager of TCP Socket connections.
>> > + */
>> > +public class TcpSocketManager extends AbstractSocketManager {
>> > +    /**
>> > +      The default reconnection delay (30000 milliseconds or 30
>> seconds).
>> > +     */
>> > +    public static final int DEFAULT_RECONNECTION_DELAY_MILLIS   =
>> 30000;
>> > +    /**
>> > +      The default port number of remote logging server (4560).
>> > +     */
>> > +    private static final int DEFAULT_PORT = 4560;
>> > +
>> > +    private static final TcpSocketManagerFactory FACTORY = new
>> TcpSocketManagerFactory();
>> > +
>> > +    private final int reconnectionDelay;
>> > +
>> > +    private Reconnector reconnector;
>> > +
>> > +    private Socket socket;
>> > +
>> > +    private final boolean retry;
>> > +
>> > +    private final boolean immediateFail;
>> > +
>> > +    private final int connectTimeoutMillis;
>> > +
>> > +    /**
>> > +     * The Constructor.
>> > +     * @param name The unique name of this connection.
>> > +     * @param os The OutputStream.
>> > +     * @param socket The Socket.
>> > +     * @param inetAddress The Internet address of the host.
>> > +     * @param host The name of the host.
>> > +     * @param port The port number on the host.
>> > +     * @param connectTimeoutMillis the connect timeout in milliseconds.
>> > +     * @param delay Reconnection interval.
>> > +     * @param immediateFail True if the write should fail if no socket
>> is immediately available.
>> > +     * @param layout The Layout.
>> > +     * @param bufferSize The buffer size.
>> > +     */
>> > +    public TcpSocketManager(final String name, final OutputStream os,
>> final Socket socket, final InetAddress inetAddress,
>> > +                            final String host, final int port, final
>> int connectTimeoutMillis, final int delay,
>> > +                            final boolean immediateFail, final
>> Layout<? extends Serializable> layout, final int bufferSize) {
>> > +        super(name, os, inetAddress, host, port, layout, true,
>> bufferSize);
>> > +        this.connectTimeoutMillis = connectTimeoutMillis;
>> > +        this.reconnectionDelay = delay;
>> > +        this.socket = socket;
>> > +        this.immediateFail = immediateFail;
>> > +        retry = delay > 0;
>> > +        if (socket == null) {
>> > +            reconnector = createReconnector();
>> > +            reconnector.start();
>> > +        }
>> > +    }
>> > +
>> > +    /**
>> > +     * Obtain a TcpSocketManager.
>> > +     * @param host The host to connect to.
>> > +     * @param port The port on the host.
>> > +     * @param connectTimeoutMillis the connect timeout in milliseconds
>> > +     * @param reconnectDelayMillis The interval to pause between
>> retries.
>> > +     * @param bufferSize The buffer size.
>> > +     * @return A TcpSocketManager.
>> > +     */
>> > +    public static TcpSocketManager getSocketManager(final String host,
>> int port, final int connectTimeoutMillis,
>> > +            int reconnectDelayMillis, final boolean immediateFail,
>> final Layout<? extends Serializable> layout, final int bufferSize) {
>> > +        if (Strings.isEmpty(host)) {
>> > +            throw new IllegalArgumentException("A host name is
>> required");
>> > +        }
>> > +        if (port <= 0) {
>> > +            port = DEFAULT_PORT;
>> > +        }
>> > +        if (reconnectDelayMillis == 0) {
>> > +            reconnectDelayMillis = DEFAULT_RECONNECTION_DELAY_MILLIS;
>> > +        }
>> > +        return (TcpSocketManager) getManager("TCP:" + host + ':' +
>> port, new FactoryData(
>> > +                host, port, connectTimeoutMillis,
>> reconnectDelayMillis, immediateFail, layout, bufferSize), FACTORY);
>> > +    }
>> > +
>> > +    @Override
>> > +    protected void write(final byte[] bytes, final int offset, final
>> int length, final boolean immediateFlush)  {
>> > +        if (socket == null) {
>> > +            if (reconnector != null && !immediateFail) {
>> > +                reconnector.latch();
>> > +            }
>> > +            if (socket == null) {
>> > +                final String msg = "Error writing to " + getName() + "
>> socket not available";
>> > +                throw new AppenderLoggingException(msg);
>> > +            }
>> > +        }
>> > +        synchronized (this) {
>> > +            try {
>> > +                final OutputStream outputStream = getOutputStream();
>> > +                outputStream.write(bytes, offset, length);
>> > +                if (immediateFlush) {
>> > +                    outputStream.flush();
>> > +                }
>> > +            } catch (final IOException ex) {
>> > +                if (retry && reconnector == null) {
>> > +                    reconnector = createReconnector();
>> > +                    reconnector.start();
>> > +                }
>> > +                final String msg = "Error writing to " + getName();
>> > +                throw new AppenderLoggingException(msg, ex);
>> > +            }
>> > +        }
>> > +    }
>> > +
>> > +    @Override
>> > +    protected synchronized boolean closeOutputStream() {
>> > +        boolean closed = super.closeOutputStream();
>> > +        if (reconnector != null) {
>> > +            reconnector.shutdown();
>> > +            reconnector.interrupt();
>> > +            reconnector = null;
>> > +        }
>> > +        final Socket oldSocket = socket;
>> > +        socket = null;
>> > +        if (oldSocket != null) {
>> > +            try {
>> > +                oldSocket.close();
>> > +            } catch (final IOException e) {
>> > +                LOGGER.error("Could not close socket {}", socket);
>> > +                return false;
>> > +            }
>> > +        }
>> > +        return closed;
>> > +    }
>> > +
>> > +    public int getConnectTimeoutMillis() {
>> > +        return connectTimeoutMillis;
>> > +    }
>> > +
>> > +    /**
>> > +     * Gets this TcpSocketManager's content format. Specified by:
>> > +     * <ul>
>> > +     * <li>Key: "protocol" Value: "tcp"</li>
>> > +     * <li>Key: "direction" Value: "out"</li>
>> > +     * </ul>
>> > +     *
>> > +     * @return Map of content format keys supporting TcpSocketManager
>> > +     */
>> > +    @Override
>> > +    public Map<String, String> getContentFormat() {
>> > +        final Map<String, String> result = new
>> HashMap<>(super.getContentFormat());
>> > +        result.put("protocol", "tcp");
>> > +        result.put("direction", "out");
>> > +        return result;
>> > +    }
>> > +
>> > +    /**
>> > +     * Handles reconnecting to a Thread.
>> > +     */
>> > +    private class Reconnector extends Log4jThread {
>> > +
>> > +        private final CountDownLatch latch = new CountDownLatch(1);
>> > +
>> > +        private boolean shutdown = false;
>> > +
>> > +        private final Object owner;
>> > +
>> > +        public Reconnector(final OutputStreamManager owner) {
>> > +            super("TcpSocketManager-Reconnector");
>> > +            this.owner = owner;
>> > +        }
>> > +
>> > +        public void latch()  {
>> > +            try {
>> > +                latch.await();
>> > +            } catch (final InterruptedException ex) {
>> > +                // Ignore the exception.
>> > +            }
>> > +        }
>> > +
>> > +        public void shutdown() {
>> > +            shutdown = true;
>> > +        }
>> > +
>> > +        @Override
>> > +        public void run() {
>> > +            while (!shutdown) {
>> > +                try {
>> > +                    sleep(reconnectionDelay);
>> > +                    final Socket sock = createSocket(inetAddress,
>> port);
>> > +                    final OutputStream newOS = sock.getOutputStream();
>> > +                    synchronized (owner) {
>> > +                        try {
>> > +                            getOutputStream().close();
>> > +                        } catch (final IOException ioe) {
>> > +                            // Ignore this.
>> > +                        }
>> > +
>> > +                        setOutputStream(newOS);
>> > +                        socket = sock;
>> > +                        reconnector = null;
>> > +                        shutdown = true;
>> > +                    }
>> > +                    LOGGER.debug("Connection to " + host + ':' + port
>> + " reestablished.");
>> > +                } catch (final InterruptedException ie) {
>> > +                    LOGGER.debug("Reconnection interrupted.");
>> > +                } catch (final ConnectException ex) {
>> > +                    LOGGER.debug(host + ':' + port + " refused
>> connection");
>> > +                } catch (final IOException ioe) {
>> > +                    LOGGER.debug("Unable to reconnect to " + host +
>> ':' + port);
>> > +                } finally {
>> > +                    latch.countDown();
>> > +                }
>> > +            }
>> > +        }
>> > +    }
>> > +
>> > +    private Reconnector createReconnector() {
>> > +        final Reconnector recon = new Reconnector(this);
>> > +        recon.setDaemon(true);
>> > +        recon.setPriority(Thread.MIN_PRIORITY);
>> > +        return recon;
>> > +    }
>> > +
>> > +    protected Socket createSocket(final InetAddress host, final int
>> port) throws IOException {
>> > +        return createSocket(host.getHostName(), port);
>> > +    }
>> > +
>> > +    protected Socket createSocket(final String host, final int port)
>> throws IOException {
>> > +        final InetSocketAddress address = new InetSocketAddress(host,
>> port);
>> > +        final Socket newSocket = new Socket();
>> > +        newSocket.connect(address, connectTimeoutMillis);
>> > +        return newSocket;
>> > +    }
>> > +
>> > +    /**
>> > +     * Data for the factory.
>> > +     */
>> > +    private static class FactoryData {
>> > +        private final String host;
>> > +        private final int port;
>> > +        private final int connectTimeoutMillis;
>> > +        private final int reconnectDelayMillis;
>> > +        private final boolean immediateFail;
>> > +        private final Layout<? extends Serializable> layout;
>> > +        private final int bufferSize;
>> > +
>> > +        public FactoryData(final String host, final int port, final
>> int connectTimeoutMillis, final int reconnectDelayMillis,
>> > +                           final boolean immediateFail, final Layout<?
>> extends Serializable> layout, final int bufferSize) {
>> > +            this.host = host;
>> > +            this.port = port;
>> > +            this.connectTimeoutMillis = connectTimeoutMillis;
>> > +            this.reconnectDelayMillis = reconnectDelayMillis;
>> > +            this.immediateFail = immediateFail;
>> > +            this.layout = layout;
>> > +            this.bufferSize = bufferSize;
>> > +        }
>> > +    }
>> > +
>> > +    /**
>> > +     * Factory to create a TcpSocketManager.
>> > +     */
>> > +    protected static class TcpSocketManagerFactory implements
>> ManagerFactory<TcpSocketManager, FactoryData> {
>> > +        @Override
>> > +        public TcpSocketManager createManager(final String name, final
>> FactoryData data) {
>> > +
>> > +            InetAddress inetAddress;
>> > +            OutputStream os;
>> > +            try {
>> > +                inetAddress = InetAddress.getByName(data.host);
>> > +            } catch (final UnknownHostException ex) {
>> > +                LOGGER.error("Could not find address of " + data.host,
>> ex, ex);
>> > +                return null;
>> > +            }
>> > +            try {
>> > +                // LOG4J2-1042
>> > +                final Socket socket = new Socket();
>> > +                socket.connect(new InetSocketAddress(data.host,
>> data.port), data.connectTimeoutMillis);
>> > +                os = socket.getOutputStream();
>> > +                return new TcpSocketManager(name, os, socket,
>> inetAddress, data.host, data.port,
>> > +                        data.connectTimeoutMillis,
>> data.reconnectDelayMillis, data.immediateFail, data.layout,
>> data.bufferSize);
>> > +            } catch (final IOException ex) {
>> > +                LOGGER.error("TcpSocketManager (" + name + ") " + ex,
>> ex);
>> > +                os = NullOutputStream.getInstance();
>> > +            }
>> > +            if (data.reconnectDelayMillis == 0) {
>> > +                return null;
>> > +            }
>> > +            return new TcpSocketManager(name, os, null, inetAddress,
>> data.host, data.port, data.connectTimeoutMillis,
>> > +                    data.reconnectDelayMillis, data.immediateFail,
>> data.layout, data.bufferSize);
>> > +        }
>> > +    }
>> > +
>> > +}
>> >
>> > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f
>> 73f89b1/log4j-core/src/main/java/org/apache/logging/log4j/co
>> re/util/NullOutputStream.java
>> > ----------------------------------------------------------------------
>> > diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/NullOutputStream.java
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/uti
>> l/NullOutputStream.java
>> > index 9382f9d..846db3b 100644
>> > --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/uti
>> l/NullOutputStream.java
>> > +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/uti
>> l/NullOutputStream.java
>> > @@ -31,11 +31,18 @@ import java.io.OutputStream;
>> >  */
>> > public class NullOutputStream extends OutputStream {
>> >
>> > +    private static final NullOutputStream INSTANCE = new
>> NullOutputStream();
>> > +
>> >     /**
>> > -     * A singleton.
>> > +     * @deprecated Use {@link #getInstance()}.
>> >      */
>> > +    @Deprecated
>> >     public static final NullOutputStream NULL_OUTPUT_STREAM = new
>> NullOutputStream();
>> >
>> > +    public static NullOutputStream getInstance() {
>> > +        return INSTANCE;
>> > +    }
>> > +
>> >     private NullOutputStream() {
>> >         // do nothing
>> >     }
>> >
>> > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f
>> 73f89b1/log4j-core/src/test/java/org/apache/logging/log4j/co
>> re/appender/RandomAccessFileManagerTest.java
>> > ----------------------------------------------------------------------
>> > diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/app
>> ender/RandomAccessFileManagerTest.java b/log4j-core/src/test/java/org
>> /apache/logging/log4j/core/appender/RandomAccessFileManagerTest.java
>> > index fb84266..3cbaa68 100644
>> > --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/app
>> ender/RandomAccessFileManagerTest.java
>> > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/app
>> ender/RandomAccessFileManagerTest.java
>> > @@ -46,7 +46,7 @@ public class RandomAccessFileManagerTest {
>> >     public void testWrite_multiplesOfBufferSize() throws IOException {
>> >         final File file = folder.newFile();
>> >         try (final RandomAccessFile raf = new RandomAccessFile(file,
>> "rw")) {
>> > -            final OutputStream os = NullOutputStream.NULL_OUTPUT_S
>> TREAM;
>> > +            final OutputStream os = NullOutputStream.getInstance();
>> >             final RandomAccessFileManager manager = new
>> RandomAccessFileManager(null, raf, file.getName(),
>> >                     os, RandomAccessFileManager.DEFAULT_BUFFER_SIZE,
>> null, null, true);
>> >
>> > @@ -67,7 +67,7 @@ public class RandomAccessFileManagerTest {
>> >     public void testWrite_dataExceedingBufferSize() throws IOException
>> {
>> >         final File file = folder.newFile();
>> >         try (final RandomAccessFile raf = new RandomAccessFile(file,
>> "rw")) {
>> > -            final OutputStream os = NullOutputStream.NULL_OUTPUT_S
>> TREAM;
>> > +            final OutputStream os = NullOutputStream.getInstance();
>> >             final RandomAccessFileManager manager = new
>> RandomAccessFileManager(null, raf, file.getName(),
>> >                     os, RandomAccessFileManager.DEFAULT_BUFFER_SIZE,
>> null, null, true);
>> >
>> > @@ -85,7 +85,7 @@ public class RandomAccessFileManagerTest {
>> >     public void testConfigurableBufferSize() throws IOException {
>> >         final File file = folder.newFile();
>> >         try (final RandomAccessFile raf = new RandomAccessFile(file,
>> "rw")) {
>> > -            final OutputStream os = NullOutputStream.NULL_OUTPUT_S
>> TREAM;
>> > +            final OutputStream os = NullOutputStream.getInstance();
>> >             final int bufferSize = 4 * 1024;
>> >             assertNotEquals(bufferSize, RandomAccessFileManager.DEFAUL
>> T_BUFFER_SIZE);
>> >
>> > @@ -100,7 +100,7 @@ public class RandomAccessFileManagerTest {
>> >     public void testWrite_dataExceedingMinBufferSize() throws
>> IOException {
>> >         final File file = folder.newFile();
>> >         try (final RandomAccessFile raf = new RandomAccessFile(file,
>> "rw")) {
>> > -            final OutputStream os = NullOutputStream.NULL_OUTPUT_S
>> TREAM;
>> > +            final OutputStream os = NullOutputStream.getInstance();
>> >             final int bufferSize = 1;
>> >             final RandomAccessFileManager manager = new
>> RandomAccessFileManager(null, raf, file.getName(),
>> >                     os, bufferSize, null, null, true);
>> >
>> > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f
>> 73f89b1/log4j-core/src/test/java/org/apache/logging/log4j/co
>> re/appender/rolling/RollingRandomAccessFileManagerTest.java
>> > ----------------------------------------------------------------------
>> > diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/app
>> ender/rolling/RollingRandomAccessFileManagerTest.java
>> b/log4j-core/src/test/java/org/apache/logging/log4j/core/app
>> ender/rolling/RollingRandomAccessFileManagerTest.java
>> > index c9486f0..eb8c095 100644
>> > --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/app
>> ender/rolling/RollingRandomAccessFileManagerTest.java
>> > +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/app
>> ender/rolling/RollingRandomAccessFileManagerTest.java
>> > @@ -51,7 +51,7 @@ public class RollingRandomAccessFileManagerTest {
>> >         final File file = File.createTempFile("log4j2", "test");
>> >         file.deleteOnExit();
>> >         try (final RandomAccessFile raf = new RandomAccessFile(file,
>> "rw")) {
>> > -            final OutputStream os = NullOutputStream.NULL_OUTPUT_S
>> TREAM;
>> > +            final OutputStream os = NullOutputStream.getInstance();
>> >             final boolean append = false;
>> >             final boolean flushNow = false;
>> >             final long triggerSize = Long.MAX_VALUE;
>> > @@ -80,7 +80,7 @@ public class RollingRandomAccessFileManagerTest {
>> >         final File file = File.createTempFile("log4j2", "test");
>> >         file.deleteOnExit();
>> >         try (final RandomAccessFile raf = new RandomAccessFile(file,
>> "rw")) {
>> > -            final OutputStream os = NullOutputStream.NULL_OUTPUT_S
>> TREAM;
>> > +            final OutputStream os = NullOutputStream.getInstance();
>> >             final boolean append = false;
>> >             final boolean flushNow = false;
>> >             final long triggerSize = 0;
>> > @@ -106,7 +106,7 @@ public class RollingRandomAccessFileManagerTest {
>> >         final File file = File.createTempFile("log4j2", "test");
>> >         file.deleteOnExit();
>> >         try (final RandomAccessFile raf = new RandomAccessFile(file,
>> "rw")) {
>> > -            final OutputStream os = NullOutputStream.NULL_OUTPUT_S
>> TREAM;
>> > +            final OutputStream os = NullOutputStream.getInstance();
>> >             final boolean append = false;
>> >             final boolean flushNow = false;
>> >             final long triggerSize = 0;
>> >
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
>> For additional commands, e-mail: log4j-dev-help@logging.apache.org
>>
>>
>
>
> --
> E-Mail: garydgregory@gmail.com | ggregory@apache.org
> Java Persistence with Hibernate, Second Edition
> <http://www.manning.com/bauer3/>
> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> Spring Batch in Action <http://www.manning.com/templier/>
> Blog: http://garygregory.wordpress.com
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory
>



-- 
Matt Sicker <boards@gmail.com>

Mime
View raw message