Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
haskell-gargantext
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
159
Issues
159
List
Board
Labels
Milestones
Merge Requests
9
Merge Requests
9
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
gargantext
haskell-gargantext
Commits
54089902
Verified
Commit
54089902
authored
May 08, 2025
by
Przemyslaw Kaminski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[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
Changes
4
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
96 additions
and
81 deletions
+96
-81
Server.hs
bin/gargantext-cli/CLI/Server.hs
+16
-14
Worker.hs
bin/gargantext-cli/CLI/Worker.hs
+48
-61
Env.hs
src/Gargantext/Core/Worker/Env.hs
+16
-5
Loggers.hs
src/Gargantext/System/Logging/Loggers.hs
+16
-1
No files found.
bin/gargantext-cli/CLI/Server.hs
View file @
54089902
...
...
@@ -24,7 +24,7 @@ import GHC.IO.Encoding (setLocaleEncoding, utf8)
import
Gargantext.API
(
startGargantext
)
import
Gargantext.API.Admin.EnvTypes
(
Mode
(
..
))
import
Gargantext.Core.Config
import
Gargantext.Core.Config.Types
(
_SettingsFile
)
--
import Gargantext.Core.Config.Types (_SettingsFile)
import
Gargantext.Core.Config.Utils
(
readConfig
)
import
Gargantext.Prelude
import
Gargantext.System.Logging
...
...
@@ -39,25 +39,26 @@ withServerCLILogger ServerArgs{..} f = do
withLogger
(
cfg
^.
gc_logging
)
$
\
logger
->
f
logger
serverCLI
::
CLIServer
->
IO
()
serverCLI
(
CLIS_start
serverArgs
)
=
withServerCLILogger
serverArgs
$
\
ioLogger
->
startServerCLI
ioLogger
serverArgs
serverCLI
(
CLIS_start
serverArgs
)
=
startServerCLI
serverArgs
serverCLI
(
CLIS_startAll
serverArgs
@
(
ServerArgs
{
..
}))
=
withServerCLILogger
serverArgs
$
\
ioLogger
->
do
withAsync
(
startServerCLI
ioLogger
serverArgs
)
$
\
aServer
->
do
res
<-
Async
.
race
(
runAllWorkers
ioLogger
server_toml
)
(
waitCatch
aServer
)
serverCLI
(
CLIS_startAll
serverArgs
@
(
ServerArgs
{
..
}))
=
do
withAsync
(
startServerCLI
serverArgs
)
$
\
aServer
->
do
res
<-
Async
.
race
(
runAllWorkers
server_toml
)
(
waitCatch
aServer
)
case
res
of
Left
()
->
pure
()
Right
(
Left
ex
)
->
do
$
(
logLoc
)
ioLogger
ERROR
$
"Exception raised when running the server:
\n\n
"
<>
T
.
pack
(
displayException
ex
)
exitFailure
panicTrace
$
"Exception raised when running the server:
\n\n
"
<>
T
.
pack
(
displayException
ex
)
--
exitFailure
Right
(
Right
()
)
->
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.
setLocaleEncoding
utf8
logMsg
ioLogger
INFO
$
"Version: "
<>
showVersion
PG
.
version
where
dummyLogConfig
=
LogConfig
{
_lc_log_file
=
Nothing
,
_lc_log_level
=
DEBUG
}
serverCmd
::
HasCallStack
=>
Mod
CommandFields
CLI
...
...
@@ -104,14 +105,15 @@ version_p :: Parser CLIServer
version_p
=
pure
CLIS_version
startServerCLI
::
Logger
IO
->
ServerArgs
->
IO
()
startServerCLI
ioLogger
(
ServerArgs
{
..
})
=
do
logMsg
ioLogger
INFO
$
"starting server, mode: "
<>
show
server_mode
<>
", port: "
<>
show
server_port
<>
", config: "
<>
_SettingsFile
server_toml
startServerCLI
::
ServerArgs
->
IO
()
startServerCLI
(
ServerArgs
{
..
})
=
do
--
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.
setLocaleEncoding
utf8
when
(
server_mode
==
Mock
)
$
do
logMsg
ioLogger
ERROR
"Mock mode not supported!"
exitFailure
-- logMsg ioLogger ERROR "Mock mode not supported!"
panicTrace
"Mock mode not supported!"
-- exitFailure
startGargantext
server_mode
server_port
server_toml
bin/gargantext-cli/CLI/Worker.hs
View file @
54089902
...
...
@@ -17,20 +17,18 @@ import Async.Worker.Types qualified as W
import
CLI.Types
import
CLI.Parsers
import
Control.Concurrent.Async
(
forConcurrently_
)
import
Data.List
qualified
as
List
(
cycle
,
concat
,
take
)
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.Utils
(
readConfig
)
import
Gargantext.Core.Config.Worker
(
WorkerDefinition
(
..
),
WorkerSettings
(
..
),
findDefinitionByName
)
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.Types (Job(Ping))
import
Gargantext.Prelude
import
Gargantext.System.Logging
(
withLogger
,
logMsg
,
LogLevel
(
..
),
Logger
)
import
Gargantext.System.Logging
(
logM
,
LogLevel
(
..
)
)
import
Options.Applicative
import
Prelude
qualified
-- TODO Command to monitor queues
...
...
@@ -38,60 +36,48 @@ import Prelude qualified
workerCLI
::
CLIWorker
->
IO
()
workerCLI
(
CLIW_run
(
WorkerArgs
{
..
}))
=
do
let
___
=
putStrLn
((
List
.
concat
$
List
.
take
72
$
List
.
cycle
[
"_"
])
::
Prelude
.
String
)
withWorkerEnv
worker_toml
$
\
env
->
do
let
log_cfg
=
env
^.
hasConfig
.
gc_logging
withLogger
log_cfg
$
\
ioLogger
->
do
___
logMsg
ioLogger
INFO
"GarganText worker"
logMsg
ioLogger
INFO
$
"worker_name: "
<>
T
.
unpack
worker_name
logMsg
ioLogger
INFO
$
"worker toml: "
<>
_SettingsFile
worker_toml
___
let
ws
=
env
^.
hasConfig
.
gc_worker
case
findDefinitionByName
ws
worker_name
of
Nothing
->
do
let
workerNames
=
_wdName
<$>
(
_wsDefinitions
ws
)
let
availableWorkers
=
T
.
intercalate
", "
workerNames
putText
$
"Worker definition not found! Available workers: "
<>
availableWorkers
Just
wd
->
do
logMsg
ioLogger
INFO
$
"Starting worker '"
<>
T
.
unpack
worker_name
<>
"'"
logMsg
ioLogger
DEBUG
$
"gc config: "
<>
show
(
env
^.
hasConfig
)
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
cfg
<-
readConfig
worker_toml
let
ws
=
cfg
^.
gc_worker
case
findDefinitionByName
ws
worker_name
of
Nothing
->
do
let
workerNames
=
_wdName
<$>
(
_wsDefinitions
ws
)
let
availableWorkers
=
T
.
intercalate
", "
workerNames
panicTrace
$
"Worker definition not found! Available workers: "
<>
availableWorkers
Just
wd
->
do
withWorkerEnv
worker_toml
(
T
.
unpack
worker_name
)
$
\
env
->
do
runWorkerMonad
env
$
do
logM
INFO
$
"Starting worker '"
<>
worker_name
<>
"'"
logM
DEBUG
$
"gc config: "
<>
show
(
env
^.
hasConfig
)
logM
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
{
..
}))
=
do
runAllWorkers
worker_toml
workerCLI
(
CLIW_stats
(
WorkerStatsArgs
{
..
}))
=
do
putStrLn
(
"worker toml: "
<>
_SettingsFile
ws_toml
)
withWorkerEnv
ws_toml
$
\
env
->
do
let
ws
=
env
^.
hasConfig
.
gc_worker
mapM_
(
\
wd
->
do
state'
<-
initWorkerState
env
wd
let
b
=
W
.
broker
state'
let
q
=
W
.
queueName
state'
qs
<-
BT
.
getQueueSize
b
q
msgIds
<-
BT
.
listPendingMessageIds
b
q
putStrLn
(
"Queue: "
<>
show
q
<>
", size: "
<>
show
qs
::
Text
)
putStrLn
(
" Messages: "
::
Text
)
mapM_
(
\
msgId
->
do
mm
<-
BT
.
getMessageById
b
q
msgId
cfg
<-
readConfig
ws_toml
let
ws
=
cfg
^.
gc_worker
mapM_
(
\
wd
->
withWorkerEnv
ws_toml
(
T
.
unpack
$
_wdName
wd
)
$
\
env
->
do
state'
<-
initWorkerState
env
wd
let
b
=
W
.
broker
state'
let
q
=
W
.
queueName
state'
qs
<-
BT
.
getQueueSize
b
q
msgIds
<-
BT
.
listPendingMessageIds
b
q
runWorkerMonad
env
$
do
logM
INFO
$
(
"Queue: "
<>
show
q
<>
", size: "
<>
show
qs
::
Text
)
logM
INFO
$
(
" Messages: "
::
Text
)
mapM_
(
\
msgId
->
do
mm
<-
BT
.
getMessageById
b
q
msgId
runWorkerMonad
env
$
do
case
mm
of
Nothing
->
putStrLn
(
" - "
<>
show
msgId
<>
" :: NOTHING!"
::
Text
)
Just
m
->
putStrLn
(
" - "
<>
show
m
::
Text
)
)
msgIds
)
(
_wsDefinitions
ws
)
Nothing
->
logM
ERROR
(
" - "
<>
show
msgId
<>
" :: NOTHING!"
::
Text
)
Just
m
->
logM
INFO
(
" - "
<>
show
m
::
Text
)
)
msgIds
)
(
_wsDefinitions
ws
)
workerCmd
::
HasCallStack
=>
Mod
CommandFields
CLI
...
...
@@ -135,12 +121,13 @@ stats_p = fmap CLIW_stats $ WorkerStatsArgs
-- 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
-- function from async).
runAllWorkers
::
Logger
IO
->
SettingsFile
->
IO
()
runAllWorkers
ioLogger
worker_toml
=
do
runAllWorkers
::
SettingsFile
->
IO
()
runAllWorkers
worker_toml
=
do
cfg
<-
readConfig
worker_toml
let
ws
=
cfg
^.
gc_worker
forConcurrently_
(
_wsDefinitions
ws
)
$
\
wd
->
do
withWorkerEnv
worker_toml
$
\
env
->
do
logMsg
ioLogger
INFO
$
"Starting worker '"
<>
T
.
unpack
(
_wdName
wd
)
<>
"' (queue "
<>
show
(
_wdQueue
wd
)
<>
")"
withWorkerEnv
worker_toml
(
T
.
unpack
$
_wdName
wd
)
$
\
env
->
do
runWorkerMonad
env
$
do
logM
INFO
$
"Starting worker '"
<>
_wdName
wd
<>
"' (queue "
<>
show
(
_wdQueue
wd
)
<>
")"
withPGMQWorkerCtrlC
env
wd
$
\
a
_state
->
do
wait
a
src/Gargantext/Core/Worker/Env.hs
View file @
54089902
...
...
@@ -20,7 +20,7 @@ module Gargantext.Core.Worker.Env where
import
Control.Concurrent.STM.TVar
(
TVar
,
modifyTVar
,
newTVarIO
,
readTVarIO
)
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.Monad.Trans.Control
(
MonadBaseControl
)
import
Data.Maybe
(
fromJust
)
...
...
@@ -31,7 +31,7 @@ import Gargantext.API.Job (RemainingSteps(..), jobLogStart, jobLogProgress, jobL
import
Gargantext.API.Prelude
(
GargM
)
import
Gargantext.Core.Notifications.CentralExchange
qualified
as
CE
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.Utils
(
readConfig
)
import
Gargantext.Core.Config.Types
(
SettingsFile
(
..
))
...
...
@@ -48,6 +48,7 @@ import Gargantext.System.Logging (HasLogger(..), Logger, LogLevel(..), MonadLogg
import
Gargantext.Utils.Jobs.Monad
(
MonadJobStatus
(
..
),
JobHandle
)
import
GHC.IO.Exception
(
IOException
(
..
),
IOErrorType
(
OtherError
))
import
Prelude
qualified
import
System.FilePath
((
</>
),
takeDirectory
,
takeFileName
,
takeBaseName
,
takeExtension
)
import
System.Log.FastLogger
qualified
as
FL
import
Gargantext.System.Logging.Loggers
...
...
@@ -69,10 +70,20 @@ data WorkerJobState = WorkerJobState
deriving
(
Show
,
Eq
)
withWorkerEnv
::
SettingsFile
->
(
WorkerEnv
->
IO
a
)
->
IO
a
withWorkerEnv
settingsFile
k
=
do
withWorkerEnv
::
SettingsFile
->
Prelude
.
String
->
(
WorkerEnv
->
IO
a
)
->
IO
a
withWorkerEnv
settingsFile
workerName
k
=
do
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
k
env
-- `finally` cleanEnv env
...
...
src/Gargantext/System/Logging/Loggers.hs
View file @
54089902
...
...
@@ -33,7 +33,7 @@ data IOStdLogger =
}
ioStdLogger
::
LogConfig
->
IO
IOStdLogger
ioStdLogger
LogConfig
{
..
}
=
do
ioStdLogger
LogConfig
{
_lc_log_file
=
Nothing
,
_lc_log_level
}
=
do
let
minLvl
=
_lc_log_level
let
log_msg
lvl
msg
=
do
t
<-
getCurrentTime
...
...
@@ -46,6 +46,21 @@ ioStdLogger LogConfig{..} = do
,
_iosl_log_msg
=
log_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.
data
MonadicStdLogger
payload
m
=
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment