## ----echo = FALSE, message = FALSE, warning = FALSE, results = "hide"---------
!is.null(knitr::opts_knit$get("out.format"))

## ----eval=FALSE---------------------------------------------------------------
# logger <- createLogger(name = "SIMPLE",
#                        threshold = "INFO",
#                        appenders = list(createConsoleAppender(layout = layoutTimestamp)))
# 
# registerLogger(logger)
# 
# logTrace("This event is below the threshold (INFO)")
# 
# logInfo("Hello world")

## ----echo=FALSE---------------------------------------------------------------
out <- "Hello world
2021-02-23 09:04:06 Hello world"
writeLines(out)

## ----eval=FALSE---------------------------------------------------------------
# clearLoggers()
# 
# logger <- createLogger(name = "SIMPLE",
#                        threshold = "INFO",
#                        appenders = list(createConsoleAppender(layout = layoutTimestamp)))
# 
# registerLogger(logger)
# 
# logInfo("Hello world")

## ----echo=FALSE---------------------------------------------------------------
writeLines("2021-02-23 09:04:06 Hello world")

## ----eval=FALSE---------------------------------------------------------------
# addDefaultConsoleLogger()

## ----eval=FALSE---------------------------------------------------------------
# registerLogger(createLogger(name = "DEFAULT_CONSOLE_LOGGER",
#                             threshold = "INFO",
#                             appenders = list(createConsoleAppender(layout = layoutSimple))))

## ----eval=FALSE---------------------------------------------------------------
# logFileName <- "log.txt"
# 
# logger <- createLogger(name = "PARALLEL",
#                        threshold = "TRACE",
#                        appenders = list(createFileAppender(layout = layoutParallel,
#                                                            fileName = logFileName)))
# registerLogger(logger)
# 
# logTrace("Executed this line")
# 
# logDebug("There are ",  length(getLoggers()), " loggers")
# 
# logInfo("Hello world")

## ----echo=FALSE---------------------------------------------------------------
writeLines("2021-02-23 09:04:06 Hello world")

## ----eval=FALSE---------------------------------------------------------------
# writeLines(readChar(logFileName, file.info(logFileName)$size))

## ----echo=FALSE---------------------------------------------------------------
out <- "2021-02-23 09:04:06\t[Main thread]\tTRACE\tevaluate\ttiming_fn\tExecuted this line
2021-02-23 09:04:06\t[Main thread]\tDEBUG\tevaluate\ttiming_fn\tThere are 2 loggers
2021-02-23 09:04:06\t[Main thread]\tINFO\tevaluate\ttiming_fn\tHello world"
writeLines(out)

## ----eval=FALSE---------------------------------------------------------------
# unlink(logFileName)

## ----eval=FALSE---------------------------------------------------------------
# addDefaultFileLogger(logFileName)

## ----eval=FALSE---------------------------------------------------------------
# registerLogger(createLogger(name = "DEFAULT_FILE_LOGGER",
#                             threshold = "TRACE",
#                             appenders = list(createFileAppender(layout = layoutParallel,
#                                                                 fileName = logFileName))))

## ----eval=FALSE---------------------------------------------------------------
# addDefaultErrorReportLogger()

## ----eval=FALSE---------------------------------------------------------------
# fileName <- file.path(getwd(), "errorReportR.txt")
# 
# registerLogger(createLogger(name = "DEFAULT_ERRORREPORT_LOGGER",
#                             threshold = "FATAL",
#                             appenders = list(createFileAppender(layout = layoutErrorReport,
#                                                                 fileName = fileName,
#                                                                 overwrite = TRUE,
#                                                                 expirationTime = 60))))

## ----eval=FALSE---------------------------------------------------------------
# mailSettings <- list(from = "someone@gmail.com",
# to = c("someone_else@gmail.com"),
# smtp = list(host.name = "smtp.gmail.com",
# port = 465,
# user.name = "someone@gmail.com",
# passwd = "super_secret!",
# ssl = TRUE),
# authenticate = TRUE,
# send = TRUE)
# 
# logger <- createLogger(name = "EMAIL",
# threshold = "FATAL",
# appenders = list(createEmailAppender(layout = layoutEmail,
# mailSettings = mailSettings)))
# registerLogger(logger)
# 
# logFatal("No more data to process")

## ----eval=FALSE---------------------------------------------------------------
# addDefaultEmailLogger(mailSettings)

## ----eval=FALSE---------------------------------------------------------------
# registerLogger(createLogger(name = "DEFAULT_EMAIL_LOGGER",
# threshold = "FATAL",
# appenders = list(createEmailAppender(layout = layoutEmail,
# mailSettings = mailSettings))))

