001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements. See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache license, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License. You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the license for the specific language governing permissions and
015     * limitations under the license.
016     */
017    package org.apache.logging.log4j.core.appender;
018    
019    import java.io.Serializable;
020    
021    import org.apache.logging.log4j.Logger;
022    import org.apache.logging.log4j.core.Appender;
023    import org.apache.logging.log4j.core.ErrorHandler;
024    import org.apache.logging.log4j.core.LogEvent;
025    import org.apache.logging.log4j.status.StatusLogger;
026    
027    /**
028     *
029     */
030    public class DefaultErrorHandler implements ErrorHandler, Serializable {
031    
032        private static final long serialVersionUID = 1L;
033    
034        private static final Logger LOGGER = StatusLogger.getLogger();
035    
036        private static final int MAX_EXCEPTIONS = 3;
037    
038        private static final int EXCEPTION_INTERVAL = 300000;
039    
040        private int exceptionCount = 0;
041    
042        private long lastException;
043    
044        private final Appender appender;
045    
046        public DefaultErrorHandler(final Appender appender) {
047            this.appender = appender;
048        }
049    
050    
051        /**
052         * Handle an error with a message.
053         * @param msg The message.
054         */
055        @Override
056        public void error(final String msg) {
057            final long current = System.currentTimeMillis();
058            if (lastException + EXCEPTION_INTERVAL < current || exceptionCount++ < MAX_EXCEPTIONS) {
059                LOGGER.error(msg);
060            }
061            lastException = current;
062        }
063    
064        /**
065         * Handle an error with a message and an exception.
066         * @param msg The message.
067         * @param t The Throwable.
068         */
069        @Override
070        public void error(final String msg, final Throwable t) {
071            final long current = System.currentTimeMillis();
072            if (lastException + EXCEPTION_INTERVAL < current || exceptionCount++ < MAX_EXCEPTIONS) {
073                LOGGER.error(msg, t);
074            }
075            lastException = current;
076            if (!appender.ignoreExceptions() && t != null && !(t instanceof AppenderLoggingException)) {
077                throw new AppenderLoggingException(msg, t);
078            }
079        }
080    
081        /**
082         * Handle an error with a message, and exception and a logging event.
083         * @param msg The message.
084         * @param event The LogEvent.
085         * @param t The Throwable.
086         */
087        @Override
088        public void error(final String msg, final LogEvent event, final Throwable t) {
089            final long current = System.currentTimeMillis();
090            if (lastException + EXCEPTION_INTERVAL < current || exceptionCount++ < MAX_EXCEPTIONS) {
091                LOGGER.error(msg, t);
092            }
093            lastException = current;
094            if (!appender.ignoreExceptions() && t != null && !(t instanceof AppenderLoggingException)) {
095                throw new AppenderLoggingException(msg, t);
096            }
097        }
098    }