blob: b5b519efebd586d236622c4052992f55d39d8456 [file] [log] [blame]
/*
* 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.pig.impl.util;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import org.apache.commons.logging.Log;
import org.apache.pig.PigException;
import org.apache.pig.PigWarning;
import org.apache.pig.backend.hadoop.executionengine.physicalLayer.PhysicalOperator;
import org.apache.pig.backend.hadoop.executionengine.physicalLayer.PigLogger;
import org.apache.pig.tools.pigscript.parser.ParseException;
public class LogUtils {
public static void warn(Object o, String msg, PigWarning warningEnum,
Log log) {
PigLogger pigLogger = PhysicalOperator.getPigLogger();
if(pigLogger != null) {
pigLogger.warn(o, msg, warningEnum);
} else {
log.warn(msg);
}
}
public static Exception getPermissionException(Exception top){
Throwable current = top;
while (current != null && (current.getMessage() == null || current.getMessage().indexOf("Permission denied") == -1)){
current = current.getCause();
}
return (Exception)current;
}
public static PigException getPigException(Throwable top) {
Throwable current = top;
Throwable pigException = top;
if (current instanceof PigException &&
(((PigException)current).getErrorCode() != 0) &&
((PigException) current).getMarkedAsShowToUser()) {
return (PigException) current;
}
while (current != null && current.getCause() != null){
current = current.getCause();
if((current instanceof PigException) &&
(((PigException)current).getErrorCode() != 0)) {
pigException = current;
if (((PigException)pigException).getMarkedAsShowToUser()) {
break;
}
}
}
return (pigException instanceof PigException? (PigException)pigException
: null);
}
public static void writeLog(Throwable t, String logFileName, Log log, boolean verbose, String headerMessage) {
writeLog(t, logFileName, log, verbose, headerMessage, true, true);
}
public static void writeLog(Throwable t, String logFileName, Log log, boolean verbose,
String headerMessage, boolean displayFooter, boolean displayMessage) {
String message = null;
String marker = null;
StringBuilder sb = new StringBuilder("=");
for(int i = 0; i < 79; ++i) {
sb.append("=");
}
sb.append("\n");
marker = sb.toString();
if(t instanceof Exception) {
Exception pe = LogUtils.getPermissionException((Exception)t);
if (pe != null) {
log.error("You don't have permission to perform the operation. Error from the server: " + pe.getMessage());
}
}
PigException pigException = LogUtils.getPigException(t);
if(pigException != null) {
message = "ERROR " + pigException.getErrorCode() + ": " + pigException.getMessage();
} else {
if((t instanceof ParseException
|| t instanceof org.apache.pig.tools.pigscript.parser.TokenMgrError
|| t instanceof org.apache.pig.tools.parameters.TokenMgrError)) {
message = "ERROR 1000: Error during parsing. " + t.getMessage();
} else if (t instanceof IOException) {
message = "ERROR 2997: Encountered IOException. " + t.getMessage();
} else if (t instanceof RuntimeException) {
message = "ERROR 2999: Unexpected internal error. " + t.getMessage();
} else {
message = "ERROR 2998: Unhandled internal error. " + t.getMessage();
}
}
FileOutputStream fos = null;
ByteArrayOutputStream bs = new ByteArrayOutputStream();
t.printStackTrace(new PrintStream(bs));
if(displayMessage) log.error(message);
if(verbose) {
log.error(bs.toString());
}
if(logFileName == null || logFileName.equals("")) {
//if exec is invoked programmatically then logFileName will be null
log.warn("There is no log file to write to.");
log.error(bs.toString());
return;
}
File logFile = new File(logFileName);
try {
fos = new FileOutputStream(logFile, true);
if(headerMessage != null) {
fos.write((headerMessage + "\n").getBytes("UTF-8"));
sb = new StringBuilder("-");
for(int i = 1; i < headerMessage.length(); ++i) {
sb.append("-");
}
sb.append("\n");
fos.write(sb.toString().getBytes("UTF-8"));
}
if(message != null) {
if(message.charAt(message.length() - 1) == '\n') {
fos.write((message + "\n").getBytes("UTF-8"));
} else {
fos.write((message + "\n\n").getBytes("UTF-8"));
}
}
fos.write(bs.toString().getBytes("UTF-8"));
fos.write(marker.getBytes("UTF-8"));
if(displayFooter) {
if(verbose) {
System.err.println("Details also at logfile: " + logFileName);
} else {
System.err.println("Details at logfile: " + logFileName);
}
}
} catch (IOException ioe) {
log.warn("Could not write to log file: " + logFileName + " :" + ioe.getMessage());
log.error(bs.toString());
} finally {
try {
if (fos!=null)
fos.close();
} catch (IOException e) {
}
}
}
public static void writeLog(String headerMessage, String message, String logFileName, Log log) {
if(logFileName == null || logFileName.equals("")) {
//if exec is invoked programmatically then logFileName will be null
log.warn("There is no log file to write to.");
log.error(headerMessage + "\n" + message);
return;
}
File logFile = new File(logFileName);
FileOutputStream fos = null;
try {
fos = new FileOutputStream(logFile, true);
if(headerMessage != null) {
fos.write((headerMessage + "\n").getBytes("UTF-8"));
StringBuilder sb = new StringBuilder("-");
for(int i = 1; i < headerMessage.length(); ++i) {
sb.append("-");
}
sb.append("\n");
fos.write(sb.toString().getBytes("UTF-8"));
}
if(message != null) {
if(message.charAt(message.length() - 1) == '\n') {
fos.write((message + "\n").getBytes("UTF-8"));
} else {
fos.write((message + "\n\n").getBytes("UTF-8"));
}
}
} catch (IOException ioe) {
log.warn("Could not write to log file: " + logFileName + " :" + ioe.getMessage());
log.error(message);
} finally {
try {
fos.close();
} catch (IOException e) {
}
}
}
}