diff --git a/DESCRIPTION b/DESCRIPTION index 129220e3..a9076df7 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -19,7 +19,6 @@ Depends: R (>= 4.0) Imports: data.table, - log4r, methods, checkmate, utils, diff --git a/NAMESPACE b/NAMESPACE index e51cffd6..94f287cf 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -42,8 +42,6 @@ importFrom(data.table,melt) importFrom(data.table,rbindlist) importFrom(data.table,setnames) importFrom(data.table,uniqueN) -importFrom(log4r,console_appender) -importFrom(log4r,file_appender) importFrom(methods,new) importFrom(stats,na.omit) importFrom(utils,sessionInfo) diff --git a/R/utils_logging.R b/R/utils_logging.R index a606ea50..4529a70e 100644 --- a/R/utils_logging.R +++ b/R/utils_logging.R @@ -1,4 +1,4 @@ -#' log4r appender used not to write messages +#' Appender used not to write messages #' #' A convenience function written to save time on checking if messages should #' be printed or logs should be written to a file. @@ -12,9 +12,41 @@ } +#' Format one log line: level, timestamp, message +#' +#' Message parts are joined with paste0, never sprintf, so a literal percent +#' sign is written verbatim. +#' @keywords internal +.formatLogMessage = function(level, ...) { + timestamp = format(Sys.time(), "%Y-%m-%d %H:%M:%S") + level_field = formatC(level, width = 5L, flag = "-") + paste0(level_field, " [", timestamp, "] ", paste0(..., collapse = ""), "\n") +} + + +#' File appender: returns a function(level, ...) that writes one line to a file +#' @keywords internal +.fileAppender = function(log_file_path, append = TRUE) { + force(log_file_path) + force(append) + function(level, ...) { + cat(.formatLogMessage(level, ...), file = log_file_path, sep = "", + append = append) + } +} + + +#' Console appender: returns a function(level, ...) that writes one line to console +#' @keywords internal +.consoleAppender = function() { + function(level, ...) { + cat(.formatLogMessage(level, ...)) + } +} + + #' Set default logging object when package is loaded #' @param ... ignored -#' @importFrom log4r file_appender console_appender #' @return none, sets options called MSstatsLog and MSstatsMsg #' @keywords internal .onLoad = function(...) { @@ -24,11 +56,11 @@ path = paste0("./MSstats_log_", gsub("[ :\\-]", "_", time_now), ".log") if (is.null(logs)) { - ms_logs = file_appender(path) + ms_logs = .fileAppender(path) options(MSstatsLog = ms_logs) } if (is.null(msgs)) { - ms_messages = console_appender() + ms_messages = .consoleAppender() options(MSstatsMsg = ms_messages) } } @@ -79,24 +111,23 @@ MSstatsLogsSettings = function(use_log_file = TRUE, append = FALSE, if (use_log_file) { if (!is.null(log_file_path)) { - file_appender = log4r::file_appender(log_file_path, - append = append) + file_logger = .fileAppender(log_file_path, append = append) } else { time_now = Sys.time() log_file_path = paste0(base, gsub("[ :\\-]", "_", time_now), ".log") - file_appender = log4r::file_appender(log_file_path) + file_logger = .fileAppender(log_file_path) } } else { - file_appender = .nullAppender + file_logger = .nullAppender } - + if (verbose) { - console_appender = console_appender() + console_logger = .consoleAppender() } else { - console_appender = .nullAppender + console_logger = .nullAppender } - loggers = list(file_appender, console_appender) + loggers = list(file_logger, console_logger) names(loggers) = paste0(pkg_name, c("Log", "Msg")) do.call(options, loggers) invisible(TRUE) diff --git a/man/dot-consoleAppender.Rd b/man/dot-consoleAppender.Rd new file mode 100644 index 00000000..bc6a5f50 --- /dev/null +++ b/man/dot-consoleAppender.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_logging.R +\name{.consoleAppender} +\alias{.consoleAppender} +\title{Console appender: returns a function(level, ...) that writes one line to console} +\usage{ +.consoleAppender() +} +\description{ +Console appender: returns a function(level, ...) that writes one line to console +} +\keyword{internal} diff --git a/man/dot-fileAppender.Rd b/man/dot-fileAppender.Rd new file mode 100644 index 00000000..9dbb269e --- /dev/null +++ b/man/dot-fileAppender.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_logging.R +\name{.fileAppender} +\alias{.fileAppender} +\title{File appender: returns a function(level, ...) that writes one line to a file} +\usage{ +.fileAppender(log_file_path, append = TRUE) +} +\description{ +File appender: returns a function(level, ...) that writes one line to a file +} +\keyword{internal} diff --git a/man/dot-formatLogMessage.Rd b/man/dot-formatLogMessage.Rd new file mode 100644 index 00000000..907fb77b --- /dev/null +++ b/man/dot-formatLogMessage.Rd @@ -0,0 +1,13 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_logging.R +\name{.formatLogMessage} +\alias{.formatLogMessage} +\title{Format a log line as "LEVEL \link{timestamp} message"} +\usage{ +.formatLogMessage(level, ...) +} +\description{ +Message parts are joined with paste0, never sprintf, so a literal percent +sign is written verbatim. +} +\keyword{internal} diff --git a/man/dot-nullAppender.Rd b/man/dot-nullAppender.Rd index b00fe61e..8da0e017 100644 --- a/man/dot-nullAppender.Rd +++ b/man/dot-nullAppender.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/utils_logging.R \name{.nullAppender} \alias{.nullAppender} -\title{log4r appender used not to write messages} +\title{Appender used not to write messages} \usage{ .nullAppender(level, ...) } diff --git a/vignettes/msstats_data_format.Rmd b/vignettes/msstats_data_format.Rmd index 2115f1c5..982f331f 100644 --- a/vignettes/msstats_data_format.Rmd +++ b/vignettes/msstats_data_format.Rmd @@ -75,7 +75,7 @@ to store fraction labels. # Logging -`MSstatsConvert` allows for flexible logging based on the `log4r` package. +`MSstatsConvert` allows for flexible logging. Information about preprocessing steps can be written to a file, to a console, to both or to neither. The `MSstatsLogsSettings` function helps manage log settings.