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 */
017package org.apache.logging.log4j.core.async;
018
019import java.util.Map;
020
021import org.apache.logging.log4j.Level;
022import org.apache.logging.log4j.Marker;
023import org.apache.logging.log4j.ThreadContext.ContextStack;
024import org.apache.logging.log4j.message.Message;
025
026import com.lmax.disruptor.EventTranslator;
027
028/**
029 * This class is responsible for writing elements that make up a log event into
030 * the ringbuffer {@code RingBufferLogEvent}. After this translator populated
031 * the ringbuffer event, the disruptor will update the sequence number so that
032 * the event can be consumed by another thread.
033 */
034public class RingBufferLogEventTranslator implements
035        EventTranslator<RingBufferLogEvent> {
036
037    private AsyncLogger asyncLogger;
038    private String loggerName;
039    private Marker marker;
040    private String fqcn;
041    private Level level;
042    private Message message;
043    private Throwable thrown;
044    private Map<String, String> contextMap;
045    private ContextStack contextStack;
046    private String threadName;
047    private StackTraceElement location;
048    private long currentTimeMillis;
049
050    // @Override
051    @Override
052    public void translateTo(final RingBufferLogEvent event, final long sequence) {
053        event.setValues(asyncLogger, loggerName, marker, fqcn, level, message,
054                thrown, contextMap, contextStack, threadName, location,
055                currentTimeMillis);
056        clear();
057    }
058
059    /**
060     * Release references held by this object to allow objects to be
061     * garbage-collected.
062     */
063    private void clear() {
064        setValues(null, // asyncLogger
065                null, // loggerName
066                null, // marker
067                null, // fqcn
068                null, // level
069                null, // data
070                null, // t
071                null, // map
072                null, // contextStack
073                null, // threadName
074                null, // location
075                0 // currentTimeMillis
076        );
077    }
078
079    public void setValues(final AsyncLogger asyncLogger, final String loggerName,
080            final Marker marker, final String fqcn, final Level level, final Message message,
081            final Throwable thrown, final Map<String, String> contextMap,
082            final ContextStack contextStack, final String threadName,
083            final StackTraceElement location, final long currentTimeMillis) {
084        this.asyncLogger = asyncLogger;
085        this.loggerName = loggerName;
086        this.marker = marker;
087        this.fqcn = fqcn;
088        this.level = level;
089        this.message = message;
090        this.thrown = thrown;
091        this.contextMap = contextMap;
092        this.contextStack = contextStack;
093        this.threadName = threadName;
094        this.location = location;
095        this.currentTimeMillis = currentTimeMillis;
096    }
097
098}