## ----eval=FALSE---------------------------------------------------------------
# clearLoggers()
# addDefaultFileLogger(logFileName)
# 
# message("Hello")
# 
# warning("Danger!")
# 
# # This throws a warning:
# as.numeric('a')
# 
# # This throws an error:
# a <- b
# 
# writeLines(readChar(logFileName, file.info(logFileName)$size))

## ----echo=FALSE---------------------------------------------------------------
out <- "2021-02-23 09:04:09\t[Main thread]\tWARN\tevaluate\ttiming_fn\tHello
2021-02-23 09:04:09\t[Main thread]\tWARN\tevaluate\ttiming_fn\tDanger!
2021-02-23 09:04:09\t[Main thread]\tWARN\tevaluate\ttiming_fn\tWarning: NAs introduced by coercion
2021-02-23 09:04:09\t[Main thread]\tFATAL\tevaluate\ttiming_fn\tError: object a not found"
writeLines(out)

## ----eval=FALSE---------------------------------------------------------------
# clearLoggers() # Clean up the loggers from the previous example
# 
# addDefaultFileLogger(logFileName)
# 
# cluster <- makeCluster(3)
# 
# fun <- function(x) {
#   ParallelLogger::logInfo("The value of x is ", x)
#   # Do something
#   if (x == 6)
#     ParallelLogger::logDebug("X equals 6")
#   return(NULL)
# }
# 
# dummy <- clusterApply(cluster, 1:10, fun, progressBar = FALSE)
# 
# stopCluster(cluster)
# 
# writeLines(readChar(logFileName, file.info(logFileName)$size))

## ----echo=FALSE---------------------------------------------------------------
out <- "2021-02-23 09:04:09\t[Main thread]\tTRACE\tevaluate timing_fn Initiating cluster with 3 threads
2021-02-23 09:04:13\t[Thread 1]\tTRACE\t\tThread 1 initiated
2021-02-23 09:04:13\t[Thread 2]\tTRACE\t\tThread 2 initiated
2021-02-23 09:04:13\t[Thread 3]\tTRACE\t\tThread 3 initiated
2021-02-23 09:04:13\t[Thread 1]\tINFO\t\tThe value of x is 1
2021-02-23 09:04:13\t[Thread 2]\tINFO\t\tThe value of x is 2
2021-02-23 09:04:13\t[Thread 1]\tINFO\t\tThe value of x is 4
2021-02-23 09:04:13\t[Thread 2]\tINFO\t\tThe value of x is 5
2021-02-23 09:04:13\t[Thread 3]\tINFO\t\tThe value of x is 6
2021-02-23 09:04:13\t[Thread 1]\tINFO\t\tThe value of x is 7
2021-02-23 09:04:13\t[Thread 2]\tINFO\t\tThe value of x is 8
2021-02-23 09:04:13\t[Thread 1]\tINFO\t\tThe value of x is 9
2021-02-23 09:04:13\t[Thread 2]\tINFO\t\tThe value of x is 10
2021-02-23 09:04:13\t[Main thread]\tTRACE\tevaluate\ttiming_fn Stopping cluster
2021-02-23 09:04:13\t[Thread 1]\tTRACE\t\tThread 1 terminated
2021-02-23 09:04:13\t[Thread 3]\tTRACE\t\tThread 3 terminated
2021-02-23 09:04:13\t[Thread 2]\tTRACE\t\tThread 2 terminated"
writeLines(out)

## ----eval=FALSE---------------------------------------------------------------
# subSubTask <- function() {
#   addDefaultFileLogger("subSubTaskLog.txt")
#   # do something
# }
# 
# subTask <- function() {
#   addDefaultFileLogger("subTaskLog.txt")
#   # do something
#   subSubTask()
# }
# 
# mainTask <- function() {
#   addDefaultFileLogger("mainTaskLog.txt")
#   # do something
#   subTask()
# }

## ----eval=FALSE---------------------------------------------------------------
# subSubTask <- function() {
#   # do something
# }
# 
# subTask <- function() {
#   # do something
#   subSubTask()
# }
# 
# mainTask <- function() {
#   addDefaultFileLogger("log.txt")
#   # do something
#   subTask()
# }

## ----eval=FALSE---------------------------------------------------------------
# mainTask <- function() {
#   addDefaultFileLogger("log.txt")
#   on.exit(unregisterLogger("DEFAULT_FILE_LOGGER"))
#   # do something
# }

## ----eval=FALSE---------------------------------------------------------------
# launchLogViewer(logFileName)

