Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ycai
simbricks
Commits
22e1e637
Commit
22e1e637
authored
May 17, 2024
by
Jakob Görgen
Committed by
Jakob Görgen
May 21, 2024
Browse files
lib/utils/log: allow flushing + const + proper log level
parent
52774e3c
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
60 additions
and
38 deletions
+60
-38
lib/utils/log.h
lib/utils/log.h
+60
-38
No files found.
lib/utils/log.h
View file @
22e1e637
...
@@ -40,16 +40,12 @@ namespace sim_log {
...
@@ -40,16 +40,12 @@ namespace sim_log {
#define SIMLOG 1
#define SIMLOG 1
#define SIMLOG_ERROR 1
#define SIMLOG_WARN 2
#define SIMLOG_INFO 3
#define SIMLOG_OFF 4
enum
LogLevel
:
int
{
enum
LogLevel
:
int
{
off
=
SIMLOG_OFF
,
debug
=
1
,
info
=
SIMLOG_INFO
,
info
=
2
,
warn
=
SIMLOG_WARN
,
warn
=
3
,
error
=
SIMLOG_ERROR
error
=
4
,
off
=
5
};
};
class
Log
;
class
Log
;
...
@@ -78,9 +74,9 @@ class Log {
...
@@ -78,9 +74,9 @@ class Log {
return
std
::
make_unique
<
Log
>
(
out
);
return
std
::
make_unique
<
Log
>
(
out
);
}
}
static
LogPtT
createLog
(
FILE
*
out
,
bool
file
)
{
static
LogPtT
createLog
(
FILE
*
out
,
bool
file
)
{
if
(
out
==
nullptr
)
{
if
(
out
==
nullptr
)
{
fprintf
(
stderr
,
"error: FILE* is null, fallback to stdout logging
\n
"
);
fputs
(
"error: FILE* is null, fallback to stdout logging
\n
"
,
stderr
);
out
=
stdout
;
out
=
stdout
;
}
}
return
std
::
make_unique
<
Log
>
(
out
,
file
);
return
std
::
make_unique
<
Log
>
(
out
,
file
);
...
@@ -88,7 +84,7 @@ class Log {
...
@@ -88,7 +84,7 @@ class Log {
static
LogPtT
createLog
(
const
char
*
file_path
)
{
static
LogPtT
createLog
(
const
char
*
file_path
)
{
if
(
file_path
==
nullptr
)
{
if
(
file_path
==
nullptr
)
{
fp
rintf
(
stderr
,
"error: file_path is null, fallback to stdout logging
\n
"
);
fp
uts
(
"error: file_path is null, fallback to stdout logging
\n
"
,
stderr
);
return
sim_log
::
Log
::
createLog
();
return
sim_log
::
Log
::
createLog
();
}
}
...
@@ -102,12 +98,14 @@ class LogRegistry {
...
@@ -102,12 +98,14 @@ class LogRegistry {
{
LogLevel
::
off
,
"off"
},
{
LogLevel
::
off
,
"off"
},
{
LogLevel
::
info
,
"info"
},
{
LogLevel
::
info
,
"info"
},
{
LogLevel
::
warn
,
"warn"
},
{
LogLevel
::
warn
,
"warn"
},
{
LogLevel
::
debug
,
"debug"
},
{
LogLevel
::
error
,
"error"
}};
{
LogLevel
::
error
,
"error"
}};
LogLevel
level_
=
LogLevel
::
info
;
LogLevel
level_
=
LogLevel
::
info
;
bool
enforce_flush_
=
false
;
public:
public:
LogLevel
&
GetLevel
()
{
LogLevel
GetLevel
()
{
return
level_
;
return
level_
;
}
}
...
@@ -115,11 +113,18 @@ class LogRegistry {
...
@@ -115,11 +113,18 @@ class LogRegistry {
level_
=
level
;
level_
=
level
;
}
}
void
SetFlush
(
bool
flush
)
{
enforce_flush_
=
flush
;
}
bool
EnforceFlush
()
const
{
return
enforce_flush_
;
}
const
char
*
GetRepr
(
LogLevel
level
)
const
{
const
char
*
GetRepr
(
LogLevel
level
)
const
{
auto
it
=
level_names_
.
find
(
level
);
auto
it
=
level_names_
.
find
(
level
);
if
(
it
==
level_names_
.
end
())
{
if
(
it
==
level_names_
.
end
())
{
static
const
char
*
undef
{
"undefined"
};
return
"undefined"
;
return
undef
;
}
}
return
it
->
second
;
return
it
->
second
;
}
}
...
@@ -127,31 +132,37 @@ class LogRegistry {
...
@@ -127,31 +132,37 @@ class LogRegistry {
class
Logger
{
class
Logger
{
private:
private:
inline
bool
ShouldLog
(
LogLevel
level
)
{
inline
bool
ShouldLog
(
LogLevel
level
)
const
{
auto
&
registry
=
Logger
::
GetRegistry
();
auto
&
registry
=
Logger
::
GetRegistry
();
return
level
>=
registry
.
GetLevel
()
&&
return
level
>=
registry
.
GetLevel
()
&&
registry
.
GetLevel
()
!=
LogLevel
::
off
;
registry
.
GetLevel
()
!=
LogLevel
::
off
;
}
}
template
<
typename
...
Args
>
template
<
typename
...
Args
>
inline
void
log_internal
(
LogLevel
level
,
FILE
*
out
,
const
char
*
format
,
inline
void
log_internal
(
LogLevel
level
,
FILE
*
out
,
const
char
*
format
,
Args
...
args
)
{
Args
...
args
)
const
{
if
(
!
ShouldLog
(
level
))
{
if
(
!
ShouldLog
(
level
))
{
return
;
return
;
}
}
fprintf
(
out
,
"%s: "
,
GetRegistry
().
GetRepr
(
level
));
auto
&
registry
=
Logger
::
GetRegistry
();
fprintf
(
out
,
"%s: "
,
registry
.
GetRepr
(
level
));
fprintf
(
out
,
format
,
args
...);
fprintf
(
out
,
format
,
args
...);
if
(
registry
.
EnforceFlush
())
{
fflush
(
out
);
fflush
(
out
);
}
}
}
inline
void
log_internal
(
LogLevel
level
,
FILE
*
out
,
const
char
*
to_print
)
{
inline
void
log_internal
(
LogLevel
level
,
FILE
*
out
,
const
char
*
to_print
)
const
{
if
(
!
ShouldLog
(
level
))
{
if
(
!
ShouldLog
(
level
))
{
return
;
return
;
}
}
fprintf
(
out
,
"%s: "
,
GetRegistry
().
GetRepr
(
level
));
auto
&
registry
=
Logger
::
GetRegistry
();
fprintf
(
out
,
"%s"
,
to_print
);
fprintf
(
out
,
"%s: "
,
registry
.
GetRepr
(
level
));
fputs
(
to_print
,
out
);
if
(
registry
.
EnforceFlush
())
{
fflush
(
out
);
fflush
(
out
);
}
}
}
Logger
()
=
default
;
Logger
()
=
default
;
...
@@ -168,34 +179,45 @@ class Logger {
...
@@ -168,34 +179,45 @@ class Logger {
return
registry
;
return
registry
;
}
}
void
Flush
(
LogPtT
&
log
)
const
{
if
(
log
==
nullptr
||
log
->
file_
==
nullptr
)
{
return
;
}
fflush
(
log
->
file_
);
}
void
Flush
()
const
{
fflush
(
stdout
);
}
template
<
typename
...
Args
>
template
<
typename
...
Args
>
inline
void
log_stdout_f
(
LogLevel
level
,
const
char
*
format
,
inline
void
log_stdout_f
(
LogLevel
level
,
const
char
*
format
,
const
Args
&
...
args
)
{
const
Args
&
...
args
)
const
{
this
->
log_internal
(
level
,
stdout
,
format
,
args
...);
log_internal
(
level
,
stdout
,
format
,
args
...);
}
}
inline
void
log_stdout
(
LogLevel
level
,
const
char
*
to_print
)
{
inline
void
log_stdout
(
LogLevel
level
,
const
char
*
to_print
)
const
{
this
->
log_internal
(
level
,
stdout
,
to_print
);
log_internal
(
level
,
stdout
,
to_print
);
}
}
template
<
typename
...
Args
>
template
<
typename
...
Args
>
void
log_f
(
LogLevel
level
,
LogPtT
&
log
,
const
char
*
format
,
void
log_f
(
LogLevel
level
,
LogPtT
&
log
,
const
char
*
format
,
const
Args
&
...
args
)
{
const
Args
&
...
args
)
const
{
if
(
log
->
file_
==
nullptr
)
{
if
(
log
->
file_
==
nullptr
)
{
this
->
log_stdout
(
level
,
"log file is null. it should not be!
\n
"
);
log_stdout
(
level
,
"log file is null. it should not be!
\n
"
);
this
->
log_stdout_f
(
level
,
format
,
args
...);
log_stdout_f
(
level
,
format
,
args
...);
return
;
return
;
}
}
this
->
log_internal
(
level
,
log
->
file_
,
format
,
args
...);
log_internal
(
level
,
log
->
file_
,
format
,
args
...);
}
}
void
log
(
LogLevel
level
,
LogPtT
&
log
,
const
char
*
to_print
)
{
void
log
(
LogLevel
level
,
LogPtT
&
log
,
const
char
*
to_print
)
const
{
if
(
log
->
file_
==
nullptr
)
{
if
(
log
->
file_
==
nullptr
)
{
this
->
log_stdout
(
level
,
"log file is null. it should not be!
\n
"
);
log_stdout
(
level
,
"log file is null. it should not be!
\n
"
);
this
->
log_stdout
(
level
,
to_print
);
log_stdout
(
level
,
to_print
);
return
;
return
;
}
}
this
->
log_internal
(
level
,
log
->
file_
,
to_print
);
log_internal
(
level
,
log
->
file_
,
to_print
);
}
}
};
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment