86 use f90_unix_env,
only: isatty
87 use f90_unix_env,
only: gethostname
90 use ifport,
only: isatty
91 use ifport,
only: hostnm
98 integer,
public,
parameter ::
log_fatal = log_level_fatal_def
99 integer,
public,
parameter ::
log_error = log_level_error_def
100 integer,
public,
parameter ::
log_warn = log_level_warn_def
101 integer,
public,
parameter ::
log_info = log_level_info_def
102 integer,
public,
parameter ::
log_debug = log_level_debug_def
103 integer,
public,
parameter ::
log_trace = log_level_trace_def
125 character(len=*),
parameter ::
start = achar(27)
127 character(len=*),
parameter ::
reset =
"0"
129 character(len=*),
parameter ::
bold =
"1", dimmed =
"2", &
130 underline =
"4", blink =
"5", invert =
"7", hidden =
"8"
133 logical,
save :: output_hostname = .false.
134 logical,
save :: output_severity = .true.
135 logical,
save :: output_date = .false.
136 logical,
save :: output_time = .false.
137 logical,
save :: output_fileline = .true.
138 logical,
save :: skip_terminal_check = .false.
139 logical,
save :: disable_colors = .false.
140 logical,
save :: disable_format = .false.
143 character(len=*),
dimension(NUM_LOG_LEVELS),
parameter ::
color_codes = &
144 [
"31",
"31",
"33",
"32",
"35",
"36",
"36"]
146 character(len=*),
dimension(NUM_LOG_LEVELS),
parameter ::
style_codes = &
156 integer,
intent(in) :: lu
157 character(len=*),
intent(in) :: code
158 if (.not. disable_format)
write(lu,
'(a,"[",a,"m")', advance=
"no")
start, code
164 character(len=*),
intent(inout) :: str
165 character(len=*),
intent(in) :: code
166 if (.not. disable_format) str = trim(str) //
start //
"[" // trim(code) //
"m"
171 logical,
intent(in) :: bool
172 output_hostname = bool
177 logical,
intent(in) :: bool
178 output_severity = bool
183 logical,
intent(in) :: bool
189 logical,
intent(in) :: bool
195 logical,
intent(in) :: bool
196 output_fileline = bool
201 logical,
intent(in) :: bool
202 skip_terminal_check = bool
207 logical,
intent(in) :: bool
208 disable_colors = bool
213 logical,
intent(in) :: bool
214 disable_format = bool
220 integer,
intent(in) :: level
236 integer,
intent(in) :: level
237 integer,
intent(in),
optional :: only_n
240 integer :: rank, ierr
249 if (
logp .and.
present(only_n))
then
250 call mpi_comm_rank(mpi_comm_world, rank, ierr)
251 if (rank .ne. only_n)
logp = .false.
259 function logl(level, filename, linenum)
263 character(len=*),
optional :: filename
264 integer,
optional :: linenum
265 character(len=300) ::
logl
268 character(len=50),
dimension(6) :: log_tmp
270 integer :: i, j, space_cnt
271 character(4) :: linenum_lj
272 character(len=50) :: basename
274 logical :: show_colors = .false.
275 logical :: is_terminal = .false.
279 if (level .lt. 1) level = 1
283 if (skip_terminal_check)
then
284 show_colors = .not. disable_colors
287 call isatty(stdout, is_terminal)
289 is_terminal = isatty(stdout)
291 show_colors = is_terminal .and. .not. disable_colors
300 if (show_colors)
call stput(log_tmp(i),
reset)
303 if (output_date .or. output_time)
then
309 if (output_hostname)
then
316 log_tmp(i) = trim(log_tmp(i)) // log_mpi_id()
322 log_tmp(i) = trim(log_tmp(i)) // trim(basename)
323 if (
present(linenum))
then
325 write(linenum_lj,
'(i4)') linenum
326 log_tmp(i) = trim(log_tmp(i)) //
":" // adjustl(linenum_lj)
329 fn_len = fn_len + len_trim(log_tmp(i))
334 if (output_severity)
then
335 fn_len = fn_len + len_trim(
log_severity(level, .false.))
337 space_cnt = mod(7-fn_len,8)+8
338 if (space_cnt >= 8) space_cnt = space_cnt - 8
339 log_tmp(i) = trim(log_tmp(i)) //
spaces(space_cnt) //
log_severity(level, show_colors)
343 if (show_colors)
then
352 logl = trim(
logl) //
" " // trim(log_tmp(j))
359 character(len=*),
intent(in) :: filepath
360 character(len=*),
intent(out) :: basename
361 integer :: last_sep_idx
362 last_sep_idx = index(filepath,
"/", .true.)
363 basename = filepath(last_sep_idx+1:)
387 integer,
intent(in) :: n
388 character(len=n) ::
spaces
395 integer,
intent(in) :: level
396 logical,
intent(in) :: show_colors
402 if (show_colors)
then
427 function log_mpi_id()
429 character(50) :: log_mpi_id
430 character(6) :: mpi_id_lj
431 character(4) :: id_fmt
432 integer :: rank, n_cpu, ierr
434 call mpi_comm_rank(mpi_comm_world, rank, ierr)
435 call mpi_comm_size(mpi_comm_world, n_cpu, ierr)
436 if (n_cpu .eq. 1)
then
439 write(id_fmt,
'(A,i1,A)')
"(i", ceiling(log10(real(n_cpu))),
")"
440 write(mpi_id_lj,id_fmt) rank
441 write(log_mpi_id,
'("#",a)') trim(adjustl(mpi_id_lj))
443 end function log_mpi_id
452 character(10) :: time
455 call date_and_time(date, time, zone)
456 if (output_date .and. output_time)
then
457 write(
log_datetime,
'(a,"/",a,"/",a," ",a,":",a,":",a,".",a," ")') date(1:4), date(5:6), date(7:8), &
458 time(1:2), time(3:4), time(5:6), time(8:10)
460 if (output_time)
then
461 write(
log_datetime,
'(a,":",a,":",a,".",a," ")') time(1:2), time(3:4), time(5:6), time(8:10)
463 if (output_date)
then
464 write(
log_datetime,
'(a,"/",a,"/",a," ")') date(1:4), date(5:6), date(7:8)
471 verbose, quiet, log_output_hostname, log_force_colors, log_no_colors, log_output_date, log_output_time, log_no_format)
474 integer(i4),
optional,
intent(in) :: verbose
475 integer(i4),
optional,
intent(in) :: quiet
476 logical,
optional,
intent(in) :: log_output_hostname
477 logical,
optional,
intent(in) :: log_force_colors
478 logical,
optional,
intent(in) :: log_no_colors
479 logical,
optional,
intent(in) :: log_output_date
480 logical,
optional,
intent(in) :: log_output_time
481 logical,
optional,
intent(in) :: log_no_format
485 if (
present(log_output_hostname) ) output_hostname = log_output_hostname
486 if (
present(log_force_colors) ) skip_terminal_check = log_force_colors
487 if (
present(log_no_colors) ) disable_colors = log_no_colors
488 if (
present(log_output_date) ) output_date = log_output_date
489 if (
present(log_output_time) ) output_time = log_output_time
490 if (
present(log_no_format) ) disable_format = log_no_format
Provides computational, mathematical, physical, and file constants.
integer, parameter nerr
Standard error file unit.
integer, parameter nout
Standard output file unit.
Define number representations.
integer, parameter i4
4 Byte Integer Kind
Module providing a logging framework.
subroutine, public log_set_disable_format(bool)
Disable formatting altogether.
subroutine, public log_set_output_severity(bool)
Set the default for severity output.
logical function, public logp(level, only_n)
Output this log statement or not.
character(len= *), parameter reset
Control reset character.
integer, parameter, public log_trace
= 6, Extremely detailed output, compile your program with -DENABLE_LOG_TRACE to enable
integer, save, public minimum_log_level
Note that more critical means a lower number.
integer, parameter, public log_error
= 2, Runtime error
integer, parameter, public num_log_levels
1 through 7 (fatal through trace)
character(len=50) function log_hostname()
Return the hostname in a 50 character string.
character(len= *), parameter level_color
Colors for other output.
integer, save, public log_unit
By default, log to stdout for level > 2.
subroutine, public log_set_output_time(bool)
Set time-only date format.
integer function, public logu(level)
Output unit to log.
subroutine, public log_set_disable_colors(bool)
Disable colors altogether.
integer, parameter, public log_subtrace
= 7, More Extremely detailed output, compile your program with -DENABLE_LOG_TRACE to enable
character(50) function log_datetime()
Return the current date, formatted nicely.
logical, save, public show_file_and_line
show file name and line number in log output
character(len=n) function spaces(n)
Return n spaces.
subroutine, public log_set_output_hostname(bool)
Set the default for hostname output.
subroutine, public log_set_output_date(bool)
Set the default for date output.
character(len= *), parameter bold
Styles.
integer, parameter, public log_debug
= 5, Detailed debug output, disable by compiling your program with -DDISABLE_LOG_DEBUG
subroutine tput(lu, code)
write format string to given unit
subroutine, public log_set_output_fileline(bool)
Set the default for file/line output.
character(len=50) function log_severity(level, show_colors)
Return the severity level with colors etc in a 50 char string.
character(len=300) function, public logl(level, filename, linenum)
Write a log lead containing level and optional info.
integer, parameter, public log_fatal
= 1, Runtime error causing termination
character(len= *), parameter start
Control start character.
subroutine, public log_set_skip_terminal_check(bool)
Whether or not to skip the terminal check.
subroutine strip_path(filepath, basename)
Get base name of a file path.
integer, parameter, public log_warn
= 3, Warning, but we can continue
character(len= *), dimension(num_log_levels), parameter style_codes
These are the styles corresponding to the loglevels above.
integer, save, public log_unit_error
By default, log to stderr for level <= 2.
integer, parameter, public log_info
= 4, Interesting events
subroutine, public stput(str, code)
generate format string
character(len= *), dimension(num_log_levels), parameter color_codes
These are the color codes corresponding to the loglevels above.
subroutine, public log_set_config(verbose, quiet, log_output_hostname, log_force_colors, log_no_colors, log_output_date, log_output_time, log_no_format)
Set logging configuration.