diff --git a/exec.c b/exec.c index 5fbeb8dce4..5ed63de684 100644 --- a/exec.c +++ b/exec.c @@ -152,6 +152,7 @@ static int io_mem_watch; char *logfilename = "/tmp/qemu.log"; FILE *logfile; int loglevel; +static int log_append = 0; /* statistics */ static int tlb_flush_count; @@ -1160,7 +1161,7 @@ void cpu_set_log(int log_flags) { loglevel = log_flags; if (loglevel && !logfile) { - logfile = fopen(logfilename, "w"); + logfile = fopen(logfilename, log_append ? "wa" : "w"); if (!logfile) { perror(logfilename); _exit(1); @@ -1174,12 +1175,22 @@ void cpu_set_log(int log_flags) #else setvbuf(logfile, NULL, _IOLBF, 0); #endif + log_append = 1; + } + if (!loglevel && logfile) { + fclose(logfile); + logfile = NULL; } } void cpu_set_log_filename(const char *filename) { logfilename = strdup(filename); + if (logfile) { + fclose(logfile); + logfile = NULL; + } + cpu_set_log(loglevel); } /* mask must never be zero, except for A20 change call */ diff --git a/monitor.c b/monitor.c index a8db87040c..ed31d5031a 100644 --- a/monitor.c +++ b/monitor.c @@ -406,6 +406,11 @@ static void do_screen_dump(const char *filename) vga_hw_screen_dump(filename); } +static void do_logfile(const char *filename) +{ + cpu_set_log_filename(filename); +} + static void do_log(const char *items) { int mask; @@ -1213,6 +1218,8 @@ static term_cmd_t term_cmds[] = { "device filename", "change a removable medium" }, { "screendump", "F", do_screen_dump, "filename", "save screen into PPM image 'filename'" }, + { "logfile", "s", do_logfile, + "filename", "output logs to 'filename'" }, { "log", "s", do_log, "item1[,...]", "activate logging of the specified items to '/tmp/qemu.log'" }, { "savevm", "s?", do_savevm,