[log] try to use log file setting from .toml

This however throws 'resource busy' on 'openFile'.
parent 32064288
Pipeline #7571 failed with stages
in 15 minutes and 37 seconds
...@@ -24,7 +24,7 @@ import GHC.IO.Encoding (setLocaleEncoding, utf8) ...@@ -24,7 +24,7 @@ import GHC.IO.Encoding (setLocaleEncoding, utf8)
import Gargantext.API (startGargantext) import Gargantext.API (startGargantext)
import Gargantext.API.Admin.EnvTypes (Mode(..)) import Gargantext.API.Admin.EnvTypes (Mode(..))
import Gargantext.Core.Config import Gargantext.Core.Config
import Gargantext.Core.Config.Types (_SettingsFile) -- import Gargantext.Core.Config.Types (_SettingsFile)
import Gargantext.Core.Config.Utils (readConfig) import Gargantext.Core.Config.Utils (readConfig)
import Gargantext.Prelude import Gargantext.Prelude
import Gargantext.System.Logging import Gargantext.System.Logging
...@@ -39,25 +39,26 @@ withServerCLILogger ServerArgs{..} f = do ...@@ -39,25 +39,26 @@ withServerCLILogger ServerArgs{..} f = do
withLogger (cfg ^. gc_logging) $ \logger -> f logger withLogger (cfg ^. gc_logging) $ \logger -> f logger
serverCLI :: CLIServer -> IO () serverCLI :: CLIServer -> IO ()
serverCLI (CLIS_start serverArgs) = withServerCLILogger serverArgs $ \ioLogger -> serverCLI (CLIS_start serverArgs) = startServerCLI serverArgs
startServerCLI ioLogger serverArgs
serverCLI (CLIS_startAll serverArgs@(ServerArgs { .. })) = withServerCLILogger serverArgs $ \ioLogger -> do serverCLI (CLIS_startAll serverArgs@(ServerArgs { .. })) = do
withAsync (startServerCLI ioLogger serverArgs) $ \aServer -> do withAsync (startServerCLI serverArgs) $ \aServer -> do
res <- Async.race (runAllWorkers ioLogger server_toml) (waitCatch aServer) res <- Async.race (runAllWorkers server_toml) (waitCatch aServer)
case res of case res of
Left () -> pure () Left () -> pure ()
Right (Left ex) Right (Left ex)
-> do -> do
$(logLoc) ioLogger ERROR $ "Exception raised when running the server:\n\n" <> T.pack (displayException ex) panicTrace $ "Exception raised when running the server:\n\n" <> T.pack (displayException ex)
exitFailure -- exitFailure
Right (Right ()) Right (Right ())
-> pure () -> pure ()
serverCLI (CLIS_version) = withLogger (LogConfig Nothing DEBUG) $ \ioLogger -> do serverCLI (CLIS_version) = withLogger dummyLogConfig $ \ioLogger -> do
-- Sets the locale to avoid encoding issues like in #284. -- Sets the locale to avoid encoding issues like in #284.
setLocaleEncoding utf8 setLocaleEncoding utf8
logMsg ioLogger INFO $ "Version: " <> showVersion PG.version logMsg ioLogger INFO $ "Version: " <> showVersion PG.version
where
dummyLogConfig = LogConfig { _lc_log_file = Nothing, _lc_log_level = DEBUG}
serverCmd :: HasCallStack => Mod CommandFields CLI serverCmd :: HasCallStack => Mod CommandFields CLI
...@@ -104,14 +105,15 @@ version_p :: Parser CLIServer ...@@ -104,14 +105,15 @@ version_p :: Parser CLIServer
version_p = pure CLIS_version version_p = pure CLIS_version
startServerCLI :: Logger IO -> ServerArgs -> IO () startServerCLI :: ServerArgs -> IO ()
startServerCLI ioLogger (ServerArgs { .. }) = do startServerCLI (ServerArgs { .. }) = do
logMsg ioLogger INFO $ "starting server, mode: " <> show server_mode <> ", port: " <> show server_port <> ", config: " <> _SettingsFile server_toml -- logMsg ioLogger INFO $ "starting server, mode: " <> show server_mode <> ", port: " <> show server_port <> ", config: " <> _SettingsFile server_toml
-- Sets the locale to avoid encoding issues like in #284. -- Sets the locale to avoid encoding issues like in #284.
setLocaleEncoding utf8 setLocaleEncoding utf8
when (server_mode == Mock) $ do when (server_mode == Mock) $ do
logMsg ioLogger ERROR "Mock mode not supported!" -- logMsg ioLogger ERROR "Mock mode not supported!"
exitFailure panicTrace "Mock mode not supported!"
-- exitFailure
startGargantext server_mode server_port server_toml startGargantext server_mode server_port server_toml
...@@ -17,20 +17,18 @@ import Async.Worker.Types qualified as W ...@@ -17,20 +17,18 @@ import Async.Worker.Types qualified as W
import CLI.Types import CLI.Types
import CLI.Parsers import CLI.Parsers
import Control.Concurrent.Async (forConcurrently_) import Control.Concurrent.Async (forConcurrently_)
import Data.List qualified as List (cycle, concat, take)
import Data.Text qualified as T import Data.Text qualified as T
import Gargantext.Core.Config (hasConfig, gc_worker, gc_logging) import Gargantext.Core.Config (hasConfig, gc_worker)
import Gargantext.Core.Config.Types (SettingsFile(..)) import Gargantext.Core.Config.Types (SettingsFile(..))
import Gargantext.Core.Config.Utils (readConfig) import Gargantext.Core.Config.Utils (readConfig)
import Gargantext.Core.Config.Worker (WorkerDefinition(..), WorkerSettings(..), findDefinitionByName) import Gargantext.Core.Config.Worker (WorkerDefinition(..), WorkerSettings(..), findDefinitionByName)
import Gargantext.Core.Worker (withPGMQWorkerCtrlC, withPGMQWorkerSingleCtrlC, initWorkerState) import Gargantext.Core.Worker (withPGMQWorkerCtrlC, withPGMQWorkerSingleCtrlC, initWorkerState)
import Gargantext.Core.Worker.Env (withWorkerEnv) import Gargantext.Core.Worker.Env (withWorkerEnv, runWorkerMonad)
-- import Gargantext.Core.Worker.Jobs (sendJob) -- import Gargantext.Core.Worker.Jobs (sendJob)
-- import Gargantext.Core.Worker.Jobs.Types (Job(Ping)) -- import Gargantext.Core.Worker.Jobs.Types (Job(Ping))
import Gargantext.Prelude import Gargantext.Prelude
import Gargantext.System.Logging (withLogger, logMsg, LogLevel(..), Logger) import Gargantext.System.Logging (logM, LogLevel(..))
import Options.Applicative import Options.Applicative
import Prelude qualified
-- TODO Command to monitor queues -- TODO Command to monitor queues
...@@ -38,60 +36,48 @@ import Prelude qualified ...@@ -38,60 +36,48 @@ import Prelude qualified
workerCLI :: CLIWorker -> IO () workerCLI :: CLIWorker -> IO ()
workerCLI (CLIW_run (WorkerArgs { .. })) = do workerCLI (CLIW_run (WorkerArgs { .. })) = do
let ___ = putStrLn ((List.concat cfg <- readConfig worker_toml
$ List.take 72 let ws = cfg ^. gc_worker
$ List.cycle ["_"]) :: Prelude.String) case findDefinitionByName ws worker_name of
Nothing -> do
withWorkerEnv worker_toml $ \env -> do let workerNames = _wdName <$> (_wsDefinitions ws)
let log_cfg = env ^. hasConfig . gc_logging let availableWorkers = T.intercalate ", " workerNames
withLogger log_cfg $ \ioLogger -> do panicTrace $ "Worker definition not found! Available workers: " <> availableWorkers
___ Just wd -> do
logMsg ioLogger INFO "GarganText worker" withWorkerEnv worker_toml (T.unpack worker_name) $ \env -> do
logMsg ioLogger INFO $ "worker_name: " <> T.unpack worker_name runWorkerMonad env $ do
logMsg ioLogger INFO $ "worker toml: " <> _SettingsFile worker_toml logM INFO $ "Starting worker '" <> worker_name <> "'"
___ logM DEBUG $ "gc config: " <> show (env ^. hasConfig)
logM DEBUG $ "Worker settings: " <> show ws
let ws = env ^. hasConfig . gc_worker if worker_run_single then
case findDefinitionByName ws worker_name of withPGMQWorkerSingleCtrlC env wd $ \a _state -> do
Nothing -> do wait a
let workerNames = _wdName <$> (_wsDefinitions ws) else
let availableWorkers = T.intercalate ", " workerNames withPGMQWorkerCtrlC env wd $ \a _state -> do
putText $ "Worker definition not found! Available workers: " <> availableWorkers -- _ <- runReaderT (sendJob Ping) env
Just wd -> do wait a
logMsg ioLogger INFO $ "Starting worker '" <> T.unpack worker_name <> "'" workerCLI (CLIW_runAll (WorkerAllArgs { .. })) = do
logMsg ioLogger DEBUG $ "gc config: " <> show (env ^. hasConfig) runAllWorkers worker_toml
logMsg ioLogger DEBUG $ "Worker settings: " <> show ws
___
if worker_run_single then
withPGMQWorkerSingleCtrlC env wd $ \a _state -> do
wait a
else
withPGMQWorkerCtrlC env wd $ \a _state -> do
-- _ <- runReaderT (sendJob Ping) env
wait a
workerCLI (CLIW_runAll (WorkerAllArgs { .. })) = withWorkerEnv worker_toml $ \env -> do
let log_cfg = env ^. hasConfig . gc_logging
withLogger log_cfg $ \ioLogger -> runAllWorkers ioLogger worker_toml
workerCLI (CLIW_stats (WorkerStatsArgs { .. })) = do workerCLI (CLIW_stats (WorkerStatsArgs { .. })) = do
putStrLn ("worker toml: " <> _SettingsFile ws_toml) cfg <- readConfig ws_toml
let ws = cfg ^. gc_worker
withWorkerEnv ws_toml $ \env -> do mapM_ (\wd -> withWorkerEnv ws_toml (T.unpack $ _wdName wd) $ \env -> do
let ws = env ^. hasConfig . gc_worker state' <- initWorkerState env wd
mapM_ (\wd -> do let b = W.broker state'
state' <- initWorkerState env wd let q = W.queueName state'
let b = W.broker state' qs <- BT.getQueueSize b q
let q = W.queueName state' msgIds <- BT.listPendingMessageIds b q
qs <- BT.getQueueSize b q runWorkerMonad env $ do
msgIds <- BT.listPendingMessageIds b q logM INFO $ ("Queue: " <> show q <> ", size: " <> show qs :: Text)
putStrLn ("Queue: " <> show q <> ", size: " <> show qs :: Text) logM INFO $ (" Messages: " :: Text)
putStrLn (" Messages: " :: Text) mapM_ (\msgId -> do
mapM_ (\msgId -> do mm <- BT.getMessageById b q msgId
mm <- BT.getMessageById b q msgId runWorkerMonad env $ do
case mm of case mm of
Nothing -> putStrLn (" - " <> show msgId <> " :: NOTHING!" :: Text) Nothing -> logM ERROR (" - " <> show msgId <> " :: NOTHING!" :: Text)
Just m -> putStrLn (" - " <> show m :: Text) Just m -> logM INFO (" - " <> show m :: Text)
) msgIds ) msgIds
) (_wsDefinitions ws) ) (_wsDefinitions ws)
workerCmd :: HasCallStack => Mod CommandFields CLI workerCmd :: HasCallStack => Mod CommandFields CLI
...@@ -135,12 +121,13 @@ stats_p = fmap CLIW_stats $ WorkerStatsArgs ...@@ -135,12 +121,13 @@ stats_p = fmap CLIW_stats $ WorkerStatsArgs
-- loop for the workers, so beware when using this, make sure that the calling -- loop for the workers, so beware when using this, make sure that the calling
-- code is using this properly (for example along the use of 'race' or a similar -- code is using this properly (for example along the use of 'race' or a similar
-- function from async). -- function from async).
runAllWorkers :: Logger IO -> SettingsFile -> IO () runAllWorkers :: SettingsFile -> IO ()
runAllWorkers ioLogger worker_toml = do runAllWorkers worker_toml = do
cfg <- readConfig worker_toml cfg <- readConfig worker_toml
let ws = cfg ^. gc_worker let ws = cfg ^. gc_worker
forConcurrently_ (_wsDefinitions ws) $ \wd -> do forConcurrently_ (_wsDefinitions ws) $ \wd -> do
withWorkerEnv worker_toml $ \env -> do withWorkerEnv worker_toml (T.unpack $ _wdName wd) $ \env -> do
logMsg ioLogger INFO $ "Starting worker '" <> T.unpack (_wdName wd) <> "' (queue " <> show (_wdQueue wd) <> ")" runWorkerMonad env $ do
logM INFO $ "Starting worker '" <> _wdName wd <> "' (queue " <> show (_wdQueue wd) <> ")"
withPGMQWorkerCtrlC env wd $ \a _state -> do withPGMQWorkerCtrlC env wd $ \a _state -> do
wait a wait a
...@@ -20,7 +20,7 @@ module Gargantext.Core.Worker.Env where ...@@ -20,7 +20,7 @@ module Gargantext.Core.Worker.Env where
import Control.Concurrent.STM.TVar (TVar, modifyTVar, newTVarIO, readTVarIO) import Control.Concurrent.STM.TVar (TVar, modifyTVar, newTVarIO, readTVarIO)
import Control.Exception.Safe qualified as CES import Control.Exception.Safe qualified as CES
import Control.Lens (prism', to, view) import Control.Lens (prism', to, view, (%~), _Just)
import Control.Lens.TH import Control.Lens.TH
import Control.Monad.Trans.Control (MonadBaseControl) import Control.Monad.Trans.Control (MonadBaseControl)
import Data.Maybe (fromJust) import Data.Maybe (fromJust)
...@@ -31,7 +31,7 @@ import Gargantext.API.Job (RemainingSteps(..), jobLogStart, jobLogProgress, jobL ...@@ -31,7 +31,7 @@ import Gargantext.API.Job (RemainingSteps(..), jobLogStart, jobLogProgress, jobL
import Gargantext.API.Prelude (GargM) import Gargantext.API.Prelude (GargM)
import Gargantext.Core.Notifications.CentralExchange qualified as CE import Gargantext.Core.Notifications.CentralExchange qualified as CE
import Gargantext.Core.Notifications.CentralExchange.Types qualified as CET import Gargantext.Core.Notifications.CentralExchange.Types qualified as CET
import Gargantext.Core.Config (GargConfig(..), HasConfig(..), gc_logging, LogConfig) import Gargantext.Core.Config (GargConfig(..), HasConfig(..), gc_logging, LogConfig, lc_log_file)
import Gargantext.Core.Config.Mail qualified as Mail import Gargantext.Core.Config.Mail qualified as Mail
import Gargantext.Core.Config.Utils (readConfig) import Gargantext.Core.Config.Utils (readConfig)
import Gargantext.Core.Config.Types (SettingsFile(..)) import Gargantext.Core.Config.Types (SettingsFile(..))
...@@ -48,6 +48,7 @@ import Gargantext.System.Logging (HasLogger(..), Logger, LogLevel(..), MonadLogg ...@@ -48,6 +48,7 @@ import Gargantext.System.Logging (HasLogger(..), Logger, LogLevel(..), MonadLogg
import Gargantext.Utils.Jobs.Monad ( MonadJobStatus(..), JobHandle ) import Gargantext.Utils.Jobs.Monad ( MonadJobStatus(..), JobHandle )
import GHC.IO.Exception (IOException(..), IOErrorType(OtherError)) import GHC.IO.Exception (IOException(..), IOErrorType(OtherError))
import Prelude qualified import Prelude qualified
import System.FilePath ((</>), takeDirectory, takeFileName, takeBaseName, takeExtension)
import System.Log.FastLogger qualified as FL import System.Log.FastLogger qualified as FL
import Gargantext.System.Logging.Loggers import Gargantext.System.Logging.Loggers
...@@ -69,10 +70,20 @@ data WorkerJobState = WorkerJobState ...@@ -69,10 +70,20 @@ data WorkerJobState = WorkerJobState
deriving (Show, Eq) deriving (Show, Eq)
withWorkerEnv :: SettingsFile -> (WorkerEnv -> IO a) -> IO a withWorkerEnv :: SettingsFile -> Prelude.String -> (WorkerEnv -> IO a) -> IO a
withWorkerEnv settingsFile k = do withWorkerEnv settingsFile workerName k = do
cfg <- readConfig settingsFile cfg <- readConfig settingsFile
withLoggerIO (cfg ^. gc_logging) $ \logger -> do -- each worker should have it's own log file, not to conflict with the server
let modifyFileName path = dir </> (base ++ suffix ++ ext)
where
dir = takeDirectory path
filename = takeFileName path
base = takeBaseName filename
ext = takeExtension filename
suffix = "-worker-" <> workerName
let workerLogging = (lc_log_file . _Just) %~ modifyFileName $ cfg ^. gc_logging
putText $ "workerLogging: " <> show workerLogging
withLoggerIO workerLogging $ \logger -> do
env <- newWorkerEnv logger cfg env <- newWorkerEnv logger cfg
k env -- `finally` cleanEnv env k env -- `finally` cleanEnv env
......
...@@ -33,7 +33,7 @@ data IOStdLogger = ...@@ -33,7 +33,7 @@ data IOStdLogger =
} }
ioStdLogger :: LogConfig -> IO IOStdLogger ioStdLogger :: LogConfig -> IO IOStdLogger
ioStdLogger LogConfig{..} = do ioStdLogger LogConfig { _lc_log_file = Nothing, _lc_log_level } = do
let minLvl = _lc_log_level let minLvl = _lc_log_level
let log_msg lvl msg = do let log_msg lvl msg = do
t <- getCurrentTime t <- getCurrentTime
...@@ -46,6 +46,21 @@ ioStdLogger LogConfig{..} = do ...@@ -46,6 +46,21 @@ ioStdLogger LogConfig{..} = do
, _iosl_log_msg = log_msg , _iosl_log_msg = log_msg
, _iosl_log_txt = \lvl msg -> log_msg lvl (T.unpack msg) , _iosl_log_txt = \lvl msg -> log_msg lvl (T.unpack msg)
} }
ioStdLogger LogConfig { _lc_log_file = Just fpath, _lc_log_level } = do
let minLvl = _lc_log_level
let logType = FL.LogFileNoRotate fpath FL.defaultBufSize
(logger, loggerClose) <- FL.newFastLogger logType
let log_msg lvl msg = do
t <- getCurrentTime
when (lvl >= minLvl) $ do
let pfx = "[" <> show t <> "] [" <> show lvl <> "] "
logger $ FL.toLogStr $ pfx <> msg
pure $ IOStdLogger
{ _iosl_log_level = minLvl
, _iosl_destroy = loggerClose
, _iosl_log_msg = log_msg
, _iosl_log_txt = \lvl msg -> log_msg lvl (T.unpack msg)
}
-- | A monadic standard logger powered by fast-logger underneath. -- | A monadic standard logger powered by fast-logger underneath.
data MonadicStdLogger payload m = data MonadicStdLogger payload m =
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment