blob: c985a0de4b80ddf5251b15c4763208dbc481a61b [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed 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 com.android.tradefed.log;
import com.android.tradefed.config.Option;
import com.android.tradefed.config.OptionClass;
import com.android.tradefed.config.OptionCopier;
import com.android.tradefed.result.ByteArrayInputStreamSource;
import com.android.tradefed.result.InputStreamSource;
import com.android.tradefed.result.SnapshotInputStreamSource;
import com.android.tradefed.util.SizeLimitedOutputStream;
import com.android.tradefed.util.StreamUtil;
import com.google.common.annotations.VisibleForTesting;
import java.io.IOException;
import java.io.InputStream;
/** A {@link ILeveledLogOutput} that directs log messages to a file and to stdout. */
@OptionClass(alias = "file")
public class FileLogger extends BaseStreamLogger<SizeLimitedOutputStream> {
private static final String TEMP_FILE_PREFIX = "tradefed_log_";
private static final String TEMP_FILE_SUFFIX = ".txt";
@Option(name = "max-log-size", description = "maximum allowable size of tmp log data in mB.")
private long mMaxLogSizeMbytes = 20;
@Override
public void init() throws IOException {
init(TEMP_FILE_PREFIX, TEMP_FILE_SUFFIX);
}
/**
* Alternative to {@link #init()} where we can specify the file name and suffix.
*
* @param logPrefix the file name where to log without extension.
* @param fileSuffix the extension of the file where to log.
*/
protected void init(String logPrefix, String fileSuffix) {
mOutputStream =
new SizeLimitedOutputStream(mMaxLogSizeMbytes * 1024 * 1024, logPrefix, fileSuffix);
}
/**
* Creates a new {@link FileLogger} with the same log level settings as the current object.
* <p/>
* Does not copy underlying log file content (ie the clone's log data will be written to a new
* file.)
*/
@Override
public ILeveledLogOutput clone() {
FileLogger logger = new FileLogger();
OptionCopier.copyOptionsNoThrow(this, logger);
return logger;
}
/** Returns the max log size of the log in MBytes. */
public long getMaxLogSizeMbytes() {
return mMaxLogSizeMbytes;
}
@Override
public InputStreamSource getLog() {
if (mOutputStream != null) {
try {
// create a InputStream from log file
mOutputStream.flush();
return new SnapshotInputStreamSource("FileLogger", mOutputStream.getData());
} catch (IOException e) {
System.err.println("Failed to get log");
e.printStackTrace();
}
}
return new ByteArrayInputStreamSource(new byte[0]);
}
@Override
public void closeLog() {
doCloseLog();
}
/** Flushes stream and closes log file. */
@VisibleForTesting
void doCloseLog() {
SizeLimitedOutputStream stream = mOutputStream;
mOutputStream = null;
StreamUtil.flushAndCloseStream(stream);
if (stream != null) {
stream.delete();
}
}
/**
* Dump the contents of the input stream to this log
*
* @param inputStream input stream to dump
* @throws IOException if an I/O error occurs
*/
void dumpToLog(InputStream inputStream) throws IOException {
if (mOutputStream != null) {
StreamUtil.copyStreams(inputStream, mOutputStream);
}
}
}