How frugal of you! ;-) I edit on Windows, so that's a two-fer for me ;-) Gary
On Tue, Apr 12, 2016 at 12:04 PM, Matt Sicker <[email protected]> wrote: > I like unix endings because there's only one byte instead of two. > > On 12 April 2016 at 14:02, Gary Gregory <[email protected]> wrote: > >> Sure, pick one. >> >> Gary >> >> On Tue, Apr 12, 2016 at 12:01 PM, Matt Sicker <[email protected]> wrote: >> >>> It would be nice to standardize on a single line ending format at some >>> point, but it would be such a huge commit. >>> >>> On 12 April 2016 at 13:51, Gary Gregory <[email protected]> wrote: >>> >>>> I'm so annoyed and apologize for this all lines changed commit. I only >>>> renamed a variable. >>>> >>>> Gary >>>> >>>> ---------- Forwarded message ---------- >>>> From: <[email protected]> >>>> Date: Tue, Apr 12, 2016 at 11:47 AM >>>> Subject: logging-log4j2 git commit: I always use "Millis" as the post >>>> fix to avoid any confusion. >>>> To: [email protected] >>>> >>>> >>>> Repository: logging-log4j2 >>>> Updated Branches: >>>> refs/heads/master c55ace781 -> eb32b2f77 >>>> >>>> >>>> I always use "Millis" as the post fix to avoid any confusion. >>>> >>>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo >>>> Commit: >>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/eb32b2f7 >>>> Tree: >>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/eb32b2f7 >>>> Diff: >>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/eb32b2f7 >>>> >>>> Branch: refs/heads/master >>>> Commit: eb32b2f77634609a98c9940fac8e28b7e0d20f38 >>>> Parents: c55ace7 >>>> Author: ggregory <[email protected]> >>>> Authored: Tue Apr 12 11:47:03 2016 -0700 >>>> Committer: ggregory <[email protected]> >>>> Committed: Tue Apr 12 11:47:03 2016 -0700 >>>> >>>> ---------------------------------------------------------------------- >>>> .../logging/log4j/core/async/DisruptorUtil.java | 296 >>>> +++++++++---------- >>>> 1 file changed, 148 insertions(+), 148 deletions(-) >>>> ---------------------------------------------------------------------- >>>> >>>> >>>> >>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/eb32b2f7/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java >>>> ---------------------------------------------------------------------- >>>> diff --git >>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java >>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java >>>> index 4faa174..3ce30f0 100644 >>>> --- >>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java >>>> +++ >>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java >>>> @@ -1,148 +1,148 @@ >>>> -/* >>>> - * 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.async; >>>> - >>>> -import java.util.concurrent.Callable; >>>> -import java.util.concurrent.ExecutorService; >>>> -import java.util.concurrent.Future; >>>> -import java.util.concurrent.TimeUnit; >>>> - >>>> -import com.lmax.disruptor.*; >>>> -import org.apache.logging.log4j.Logger; >>>> -import org.apache.logging.log4j.core.util.Constants; >>>> -import org.apache.logging.log4j.core.util.Integers; >>>> -import org.apache.logging.log4j.status.StatusLogger; >>>> -import org.apache.logging.log4j.util.LoaderUtil; >>>> -import org.apache.logging.log4j.util.PropertiesUtil; >>>> - >>>> -/** >>>> - * Utility methods for getting Disruptor related configuration. >>>> - */ >>>> -final class DisruptorUtil { >>>> - private static final Logger LOGGER = StatusLogger.getLogger(); >>>> - private static final int RINGBUFFER_MIN_SIZE = 128; >>>> - private static final int RINGBUFFER_DEFAULT_SIZE = 256 * 1024; >>>> - private static final int RINGBUFFER_NO_GC_DEFAULT_SIZE = 4 * 1024; >>>> - >>>> - private DisruptorUtil() { >>>> - } >>>> - >>>> - static long getTimeout(final String propertyName, final long >>>> defaultTimeout) { >>>> - return >>>> PropertiesUtil.getProperties().getLongProperty(propertyName, >>>> defaultTimeout); >>>> - } >>>> - >>>> - static WaitStrategy createWaitStrategy(final String propertyName) { >>>> - final String key = propertyName.startsWith("AsyncLogger.") >>>> - ? "AsyncLogger.Timeout" >>>> - : "AsyncLoggerConfig.Timeout"; >>>> - final long timeout = DisruptorUtil.getTimeout(key, 10L); >>>> - return createWaitStrategy(propertyName, timeout); >>>> - } >>>> - >>>> - static WaitStrategy createWaitStrategy(final String propertyName, >>>> final long timeoutMs) { >>>> - final String strategy = >>>> PropertiesUtil.getProperties().getStringProperty(propertyName); >>>> - if (strategy != null) { >>>> - LOGGER.trace("property {}={}", propertyName, strategy); >>>> - if ("Sleep".equalsIgnoreCase(strategy)) { >>>> - return new SleepingWaitStrategy(); >>>> - } else if ("Yield".equalsIgnoreCase(strategy)) { >>>> - return new YieldingWaitStrategy(); >>>> - } else if ("Block".equalsIgnoreCase(strategy)) { >>>> - return new BlockingWaitStrategy(); >>>> - } else if ("BusySpin".equalsIgnoreCase(strategy)) { >>>> - return new BusySpinWaitStrategy(); >>>> - } else if ("Timeout".equalsIgnoreCase(strategy)) { >>>> - return new TimeoutBlockingWaitStrategy(timeoutMs, >>>> TimeUnit.MILLISECONDS); >>>> - } >>>> - } >>>> - return new TimeoutBlockingWaitStrategy(timeoutMs, >>>> TimeUnit.MILLISECONDS); >>>> - } >>>> - >>>> - static int calculateRingBufferSize(final String propertyName) { >>>> - int ringBufferSize = Constants.ENABLE_THREADLOCALS ? >>>> RINGBUFFER_NO_GC_DEFAULT_SIZE : RINGBUFFER_DEFAULT_SIZE; >>>> - final String userPreferredRBSize = >>>> PropertiesUtil.getProperties().getStringProperty(propertyName, >>>> - String.valueOf(ringBufferSize)); >>>> - try { >>>> - int size = Integer.parseInt(userPreferredRBSize); >>>> - if (size < RINGBUFFER_MIN_SIZE) { >>>> - size = RINGBUFFER_MIN_SIZE; >>>> - LOGGER.warn("Invalid RingBufferSize {}, using minimum >>>> size {}.", userPreferredRBSize, >>>> - RINGBUFFER_MIN_SIZE); >>>> - } >>>> - ringBufferSize = size; >>>> - } catch (final Exception ex) { >>>> - LOGGER.warn("Invalid RingBufferSize {}, using default size >>>> {}.", userPreferredRBSize, ringBufferSize); >>>> - } >>>> - return Integers.ceilingNextPowerOfTwo(ringBufferSize); >>>> - } >>>> - >>>> - static ExceptionHandler<RingBufferLogEvent> >>>> getAsyncLoggerExceptionHandler() { >>>> - final String cls = >>>> PropertiesUtil.getProperties().getStringProperty("AsyncLogger.ExceptionHandler"); >>>> - if (cls == null) { >>>> - return new DefaultAsyncLoggerExceptionHandler(); >>>> - } >>>> - try { >>>> - @SuppressWarnings("unchecked") >>>> - final Class<? extends >>>> ExceptionHandler<RingBufferLogEvent>> klass = >>>> - (Class<? extends >>>> ExceptionHandler<RingBufferLogEvent>>) LoaderUtil.loadClass(cls); >>>> - return klass.newInstance(); >>>> - } catch (final Exception ignored) { >>>> - LOGGER.debug("Invalid AsyncLogger.ExceptionHandler value: >>>> error creating {}: ", cls, ignored); >>>> - return new DefaultAsyncLoggerExceptionHandler(); >>>> - } >>>> - } >>>> - >>>> - static >>>> ExceptionHandler<AsyncLoggerConfigDisruptor.Log4jEventWrapper> >>>> getAsyncLoggerConfigExceptionHandler() { >>>> - final String cls = >>>> PropertiesUtil.getProperties().getStringProperty("AsyncLoggerConfig.ExceptionHandler"); >>>> - if (cls == null) { >>>> - return new DefaultAsyncLoggerConfigExceptionHandler(); >>>> - } >>>> - try { >>>> - @SuppressWarnings("unchecked") >>>> - final Class<? extends >>>> ExceptionHandler<AsyncLoggerConfigDisruptor.Log4jEventWrapper>> klass = >>>> - (Class<? extends >>>> ExceptionHandler<AsyncLoggerConfigDisruptor.Log4jEventWrapper>>) >>>> LoaderUtil.loadClass(cls); >>>> - return klass.newInstance(); >>>> - } catch (final Exception ignored) { >>>> - LOGGER.debug("Invalid AsyncLoggerConfig.ExceptionHandler >>>> value: error creating {}: ", cls, ignored); >>>> - return new DefaultAsyncLoggerConfigExceptionHandler(); >>>> - } >>>> - } >>>> - >>>> - /** >>>> - * Returns the thread ID of the background appender thread. This >>>> allows us to detect Logger.log() calls initiated >>>> - * from the appender thread, which may cause deadlock when the >>>> RingBuffer is full. (LOG4J2-471) >>>> - * >>>> - * @param executor runs the appender thread >>>> - * @return the thread ID of the background appender thread >>>> - */ >>>> - public static long getExecutorThreadId(final ExecutorService >>>> executor) { >>>> - Future<Long> result = executor.submit(new Callable<Long>() { >>>> - @Override >>>> - public Long call() { >>>> - return Thread.currentThread().getId(); >>>> - } >>>> - }); >>>> - try { >>>> - return result.get(); >>>> - } catch (final Exception ex) { >>>> - final String msg = "Could not obtain executor thread Id. " >>>> - + "Giving up to avoid the risk of application >>>> deadlock."; >>>> - throw new IllegalStateException(msg, ex); >>>> - } >>>> - } >>>> -} >>>> +/* >>>> + * 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.async; >>>> + >>>> +import java.util.concurrent.Callable; >>>> +import java.util.concurrent.ExecutorService; >>>> +import java.util.concurrent.Future; >>>> +import java.util.concurrent.TimeUnit; >>>> + >>>> +import com.lmax.disruptor.*; >>>> +import org.apache.logging.log4j.Logger; >>>> +import org.apache.logging.log4j.core.util.Constants; >>>> +import org.apache.logging.log4j.core.util.Integers; >>>> +import org.apache.logging.log4j.status.StatusLogger; >>>> +import org.apache.logging.log4j.util.LoaderUtil; >>>> +import org.apache.logging.log4j.util.PropertiesUtil; >>>> + >>>> +/** >>>> + * Utility methods for getting Disruptor related configuration. >>>> + */ >>>> +final class DisruptorUtil { >>>> + private static final Logger LOGGER = StatusLogger.getLogger(); >>>> + private static final int RINGBUFFER_MIN_SIZE = 128; >>>> + private static final int RINGBUFFER_DEFAULT_SIZE = 256 * 1024; >>>> + private static final int RINGBUFFER_NO_GC_DEFAULT_SIZE = 4 * 1024; >>>> + >>>> + private DisruptorUtil() { >>>> + } >>>> + >>>> + static long getTimeout(final String propertyName, final long >>>> defaultTimeout) { >>>> + return >>>> PropertiesUtil.getProperties().getLongProperty(propertyName, >>>> defaultTimeout); >>>> + } >>>> + >>>> + static WaitStrategy createWaitStrategy(final String propertyName) { >>>> + final String key = propertyName.startsWith("AsyncLogger.") >>>> + ? "AsyncLogger.Timeout" >>>> + : "AsyncLoggerConfig.Timeout"; >>>> + final long timeout = DisruptorUtil.getTimeout(key, 10L); >>>> + return createWaitStrategy(propertyName, timeout); >>>> + } >>>> + >>>> + static WaitStrategy createWaitStrategy(final String propertyName, >>>> final long timeoutMillis) { >>>> + final String strategy = >>>> PropertiesUtil.getProperties().getStringProperty(propertyName); >>>> + if (strategy != null) { >>>> + LOGGER.trace("property {}={}", propertyName, strategy); >>>> + if ("Sleep".equalsIgnoreCase(strategy)) { >>>> + return new SleepingWaitStrategy(); >>>> + } else if ("Yield".equalsIgnoreCase(strategy)) { >>>> + return new YieldingWaitStrategy(); >>>> + } else if ("Block".equalsIgnoreCase(strategy)) { >>>> + return new BlockingWaitStrategy(); >>>> + } else if ("BusySpin".equalsIgnoreCase(strategy)) { >>>> + return new BusySpinWaitStrategy(); >>>> + } else if ("Timeout".equalsIgnoreCase(strategy)) { >>>> + return new TimeoutBlockingWaitStrategy(timeoutMillis, >>>> TimeUnit.MILLISECONDS); >>>> + } >>>> + } >>>> + return new TimeoutBlockingWaitStrategy(timeoutMillis, >>>> TimeUnit.MILLISECONDS); >>>> + } >>>> + >>>> + static int calculateRingBufferSize(final String propertyName) { >>>> + int ringBufferSize = Constants.ENABLE_THREADLOCALS ? >>>> RINGBUFFER_NO_GC_DEFAULT_SIZE : RINGBUFFER_DEFAULT_SIZE; >>>> + final String userPreferredRBSize = >>>> PropertiesUtil.getProperties().getStringProperty(propertyName, >>>> + String.valueOf(ringBufferSize)); >>>> + try { >>>> + int size = Integer.parseInt(userPreferredRBSize); >>>> + if (size < RINGBUFFER_MIN_SIZE) { >>>> + size = RINGBUFFER_MIN_SIZE; >>>> + LOGGER.warn("Invalid RingBufferSize {}, using minimum >>>> size {}.", userPreferredRBSize, >>>> + RINGBUFFER_MIN_SIZE); >>>> + } >>>> + ringBufferSize = size; >>>> + } catch (final Exception ex) { >>>> + LOGGER.warn("Invalid RingBufferSize {}, using default size >>>> {}.", userPreferredRBSize, ringBufferSize); >>>> + } >>>> + return Integers.ceilingNextPowerOfTwo(ringBufferSize); >>>> + } >>>> + >>>> + static ExceptionHandler<RingBufferLogEvent> >>>> getAsyncLoggerExceptionHandler() { >>>> + final String cls = >>>> PropertiesUtil.getProperties().getStringProperty("AsyncLogger.ExceptionHandler"); >>>> + if (cls == null) { >>>> + return new DefaultAsyncLoggerExceptionHandler(); >>>> + } >>>> + try { >>>> + @SuppressWarnings("unchecked") >>>> + final Class<? extends >>>> ExceptionHandler<RingBufferLogEvent>> klass = >>>> + (Class<? extends >>>> ExceptionHandler<RingBufferLogEvent>>) LoaderUtil.loadClass(cls); >>>> + return klass.newInstance(); >>>> + } catch (final Exception ignored) { >>>> + LOGGER.debug("Invalid AsyncLogger.ExceptionHandler value: >>>> error creating {}: ", cls, ignored); >>>> + return new DefaultAsyncLoggerExceptionHandler(); >>>> + } >>>> + } >>>> + >>>> + static >>>> ExceptionHandler<AsyncLoggerConfigDisruptor.Log4jEventWrapper> >>>> getAsyncLoggerConfigExceptionHandler() { >>>> + final String cls = >>>> PropertiesUtil.getProperties().getStringProperty("AsyncLoggerConfig.ExceptionHandler"); >>>> + if (cls == null) { >>>> + return new DefaultAsyncLoggerConfigExceptionHandler(); >>>> + } >>>> + try { >>>> + @SuppressWarnings("unchecked") >>>> + final Class<? extends >>>> ExceptionHandler<AsyncLoggerConfigDisruptor.Log4jEventWrapper>> klass = >>>> + (Class<? extends >>>> ExceptionHandler<AsyncLoggerConfigDisruptor.Log4jEventWrapper>>) >>>> LoaderUtil.loadClass(cls); >>>> + return klass.newInstance(); >>>> + } catch (final Exception ignored) { >>>> + LOGGER.debug("Invalid AsyncLoggerConfig.ExceptionHandler >>>> value: error creating {}: ", cls, ignored); >>>> + return new DefaultAsyncLoggerConfigExceptionHandler(); >>>> + } >>>> + } >>>> + >>>> + /** >>>> + * Returns the thread ID of the background appender thread. This >>>> allows us to detect Logger.log() calls initiated >>>> + * from the appender thread, which may cause deadlock when the >>>> RingBuffer is full. (LOG4J2-471) >>>> + * >>>> + * @param executor runs the appender thread >>>> + * @return the thread ID of the background appender thread >>>> + */ >>>> + public static long getExecutorThreadId(final ExecutorService >>>> executor) { >>>> + Future<Long> result = executor.submit(new Callable<Long>() { >>>> + @Override >>>> + public Long call() { >>>> + return Thread.currentThread().getId(); >>>> + } >>>> + }); >>>> + try { >>>> + return result.get(); >>>> + } catch (final Exception ex) { >>>> + final String msg = "Could not obtain executor thread Id. " >>>> + + "Giving up to avoid the risk of application >>>> deadlock."; >>>> + throw new IllegalStateException(msg, ex); >>>> + } >>>> + } >>>> +} >>>> >>>> >>>> >>>> >>>> -- >>>> E-Mail: [email protected] | [email protected] >>>> 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 <[email protected]> >>> >> >> >> >> -- >> E-Mail: [email protected] | [email protected] >> 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 <[email protected]> > -- E-Mail: [email protected] | [email protected] 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
