2014-12-02 16 views
19

blog Vì vậy, nhờ vào một cách dễ dàng googleable tôi đã cố gắng:Làm thế nào để ngăn chặn Spark đăng nhập trong các bài kiểm tra đơn vị?

import org.specs2.mutable.Specification 

class SparkEngineSpecs extends Specification { 
    sequential 

    def setLogLevels(level: Level, loggers: Seq[String]): Map[String, Level] = loggers.map(loggerName => { 
    val logger = Logger.getLogger(loggerName) 
    val prevLevel = logger.getLevel 
    logger.setLevel(level) 
    loggerName -> prevLevel 
    }).toMap 

    setLogLevels(Level.WARN, Seq("spark", "org.eclipse.jetty", "akka")) 

    val sc = new SparkContext(new SparkConf().setMaster("local").setAppName("Test Spark Engine")) 

    // ... my unit tests 

Nhưng tiếc là nó không hoạt động, tôi vẫn nhận được rất nhiều đầu ra tia lửa, ví dụ:

14/12/02 12:01:56 INFO MemoryStore: Block broadcast_4 of size 4184 dropped from memory (free 583461216) 
14/12/02 12:01:56 INFO ContextCleaner: Cleaned broadcast 4 
14/12/02 12:01:56 INFO ContextCleaner: Cleaned shuffle 4 
14/12/02 12:01:56 INFO ShuffleBlockManager: Deleted all files for shuffle 4 

Trả lời

32

Thêm mã sau vào log4j.properties tập tin bên trong src/test/resources dir, tạo ra các tập tin/thư mục nếu không tồn tại

# Change this to set Spark log level 
log4j.logger.org.apache.spark=WARN 

# Silence akka remoting 
log4j.logger.Remoting=WARN 

# Ignore messages below warning level from Jetty, because it's a bit verbose 
log4j.logger.org.eclipse.jetty=WARN 

Khi tôi chạy thử nghiệm đơn vị của tôi (Tôi đang sử dụng JUnit và Maven), tôi chỉ nhận nhật ký mức WARN, nói cách khác không lộn xộn hơn với nhật ký mức INFO (mặc dù chúng có thể hữu ích vào lúc gỡ lỗi).

Tôi hy vọng điều này sẽ hữu ích.

+0

Làm việc cho SBT với thông số kỹ thuật2 – samthebest

+1

cảm ơn @Emre. nó hoạt động như sự quyến rũ cho java trong ý tưởng intelliJ. –

2

Bạn có thể sử dụng một Logback riêng cấu hình cho các bài kiểm tra. Tùy thuộc vào môi trường của bạn, có thể bạn chỉ cần tạo conf/logback-test.xml bằng thứ gì đó ẩn các nhật ký. Tôi nghĩ rằng điều này sẽ làm điều đó:

<configuration> 
    <root level="debug"> 
    </root> 
</configuration> 

Theo tôi được biết, đây chụp tất cả các bản ghi (mức debug và cao hơn) và gán không logger cho họ, để họ có được loại bỏ. Một tùy chọn tốt hơn là định cấu hình trình ghi tệp cho chúng, do đó bạn vẫn có thể truy cập nhật ký nếu bạn muốn.

Xem http://logback.qos.ch/manual/configuration.html để biết tài liệu chi tiết.

+0

Cảm ơn câu trả lời, vì vậy tôi đã thử thêm tệp trong "src/test/resources/conf" có tên là "logback-test.xml" với nội dung bạn cung cấp (đã cố gắng với cấp "cảnh báo"), nhưng nó có không có hiệu lực :( – samthebest

+0

Tôi thực sự không chắc chắn về tất cả điều này, xin lỗi.Nhưng dự án của chúng tôi chỉ đạo các bản ghi vào một tập tin trong các bài kiểm tra, vì vậy chúng tôi chỉ cần tìm ra cách nó được thiết lập :). 'logback-test.xml' nằm trong' /conf' tại đây. Các tập tin không được đề cập đến bất cứ nơi nào trong nguồn của chúng tôi, vì vậy nó có thể là một vị trí mặc định huyền diệu. Tôi không thấy bất cứ điều gì khác ... Nếu tôi xóa các tập tin tôi bắt đầu nhận được đầu ra đăng nhập (từ 'warn' lên) trong các bài kiểm tra. Chúng tôi sử dụng Scalatest. –

+1

Tôi đã thử đặt nó vào «proj-root/conf /' không may mắn. Tôi là một chút bối rối như thế nào nó sẽ bao giờ có được chọn đặt kể từ tên tập tin cũng không tham khảo nội dung tia lửa. Trong khi chờ đợi, tôi đang sử dụng một kịch bản thực sự hacky mà hiện một 'grep -v' với một regex mà kinda loại bỏ các bản ghi tia lửa. – samthebest

3

Một chút muộn để đảng nhưng tôi thấy điều này trong spark example code:

def setStreamingLogLevels() { 
    val log4jInitialized = Logger.getRootLogger.getAllAppenders.hasMoreElements 
    if (!log4jInitialized) { 
     // We first log something to initialize Spark's default logging, then we override the 
     // logging level. 
     logInfo("Setting log level to [WARN] for streaming example." + 
     " To override add a custom log4j.properties to the classpath.") 
     Logger.getRootLogger.setLevel(Level.WARN) 
    } 
} 

Tôi cũng thấy rằng với mã của bạn nếu bạn gọi setLogLevels như dưới nó cắt ra rất nhiều ra đưa cho tôi.

setLogLevels(Level.WARN, Seq("spark", "org", "akka")) 
5

Sau một thời gian vật lộn với sản lượng Spark log là tốt, tôi tìm thấy một blog post với một giải pháp tôi đặc biệt thích.

Nếu bạn sử dụng slf4j, người ta chỉ có thể trao đổi cài đặt nhật ký cơ bản. Một canidate tốt cho phạm vi kiểm tra là slf4j-nop, mà cẩn thận có đầu ra log và đặt nó ở nơi mặt trời không bao giờ tỏa sáng.

Khi sử dụng Maven bạn có thể thêm dòng sau vào đầu danh sách phụ thuộc của bạn:

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.7.12</version> 
    <scope>provided</scope> 
</dependency> 

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-nop</artifactId> 
    <version>1.7.12</version> 
    <scope>test</scope> 
</dependency> 

Lưu ý rằng nó có thể là quan trọng để có nó vào đầu danh sách phụ thuộc để đảm bảo rằng việc triển khai cho được sử dụng thay cho những người có thể đi kèm với các gói khác (và bạn có thể cân nhắc loại trừ để giữ cho đường dẫn lớp của bạn gọn gàng và tránh các xung đột không mong muốn).

+1

đó là điều duy nhất làm việc cho tôi – Kratos

2

Trong trường hợp của tôi, một trong những thư viện của tôi đã mang logback-classic vào hỗn hợp.Đây cụ thể hóa trong một cảnh báo ngay từ đầu:

SLF4J: Class path contains multiple SLF4J bindings. 
SLF4J: Found binding in [jar:file:/home/alex/.ivy2/cache/ch.qos.logback/logback-classic/jars/logback-classic-1.1.2.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
SLF4J: Found binding in [jar:file:/home/alex/.ivy2/cache/org.slf4j/slf4j-log4j12/jars/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class] 

tôi giải quyết này bằng cách loại trừ nó ra khỏi sự phụ thuộc:

"com.mystuff" % "mylib" % "1.0.0" exclude("ch.qos.logback", "logback-classic") 

Bây giờ tôi có thể thêm một tập tin log4j.properties trong test/resources mà hiện nay được sử dụng bởi Spark.

Các vấn đề liên quan