Skip to content

Commit e86b617

Browse files
committed
Log texlab events to dedicated file and handle exited processes
1 parent cd7135d commit e86b617

3 files changed

Lines changed: 62 additions & 7 deletions

File tree

‎services/web/app/src/Features/Texlab/TexlabController.mjs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import SessionManager from '../Authentication/SessionManager.mjs'
2-
import logger from '@overleaf/logger'
32
import TexlabManager from './TexlabManager.mjs'
3+
import texlabLogger from './TexlabLogger.mjs'
44

55
async function complete(req, res) {
66
const userId = SessionManager.getLoggedInUserId(req.session)
@@ -20,7 +20,7 @@ async function complete(req, res) {
2020
})
2121
res.json({ items: result.items || [] })
2222
} catch (err) {
23-
logger.error({ err, userId, projectId }, '[Texlab] completion failed')
23+
texlabLogger.error({ err, userId, projectId }, '[Texlab] completion failed')
2424
res.status(500).json({ error: 'texlab completion failed' })
2525
}
2626
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import fs from 'node:fs'
2+
import path from 'node:path'
3+
import logger from '@overleaf/logger'
4+
5+
const TEXLAB_LOG_PATH =
6+
process.env.TEXLAB_LOG_PATH ||
7+
path.join(process.cwd(), 'logs', 'texlab.log')
8+
9+
let texlabStream = null
10+
try {
11+
fs.mkdirSync(path.dirname(TEXLAB_LOG_PATH), { recursive: true })
12+
texlabStream = fs.createWriteStream(TEXLAB_LOG_PATH, { flags: 'a' })
13+
} catch (err) {
14+
logger.warn({ err, TEXLAB_LOG_PATH }, '[Texlab] failed to open log file')
15+
}
16+
17+
const levels = ['debug', 'info', 'warn', 'error']
18+
19+
function toEntry(attributes, message) {
20+
const base =
21+
typeof attributes === 'string'
22+
? { msg: attributes }
23+
: attributes || {}
24+
if (message) {
25+
return { ...base, msg: message }
26+
}
27+
return base
28+
}
29+
30+
function write(level, attributes, message, ...args) {
31+
const entry = toEntry(attributes, message)
32+
const payload = {
33+
...entry,
34+
level,
35+
time: new Date().toISOString(),
36+
}
37+
38+
// keep existing web logs
39+
if (typeof logger[level] === 'function') {
40+
logger[level](attributes, message, ...args)
41+
}
42+
43+
// append to dedicated texlab log file
44+
if (texlabStream) {
45+
texlabStream.write(JSON.stringify(payload) + '\n')
46+
}
47+
}
48+
49+
const texlabLogger = {}
50+
for (const level of levels) {
51+
texlabLogger[level] = (attributes, message, ...args) =>
52+
write(level, attributes, message, ...args)
53+
}
54+
55+
export default texlabLogger

‎services/web/app/src/Features/Texlab/TexlabManager.mjs‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { spawn } from 'node:child_process'
22
import { TextDecoder } from 'node:util'
3-
import logger from '@overleaf/logger'
3+
import texlabLogger from './TexlabLogger.mjs'
44

55
const decoder = new TextDecoder()
66
const TEXLAB_PATH = process.env.TEXLAB_PATH || 'texlab'
@@ -48,7 +48,7 @@ class TexlabProcess {
4848
this.tryParse()
4949
})
5050
this.child.stderr.on('data', data => {
51-
logger.debug({ err: decoder.decode(data) }, '[Texlab] stderr')
51+
texlabLogger.debug({ err: decoder.decode(data) }, '[Texlab] stderr')
5252
})
5353
this.child.on('error', err => {
5454
this.exited = true
@@ -59,7 +59,7 @@ class TexlabProcess {
5959
})
6060
this.child.on('exit', code => {
6161
this.exited = true
62-
logger.debug({ code }, '[Texlab] texlab exit')
62+
texlabLogger.debug({ code }, '[Texlab] texlab exit')
6363
for (const [, { reject }] of this.pending) {
6464
reject(new Error('texlab exited'))
6565
}
@@ -86,7 +86,7 @@ class TexlabProcess {
8686
const json = JSON.parse(body)
8787
this.handleResponse(json)
8888
} catch (err) {
89-
logger.warn({ err }, '[Texlab] Failed to parse response')
89+
texlabLogger.warn({ err }, '[Texlab] Failed to parse response')
9090
}
9191
}
9292
}
@@ -222,7 +222,7 @@ class TexlabProcess {
222222
try {
223223
this.child.kill()
224224
} catch (err) {
225-
logger.warn({ err }, '[Texlab] dispose error')
225+
texlabLogger.warn({ err }, '[Texlab] dispose error')
226226
}
227227
for (const [, { reject }] of this.pending) {
228228
reject(new Error('texlab disposed'))

0 commit comments

Comments
 (0)