[MINOR] [UI] Improve error message on log page
Currently if a bad log type if specified, then we get blank. We should provide a more informative error message.
This commit is contained in:
parent
a7c8b00b72
commit
f5a9833f3f
|
@ -29,6 +29,7 @@ import org.apache.spark.util.logging.RollingFileAppender
|
|||
private[ui] class LogPage(parent: WorkerWebUI) extends WebUIPage("logPage") with Logging {
|
||||
private val worker = parent.worker
|
||||
private val workDir = parent.workDir
|
||||
private val supportedLogTypes = Set("stderr", "stdout")
|
||||
|
||||
def renderLog(request: HttpServletRequest): String = {
|
||||
val defaultBytes = 100 * 1024
|
||||
|
@ -129,6 +130,11 @@ private[ui] class LogPage(parent: WorkerWebUI) extends WebUIPage("logPage") with
|
|||
offsetOption: Option[Long],
|
||||
byteLength: Int
|
||||
): (String, Long, Long, Long) = {
|
||||
|
||||
if (!supportedLogTypes.contains(logType)) {
|
||||
return ("Error: Log type must be one of " + supportedLogTypes.mkString(", "), 0, 0, 0)
|
||||
}
|
||||
|
||||
try {
|
||||
val files = RollingFileAppender.getSortedRolledOverFiles(logDirectory, logType)
|
||||
logDebug(s"Sorted log files of type $logType in $logDirectory:\n${files.mkString("\n")}")
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
/*
|
||||
* 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.spark.deploy.worker.ui
|
||||
|
||||
import java.io.{File, FileWriter}
|
||||
|
||||
import org.mockito.Mockito.mock
|
||||
import org.scalatest.{FunSuite, PrivateMethodTester}
|
||||
|
||||
class LogPageSuite extends FunSuite with PrivateMethodTester {
|
||||
|
||||
test("get logs simple") {
|
||||
val webui = mock(classOf[WorkerWebUI])
|
||||
val logPage = new LogPage(webui)
|
||||
|
||||
// Prepare some fake log files to read later
|
||||
val out = "some stdout here"
|
||||
val err = "some stderr here"
|
||||
val tmpDir = new File(sys.props("java.io.tmpdir"))
|
||||
val tmpOut = new File(tmpDir, "stdout")
|
||||
val tmpErr = new File(tmpDir, "stderr")
|
||||
val tmpRand = new File(tmpDir, "random")
|
||||
write(tmpOut, out)
|
||||
write(tmpErr, err)
|
||||
write(tmpRand, "1 6 4 5 2 7 8")
|
||||
|
||||
// Get the logs. All log types other than "stderr" or "stdout" will be rejected
|
||||
val getLog = PrivateMethod[(String, Long, Long, Long)]('getLog)
|
||||
val (stdout, _, _, _) =
|
||||
logPage invokePrivate getLog(tmpDir.getAbsolutePath, "stdout", None, 100)
|
||||
val (stderr, _, _, _) =
|
||||
logPage invokePrivate getLog(tmpDir.getAbsolutePath, "stderr", None, 100)
|
||||
val (error1, _, _, _) =
|
||||
logPage invokePrivate getLog(tmpDir.getAbsolutePath, "random", None, 100)
|
||||
val (error2, _, _, _) =
|
||||
logPage invokePrivate getLog(tmpDir.getAbsolutePath, "does-not-exist.txt", None, 100)
|
||||
assert(stdout === out)
|
||||
assert(stderr === err)
|
||||
assert(error1.startsWith("Error"))
|
||||
assert(error2.startsWith("Error"))
|
||||
}
|
||||
|
||||
/** Write the specified string to the file. */
|
||||
private def write(f: File, s: String): Unit = {
|
||||
val writer = new FileWriter(f)
|
||||
try {
|
||||
writer.write(s)
|
||||
} finally {
|
||||
writer.close()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue