com.sun.enterprise.server.logging.SyslogHandler Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of payara-embedded-web Show documentation
Show all versions of payara-embedded-web Show documentation
Embedded-Web Distribution of the Payara Project for IBM JDK
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2009-2013 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
* or packager/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
package com.sun.enterprise.server.logging;
import org.glassfish.config.support.TranslatedConfigView;
import org.glassfish.server.ServerEnvironmentImpl;
import org.jvnet.hk2.annotations.ContractsProvided;
import javax.inject.Inject;
import org.jvnet.hk2.annotations.Service;
import org.glassfish.hk2.api.PostConstruct;
import org.glassfish.hk2.api.PreDestroy;
import com.sun.common.util.logging.BooleanLatch;
import javax.inject.Singleton;
import java.text.SimpleDateFormat;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.logging.*;
/**
* Created by IntelliJ IDEA.
* User: cmott
* Date: Mar 11, 2009
* Time: 1:41:30 PM
* To change this template use File | Settings | File Templates.
*/
@Service
@Singleton
@ContractsProvided({SyslogHandler.class, java.util.logging.Handler.class})
public class SyslogHandler extends Handler implements PostConstruct, PreDestroy {
@Inject
ServerEnvironmentImpl env;
private Syslog sysLogger;
private Thread pump= null;
private BooleanLatch done = new BooleanLatch();
private BlockingQueue pendingRecords = new ArrayBlockingQueue(5000);
private SimpleFormatter simpleFormatter = new SimpleFormatter();
public void postConstruct() {
LogManager manager = LogManager.getLogManager();
String cname = getClass().getName();
Object obj = TranslatedConfigView.getTranslatedValue(manager.getProperty(cname + ".useSystemLogging"));
// Added below 2 lines of code to avoid NPE as per the bug http://java.net/jira/browse/GLASSFISH-16162
if(obj==null)
return;
String systemLogging = obj.toString();
if (systemLogging.equals("false"))
return;
//set up the connection
try {
sysLogger = new Syslog("localhost"); //for now only write to this host
} catch ( java.net.UnknownHostException e) {
LogFacade.LOGGING_LOGGER.log(Level.SEVERE, LogFacade.ERROR_INIT_SYSLOG, e);
return;
}
// start the Queue consummer thread.
pump = new Thread() {
public void run() {
try {
while (!done.isSignalled()) {
log();
}
} catch (RuntimeException e) {
}
}
};
pump.start();
}
public void preDestroy() {
if (LogFacade.LOGGING_LOGGER.isLoggable(Level.FINE)) {
LogFacade.LOGGING_LOGGER.fine("SysLog Logger handler killed");
}
}
/**
* Retrieves the LogRecord from our Queue and store them in the file
*
*/
public void log() {
LogRecord record;
try {
record = pendingRecords.take();
} catch (InterruptedException e) {
return;
}
Level level= record.getLevel();
long millisec = record.getMillis();
int syslogLevel = Syslog.INFO;
String logLevel = "INFO";
if (level.equals(Level.SEVERE)) {
syslogLevel = Syslog.CRIT;
logLevel = "CRIT";
} else if (level.equals(Level.WARNING)){
syslogLevel = Syslog.WARNING;
logLevel = "WARNING";
} else if(level.intValue() <= Level.FINE.intValue()) {
syslogLevel = Syslog.DEBUG;
logLevel = "DEBUG";
}
//format the message
StringBuilder sb = new StringBuilder();
SimpleDateFormat formatter = new SimpleDateFormat("MMM dd HH:mm:ss");
sb.append(formatter.format(millisec));
sb.append(" [ ");
sb.append(logLevel);
sb.append(" glassfish ] ");
String formattedMsg = simpleFormatter.formatMessage(record);
sb.append(formattedMsg);
//send message
if (sysLogger != null) {
sysLogger.log(Syslog.DAEMON, syslogLevel, sb.toString());
}
}
/**
* Publishes the logrecord storing it in our queue
*/
public void publish( LogRecord record ) {
if (pump == null)
return;
try {
pendingRecords.add(record);
} catch(IllegalStateException e) {
// queue is full, start waiting.
try {
pendingRecords.put(record);
} catch (InterruptedException e1) {
// to bad, record is lost...
}
}
}
public void close() {
}
public void flush() {
}
}