@@ -8,11 +8,12 @@ module Kore.Log (
8
8
koreLogFilters ,
9
9
koreLogTransformer ,
10
10
withLogger ,
11
- withLogger1 ,
11
+ withLoggerLegacy ,
12
12
emptyLogger ,
13
13
stderrLogger ,
14
14
swappableLogger ,
15
15
makeKoreLogger ,
16
+ makeKoreLoggerLegacy ,
16
17
Colog. logTextStderr ,
17
18
Colog. logTextHandle ,
18
19
runKoreLog ,
@@ -90,43 +91,41 @@ data WithTimestamp = WithTimestamp SomeEntry TimeSpec
90
91
{- | Generates an appropriate logger for the given 'KoreLogOptions'. It uses
91
92
the CPS style because some outputters require cleanup (e.g. files).
92
93
-}
93
- withLogger ::
94
+ withLoggerLegacy ::
94
95
FilePath ->
95
96
KoreLogOptions ->
96
97
(LogAction IO SomeEntry -> IO a ) ->
97
98
IO a
98
- withLogger reportDirectory koreLogOptions = runContT $ do
99
- mainLogger <- ContT $ withMainLogger reportDirectory koreLogOptions
99
+ withLoggerLegacy reportDirectory koreLogOptions = runContT $ do
100
+ mainLogger <- ContT $ withMainLoggerLegacy reportDirectory koreLogOptions
100
101
let KoreLogOptions {exeName, debugSolverOptions} = koreLogOptions
101
102
smtSolverLogger <- ContT $ withSmtSolverLogger exeName debugSolverOptions
102
103
traceLogger <- ContT $ withRewriteTraceLogger koreLogOptions
103
104
let KoreLogOptions {logSQLiteOptions} = koreLogOptions
104
105
logSQLite <- ContT $ withLogSQLite logSQLiteOptions
105
106
return $ mainLogger <> smtSolverLogger <> traceLogger <> logSQLite
106
107
107
- {- | Generates an appropriate logger for the given 'KoreLogOptions'. It uses
108
- the CPS style because some outputters require cleanup (e.g. files).
108
+ {- | Like 'withLoggerLegacy', but modified for the needs for 'kore-rpc-booster':
109
+ * optional JSON logging
110
+ * no bug report
111
+ * no SQL logging
109
112
-}
110
- withLogger1 ::
111
- FilePath ->
113
+ withLogger ::
112
114
KoreLogOptions ->
113
115
(LogAction IO SomeEntry -> IO a ) ->
114
116
IO a
115
- withLogger1 reportDirectory koreLogOptions = runContT $ do
116
- mainLogger <- ContT $ withMainLogger1 reportDirectory koreLogOptions
117
+ withLogger koreLogOptions = runContT $ do
118
+ mainLogger <- ContT $ withMainLogger koreLogOptions
117
119
let KoreLogOptions {exeName, debugSolverOptions} = koreLogOptions
118
120
smtSolverLogger <- ContT $ withSmtSolverLogger exeName debugSolverOptions
119
- traceLogger <- ContT $ withRewriteTraceLogger koreLogOptions
120
- let KoreLogOptions {logSQLiteOptions} = koreLogOptions
121
- logSQLite <- ContT $ withLogSQLite logSQLiteOptions
122
- return $ mainLogger <> smtSolverLogger <> traceLogger <> logSQLite
121
+ return $ mainLogger <> smtSolverLogger
123
122
124
- withMainLogger ::
123
+ withMainLoggerLegacy ::
125
124
FilePath ->
126
125
KoreLogOptions ->
127
126
(LogAction IO SomeEntry -> IO a ) ->
128
127
IO a
129
- withMainLogger reportDirectory koreLogOptions = runContT $ do
128
+ withMainLoggerLegacy reportDirectory koreLogOptions = runContT $ do
130
129
let KoreLogOptions {exeName, startTime} = koreLogOptions
131
130
bugReportLogFile = reportDirectory </> getExeName exeName <.> " log"
132
131
bugReportLogAction <- ContT $ Colog. withLogTextFile bugReportLogFile
@@ -140,17 +139,16 @@ withMainLogger reportDirectory koreLogOptions = runContT $ do
140
139
KoreLogOptions {logFormat} = koreLogOptions
141
140
logAction =
142
141
userLogAction <> bugReportLogAction
143
- & makeKoreLogger exeName startTime timestampsSwitch logFormat
142
+ & makeKoreLoggerLegacy exeName startTime timestampsSwitch logFormat
144
143
& koreLogFilters koreLogOptions
145
144
& koreLogTransformer koreLogOptions
146
145
pure logAction
147
146
148
- withMainLogger1 ::
149
- FilePath ->
147
+ withMainLogger ::
150
148
KoreLogOptions ->
151
149
(LogAction IO SomeEntry -> IO a ) ->
152
150
IO a
153
- withMainLogger1 _reportDirectory koreLogOptions = runContT $ do
151
+ withMainLogger koreLogOptions = runContT $ do
154
152
let KoreLogOptions {exeName} = koreLogOptions
155
153
(entryFilter, standardLogAction, jsonLogAction) <-
156
154
case logType koreLogOptions of
@@ -161,10 +159,12 @@ withMainLogger1 _reportDirectory koreLogOptions = runContT $ do
161
159
, jsonLogAction ldata
162
160
)
163
161
LogStdErr -> pure (const False , Colog. logTextStderr, Colog. logTextStderr)
164
- LogFileText _logFile -> pure (const False , Colog. logTextStderr, Colog. logTextStderr) -- Not sure what to put here
162
+ LogFileText logFile -> do
163
+ action <- lift (checkLogFilePath exeName " " logFile) >>= ContT . Colog. withLogTextFile
164
+ pure (const False , action, action)
165
165
let KoreLogOptions {logFormat} = koreLogOptions
166
166
logAction =
167
- makeKoreLogger1
167
+ makeKoreLogger
168
168
exeName
169
169
logFormat
170
170
entryFilter
@@ -288,56 +288,51 @@ filterSeverity level entry =
288
288
-- | Run a 'LoggerT' with the given options.
289
289
runKoreLog :: FilePath -> KoreLogOptions -> LoggerT IO a -> IO a
290
290
runKoreLog reportDirectory options loggerT =
291
- withLogger reportDirectory options $ runLoggerT loggerT
291
+ withLoggerLegacy reportDirectory options $ runLoggerT loggerT
292
292
293
293
-- | Run a 'LoggerT' with the given options, using `swappableLogger` to make it thread safe.
294
294
runKoreLogThreadSafe :: FilePath -> KoreLogOptions -> LoggerT IO a -> IO a
295
295
runKoreLogThreadSafe reportDirectory options loggerT =
296
- withLogger reportDirectory options $ \ actualLogAction -> do
296
+ withLoggerLegacy reportDirectory options $ \ actualLogAction -> do
297
297
mvarLogAction <- newMVar actualLogAction
298
298
let swapLogAction = swappableLogger mvarLogAction
299
299
runLoggerT loggerT swapLogAction
300
300
301
- {- | The logger that redirects some of the items to a file
302
- TODO: needs better description
301
+ {- | The default Kore logger used by the legacy backend.
302
+
303
+ Creates a kore logger which:
304
+ * adds timestamps
305
+ * formats messages: "<exe-name>: [<timestamp>] <severity> (<entry-type>): <message>"
303
306
-}
304
- makeKoreLogger1 ::
307
+ makeKoreLoggerLegacy ::
305
308
forall io .
306
309
MonadIO io =>
307
310
ExeName ->
311
+ TimeSpec ->
312
+ TimestampsSwitch ->
308
313
KoreLogFormat ->
309
- (Text -> Bool ) ->
310
- LogAction io Text ->
311
314
LogAction io Text ->
312
315
LogAction io SomeEntry
313
- makeKoreLogger1 exeName koreLogFormat entryFilter prettyLogAction jsonLogAction =
314
- let actionForJsonLogs =
315
- jsonLogAction
316
- & Colog. cmap renderJson
317
- & Colog. cfilter (entryFilter . entryTypeText)
318
- actionForPrettyLogs =
319
- prettyLogAction
320
- & Colog. cmap render
321
- & Colog. cfilter (not . entryFilter . entryTypeText)
322
- in actionForJsonLogs <> actionForPrettyLogs
316
+ makeKoreLoggerLegacy exeName startTime timestampSwitch koreLogFormat logActionText =
317
+ logActionText
318
+ & contramap render
319
+ & Colog. cmapM withTimestamp
323
320
where
324
- renderJson :: SomeEntry -> Text
325
- renderJson (SomeEntry _context actualEntry) =
326
- LazyText. toStrict . JSON. encodeToLazyText . addOriginField $ oneLineJson actualEntry
327
- where
328
- addOriginField :: JSON. Value -> JSON. Value
329
- addOriginField = \ case
330
- (JSON. Object xs) -> JSON. Object $ JSON. insert (JSON. fromText " origin" ) (JSON. toJSON KoreRpc ) xs
331
- xs -> xs
332
-
333
- render :: SomeEntry -> Text
334
- render entry =
335
- prettyActualEntry entry
321
+ render :: WithTimestamp -> Text
322
+ render (WithTimestamp entry entryTime) =
323
+ prettyActualEntry timestamp entry
336
324
& Pretty. layoutPretty Pretty. defaultLayoutOptions
337
325
& Pretty. renderText
338
-
326
+ where
327
+ timestamp =
328
+ case timestampSwitch of
329
+ TimestampsDisable -> Nothing
330
+ TimestampsEnable ->
331
+ Just . Pretty. brackets . Pretty. pretty $
332
+ toMicroSecs (diffTimeSpec startTime entryTime)
333
+ toMicroSecs = (`div` 1000 ) . toNanoSecs
339
334
exeName' = Pretty. pretty exeName <> Pretty. colon
340
- prettyActualEntry entry@ (SomeEntry entryContext actualEntry)
335
+ prettyActualEntry timestamp entry@ (SomeEntry entryContext actualEntry)
341
336
| OneLine <- koreLogFormat =
342
337
Pretty. hsep [header, oneLineDoc actualEntry]
343
338
| otherwise =
@@ -350,6 +345,7 @@ makeKoreLogger1 exeName koreLogFormat entryFilter prettyLogAction jsonLogAction
350
345
header =
351
346
(Pretty. hsep . catMaybes)
352
347
[ Just exeName'
348
+ , timestamp
353
349
, Just severity'
354
350
, Just (Pretty. parens $ type' entry)
355
351
]
@@ -378,41 +374,44 @@ makeKoreLogger1 exeName koreLogFormat entryFilter prettyLogAction jsonLogAction
378
374
379
375
indent = Pretty. indent 4
380
376
381
- {- | The default Kore logger.
382
-
383
- Creates a kore logger which:
384
- * adds timestamps
385
- * formats messages: "<exe-name>: [<timestamp>] <severity> (<entry-type>): <message>"
386
- -}
377
+ -- | The logger used by 'kore-rpc-booster' and 'kore-rpc-dev'
387
378
makeKoreLogger ::
388
379
forall io .
389
380
MonadIO io =>
390
381
ExeName ->
391
- TimeSpec ->
392
- TimestampsSwitch ->
393
382
KoreLogFormat ->
383
+ (Text -> Bool ) ->
384
+ LogAction io Text ->
394
385
LogAction io Text ->
395
386
LogAction io SomeEntry
396
- makeKoreLogger exeName startTime timestampSwitch koreLogFormat logActionText =
397
- logActionText
398
- & contramap render
399
- & Colog. cmapM withTimestamp
387
+ makeKoreLogger exeName koreLogFormat entryFilter prettyLogAction jsonLogAction =
388
+ let actionForJsonLogs =
389
+ jsonLogAction
390
+ & Colog. cmap renderJson
391
+ & Colog. cfilter (entryFilter . entryTypeText)
392
+ actionForPrettyLogs =
393
+ prettyLogAction
394
+ & Colog. cmap render
395
+ & Colog. cfilter (not . entryFilter . entryTypeText)
396
+ in actionForJsonLogs <> actionForPrettyLogs
400
397
where
401
- render :: WithTimestamp -> Text
402
- render (WithTimestamp entry entryTime) =
403
- prettyActualEntry timestamp entry
398
+ renderJson :: SomeEntry -> Text
399
+ renderJson (SomeEntry _context actualEntry) =
400
+ LazyText. toStrict . JSON. encodeToLazyText . addOriginField $ oneLineJson actualEntry
401
+ where
402
+ addOriginField :: JSON. Value -> JSON. Value
403
+ addOriginField = \ case
404
+ (JSON. Object xs) -> JSON. Object $ JSON. insert (JSON. fromText " origin" ) (JSON. toJSON KoreRpc ) xs
405
+ xs -> xs
406
+
407
+ render :: SomeEntry -> Text
408
+ render entry =
409
+ prettyActualEntry entry
404
410
& Pretty. layoutPretty Pretty. defaultLayoutOptions
405
411
& Pretty. renderText
406
- where
407
- timestamp =
408
- case timestampSwitch of
409
- TimestampsDisable -> Nothing
410
- TimestampsEnable ->
411
- Just . Pretty. brackets . Pretty. pretty $
412
- toMicroSecs (diffTimeSpec startTime entryTime)
413
- toMicroSecs = (`div` 1000 ) . toNanoSecs
412
+
414
413
exeName' = Pretty. pretty exeName <> Pretty. colon
415
- prettyActualEntry timestamp entry@ (SomeEntry entryContext actualEntry)
414
+ prettyActualEntry entry@ (SomeEntry entryContext actualEntry)
416
415
| OneLine <- koreLogFormat =
417
416
Pretty. hsep [header, oneLineDoc actualEntry]
418
417
| otherwise =
@@ -425,7 +424,6 @@ makeKoreLogger exeName startTime timestampSwitch koreLogFormat logActionText =
425
424
header =
426
425
(Pretty. hsep . catMaybes)
427
426
[ Just exeName'
428
- , timestamp
429
427
, Just severity'
430
428
, Just (Pretty. parens $ type' entry)
431
429
]
@@ -471,7 +469,7 @@ stderrLogger ::
471
469
KoreLogFormat ->
472
470
LogAction io SomeEntry
473
471
stderrLogger exeName startTime timestampsSwitch logFormat =
474
- makeKoreLogger exeName startTime timestampsSwitch logFormat Colog. logTextStderr
472
+ makeKoreLoggerLegacy exeName startTime timestampsSwitch logFormat Colog. logTextStderr
475
473
476
474
{- | @swappableLogger@ delegates to the logger contained in the 'MVar'.
477
475
0 commit comments