Skip to content

Commit

Permalink
log: set stderr as default log output, add .set_output_stream() (#23296)
Browse files Browse the repository at this point in the history
  • Loading branch information
gechandesu authored Dec 28, 2024
1 parent 84baf4d commit a47b729
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 35 deletions.
4 changes: 2 additions & 2 deletions vlib/log/common.v
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ pub enum LogTarget {
both
}

// tag_to_cli returns the tag for log level `l` as a colored string.
fn tag_to_cli(l Level, short_tag bool) string {
// tag_to_console returns the tag for log level `l` as a colored string.
fn tag_to_console(l Level, short_tag bool) string {
if short_tag {
return match l {
.disabled { ' ' }
Expand Down
26 changes: 20 additions & 6 deletions vlib/log/log.v
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ module log

import os
import time
import io

// TimeFormat define the log time string format, come from time/format.v
pub enum TimeFormat {
Expand Down Expand Up @@ -36,6 +37,7 @@ mut:
custom_time_format string = 'MMMM Do YY N kk:mm:ss A' // timestamp with custom format
short_tag bool
always_flush bool // flush after every single .fatal(), .error(), .warn(), .info(), .debug() call
output_stream io.Writer = os.stderr()
pub mut:
output_file_name string // log output to this file
}
Expand Down Expand Up @@ -77,6 +79,11 @@ pub fn (mut l Log) set_output_path(output_file_path string) {
l.ofile = ofile
}

// set_output_stream sets the output stream to write log e.g. stderr, stdout, etc.
pub fn (mut l Log) set_output_stream(stream io.Writer) {
l.output_stream = stream
}

// log_to_console_too turns on logging to the console too, in addition to logging to a file.
// You have to call it *after* calling .set_output_path(output_file_path).
pub fn (mut l Log) log_to_console_too() {
Expand Down Expand Up @@ -131,13 +138,19 @@ fn (mut l Log) log_file(s string, level Level) {
}
}

// log_cli writes log line `s` with `level` to stdout.
fn (l &Log) log_cli(s string, level Level) {
// log_stream writes log line `s` with `level` to stderr or stderr depending on set output stream.
fn (mut l Log) log_stream(s string, level Level) {
timestamp := l.time_format(time.utc())
e := tag_to_cli(level, l.short_tag)
println('${timestamp} [${e}] ${s}')
tag := tag_to_console(level, l.short_tag)
msg := '${timestamp} [${tag}] ${s}\n'
arr := msg.bytes()
l.output_stream.write(arr) or {}
if l.always_flush {
flush_stdout()
match (l.output_stream as os.File).fd {
1 { flush_stdout() }
2 { flush_stderr() }
else {}
}
}
}

Expand All @@ -148,7 +161,7 @@ pub fn (mut l Log) send_output(s &string, level Level) {
l.log_file(s, level)
}
if l.output_target == .console || l.output_target == .both {
l.log_cli(s, level)
l.log_stream(s, level)
}
}

Expand Down Expand Up @@ -202,6 +215,7 @@ pub fn (mut f Log) free() {
f.output_label.free()
f.ofile.close()
f.output_file_name.free()
f.output_stream.free()
}
}

Expand Down
38 changes: 15 additions & 23 deletions vlib/v/slow_tests/inout/dump_expression.out
Original file line number Diff line number Diff line change
@@ -1,36 +1,28 @@
[vlib/v/slow_tests/inout/dump_expression.vv:5] 1: 1
[vlib/v/slow_tests/inout/dump_expression.vv:10] 'a': a
[vlib/v/slow_tests/inout/dump_expression.vv:34] a: Aa{
log: &log.Logger(log.Log{
level: disabled
output_label: ''
ofile: os.File{
cfile: 0
fd: 0
is_opened: false
}
output_target: console
time_format: tf_rfc3339_micro
custom_time_format: 'MMMM Do YY N kk:mm:ss A'
short_tag: false
always_flush: false
output_file_name: ''
})
[vlib/v/slow_tests/inout/dump_expression.vv:4] 1: 1
[vlib/v/slow_tests/inout/dump_expression.vv:9] 'a': a
[vlib/v/slow_tests/inout/dump_expression.vv:33] a: Aa{
cmd: &os.Command{
f: 0
eof: false
exit_code: 0
path: ''
redirect_stdout: false
}
}
[vlib/v/slow_tests/inout/dump_expression.vv:35] p: Point{
[vlib/v/slow_tests/inout/dump_expression.vv:34] p: Point{
x: 1
y: 2
z: 3
}
[vlib/v/slow_tests/inout/dump_expression.vv:36] p_mut: Point{
[vlib/v/slow_tests/inout/dump_expression.vv:35] p_mut: Point{
x: 1
y: 2
z: 3
}
[vlib/v/slow_tests/inout/dump_expression.vv:37] p_ptr: &Point{
[vlib/v/slow_tests/inout/dump_expression.vv:36] p_ptr: &Point{
x: 1
y: 2
z: 3
}
[vlib/v/slow_tests/inout/dump_expression.vv:48] os.file_name(vfile): dump_expression.vv
[vlib/v/slow_tests/inout/dump_expression.vv:51] f.read(mut buf): 10
[vlib/v/slow_tests/inout/dump_expression.vv:47] os.file_name(vfile): dump_expression.vv
[vlib/v/slow_tests/inout/dump_expression.vv:50] f.read(mut buf): 10
7 changes: 3 additions & 4 deletions vlib/v/slow_tests/inout/dump_expression.vv
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import os
import log

fn dump_of_int() {
x := dump(1) + 1
Expand All @@ -19,16 +18,16 @@ mut:
}

struct Aa {
log &log.Logger
cmd &os.Command
}

fn dump_of_struct() {
p := Point{1, 2, 3}
mut p_mut := Point{1, 2, 3}
p_ptr := &Point{1, 2, 3}
l := &log.Log{}
c := &os.Command{}
a := Aa{
log: l
cmd: c
}

dump(a)
Expand Down

0 comments on commit a47b729

Please sign in to comment.