.log_env <- new.env(parent = emptyenv()) .log_env$file <- NULL log_init <- function() { log_dir <- Sys.getenv("LOG_DIR", "/logs") if (!dir.exists(log_dir)) dir.create(log_dir, recursive = TRUE, showWarnings = FALSE) fname <- paste0(format(Sys.Date(), "%Y-%m-%d"), "_log.jsonl") .log_env$file <- file.path(log_dir, fname) v <- tryCatch( as.character(utils::packageVersion("listkeeper")), error = function(e) "unknown" ) .log_write("INFO", "startup", version = v, r_version = paste(R.version$major, R.version$minor, sep = "."), platform = R.version$platform, api_url = Sys.getenv("API_URL", "http://localhost:8000") ) } .log_write <- function(level, msg, ...) { if (is.null(.log_env$file)) return(invisible(NULL)) entry <- c( list(ts = format(Sys.time(), "%Y-%m-%dT%H:%M:%OS3"), level = level, msg = msg), list(...) ) line <- jsonlite::toJSON(entry, auto_unbox = TRUE) cat(line, "\n", file = .log_env$file, append = TRUE, sep = "") invisible(NULL) } log_info <- function(msg, ...) .log_write("INFO", msg, ...) log_debug <- function(msg, ...) .log_write("DEBUG", msg, ...) log_error <- function(msg, ...) .log_write("ERROR", msg, ...)