Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
1 change: 0 additions & 1 deletion DESCRIPTION
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ Depends:
R (>= 4.0)
Imports:
data.table,
log4r,
methods,
checkmate,
utils,
Expand Down
2 changes: 0 additions & 2 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
55 changes: 43 additions & 12 deletions R/utils_logging.R
Original file line number Diff line number Diff line change
@@ -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.
Expand All @@ -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)
}
}
Comment on lines +27 to +36

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify the behavior of R's cat function when append=FALSE
Rscript -e '
path <- "test_log.txt"
cat("First log line\n", file=path, append=FALSE)
cat("Second log line\n", file=path, append=FALSE)
cat("File contents:\n")
cat(readLines(path), sep="\n")
'

Repository: Vitek-Lab/MSstatsConvert

Length of output: 207


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the target file with line numbers and surrounding context.
git ls-files 'R/utils_logging.R'
wc -l R/utils_logging.R
cat -n R/utils_logging.R | sed -n '1,120p'

# Search for .fileAppender usages and related logging helpers.
rg -n "\.fileAppender|append = FALSE|fileAppender|formatLogMessage|log_file_path" R

Repository: Vitek-Lab/MSstatsConvert

Length of output: 11381


Log file is truncated on every write when append = FALSE. In R/utils_logging.R:29-35, the closure passes append = append to cat() for every message, so an existing file gets reopened in truncate mode on each log call and only the last entry survives. Truncate once when the appender is created, then always write with append = TRUE.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@R/utils_logging.R` around lines 27 - 36, Update .fileAppender so append =
FALSE truncates the log file once during appender creation, then make each
closure write use append = TRUE. Preserve append = TRUE behavior and ensure
multiple log calls retain all entries.



#' 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(...) {
Expand All @@ -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)
}
}
Expand Down Expand Up @@ -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)
Expand Down
12 changes: 12 additions & 0 deletions man/dot-consoleAppender.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions man/dot-fileAppender.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions man/dot-formatLogMessage.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion man/dot-nullAppender.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion vignettes/msstats_data_format.Rmd
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Loading