| /* |
| * 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) { |
| } |
| } |
| } |
| |
| |
| } |
| |