Improve logging.

Any output from the LOG family will now go to stderr and logcat on the
device. stderr is usually redirected to a log file, but that is now
inhibited for adbd if being run from a tty (useful when debugging with
the serial console).

This also fixes sending logs to the file on device for the trace mask
of "all". The "all" tag was specifically handled to return early from
the function, preventing the file initialization from happening.

Change-Id: Id253577bfd1500fbce92dbfba0f9be23dbfd5ee4
This commit is contained in:
Dan Albert 2015-05-21 13:58:50 -07:00
parent 36473768ef
commit 9313c0df20
4 changed files with 38 additions and 21 deletions

View File

@ -34,6 +34,7 @@
#include <vector>
#include <unordered_map>
#include <base/logging.h>
#include <base/stringprintf.h>
#include <base/strings.h>
@ -50,16 +51,25 @@
#include <sys/mount.h>
#endif
ADB_MUTEX_DEFINE( D_lock );
ADB_MUTEX_DEFINE(D_lock);
int HOST = 0;
#if !ADB_HOST
const char *adb_device_banner = "device";
const char* adb_device_banner = "device";
static android::base::LogdLogger gLogdLogger;
#endif
void fatal(const char *fmt, ...)
{
void AdbLogger(android::base::LogId id, android::base::LogSeverity severity,
const char* tag, const char* file, unsigned int line,
const char* message) {
android::base::StderrLogger(id, severity, tag, file, line, message);
#if !ADB_HOST
gLogdLogger(id, severity, tag, file, line, message);
#endif
}
void fatal(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
fprintf(stderr, "error: ");
@ -69,8 +79,7 @@ void fatal(const char *fmt, ...)
exit(-1);
}
void fatal_errno(const char *fmt, ...)
{
void fatal_errno(const char* fmt, ...) {
va_list ap;
va_start(ap, fmt);
fprintf(stderr, "error: %s: ", strerror(errno));
@ -81,7 +90,7 @@ void fatal_errno(const char *fmt, ...)
}
#if !ADB_HOST
void start_device_log(void) {
static std::string get_log_file_name() {
struct tm now;
time_t t;
tzset();
@ -91,13 +100,18 @@ void start_device_log(void) {
char timestamp[PATH_MAX];
strftime(timestamp, sizeof(timestamp), "%Y-%m-%d-%H-%M-%S", &now);
std::string path = android::base::StringPrintf("/data/adb/adb-%s-%d", timestamp, getpid());
int fd = unix_open(path.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0640);
return android::base::StringPrintf("/data/adb/adb-%s-%d", timestamp,
getpid());
}
void start_device_log(void) {
int fd = unix_open(get_log_file_name().c_str(),
O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0640);
if (fd == -1) {
return;
}
// redirect stdout and stderr to the log file
// Redirect stdout and stderr to the log file.
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
fprintf(stderr, "--- adb starting (pid %d) ---\n", getpid());
@ -138,7 +152,7 @@ std::string get_trace_setting() {
//
// adb's trace setting comes from the ADB_TRACE environment variable, whereas
// adbd's comes from the system property persist.adb.trace_mask.
void adb_trace_init() {
static void setup_trace_mask() {
const std::string trace_setting = get_trace_setting();
std::unordered_map<std::string, int> trace_flags = {
@ -173,10 +187,17 @@ void adb_trace_init() {
adb_trace_mask |= 1 << flag->second;
}
}
}
void adb_trace_init(char** argv) {
#if !ADB_HOST
start_device_log();
if (isatty(STDOUT_FILENO) == 0) {
start_device_log();
}
#endif
setup_trace_mask();
android::base::InitLogging(argv, AdbLogger);
}
apacket* get_apacket(void)

View File

@ -57,9 +57,9 @@ void adb_qemu_trace(const char* fmt, ...);
#define DQ(...) ((void)0)
#endif /* !ADB_HOST */
extern int adb_trace_mask;
extern unsigned char adb_trace_output_count;
void adb_trace_init(void);
extern int adb_trace_mask;
extern unsigned char adb_trace_output_count;
void adb_trace_init(char**);
# define ADB_TRACING ((adb_trace_mask & (1 << TRACE_TAG)) != 0)

View File

@ -176,9 +176,7 @@ int adb_main(int is_daemon, int server_port) {
int main(int argc, char** argv) {
adb_sysdeps_init();
android::base::InitLogging(argv);
adb_trace_init();
adb_trace_init(argv);
D("Handling commandline()\n");
return adb_commandline(argc - 1, const_cast<const char**>(argv + 1));
}

View File

@ -230,8 +230,6 @@ static void close_stdin() {
}
int main(int argc, char** argv) {
android::base::InitLogging(argv);
while (true) {
static struct option opts[] = {
{"root_seclabel", required_argument, nullptr, 's'},
@ -265,7 +263,7 @@ int main(int argc, char** argv) {
close_stdin();
adb_trace_init();
adb_trace_init(argv);
/* If adbd runs inside the emulator this will enable adb tracing via
* adb-debug qemud service in the emulator. */