Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

log: set stderr as default log output, add .set_output_stream() #23296

Merged
merged 3 commits into from
Dec 28, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
23 changes: 17 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 @@ -38,6 +39,7 @@ mut:
always_flush bool // flush after every single .fatal(), .error(), .warn(), .info(), .debug() call
pub mut:
output_file_name string // log output to this file
output_stream io.Writer = os.stderr()
spytheman marked this conversation as resolved.
Show resolved Hide resolved
}

// get_level gets the internal logging level.
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,17 @@ 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)
l.output_stream.write('${timestamp} [${tag}] ${s}\n'.bytes()) 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 +159,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
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
Loading