winston-daily-rotate-file 라이브러리
https://www.npmjs.com/package/winston-daily-rotate-file/v/4.7.1?activeTab=readme
로그, 로그파일을 일정주기나 시간에 따라 최대크기, 파일 등등 설정하여 관리할 수 있게 해주는 라이브러리 입니다.
일렉트론과 리액트 환경에서 일렉트론 -> Main, Renderer 프로세스
즉, Main 에도 이 라이브러리로 로그를 관리하도록 하고 Renderer 프로세스 에도 로그를 관리하도록 하면,
https://github.com/winstonjs/winston-daily-rotate-file/issues/359
여기와 같은 이슈인 audit.json 파일이 관리하는 로그 파일들이 수시로 바뀌면서 유지가 안되는 현상이 생깁니다.
거기에 파일이 갑자기 권한이 없어서 열리지 않거나, 존재하지 않다고 나오는 현상이 생깁니다.
이건 이 이슈 페이지에 답변처럼
동일한 로그 파일에 여러 노드 프로세스가 읽고 쓰기를 시도하는 동안 파일 삭제가 이뤄지고 있기 때문입니다.
그러니, 이 main과 renderer 가 서로 다른 프로세스로 동작하기 때문에
winston-daily-rotate-file 라이브러리
를 불러와 사용하게 되면 2개의 프로세스에서 하나의 설정으로 관리하여 회전하고 있는 것이지요.
해결 방법은 2가지 정도로 생각합니다.
1. main 에서 생성된 winston 라이브러리를 글로벌로 선언하여 renderer 에서 불러와 사용
2. 일렉트론에서 main과 renderer은 IPC 통신으로 데이터를 주고받을 수 있습니다. 그러니 IPC 통신을 통해 로그를 필요한 곳에서만 찍을 수 있게 만드는 것이지요.
방법 1
# winston_logger를 global로 전역으로 만들어줍니다
global._winston_logger = winston_logger;
# renderer에서 해당 로그를 일렉트론 전역저장소에서 불러와 사용합니다.
const winston_logger = require('electron').remote.getGlobal('_winston_logger');
방법 2
// renderer 프로세스
const { ipcRenderer } = require('electron')
// ipcRenderer.send를 통해 'test' 채널로 message를 보냅니다.
ipcRenderer.send('test', message);
// main 프로세스
const { ipcMain } = require('electron')
// ipcMain.on 으로 'test' 채널로 받은 message 즉, payload를 winston_logger로 찍습니다.
ipcMain.on('test', (evt, payload) => {
winston_logger;.info(payload);
});
IPC 통신으로 구현할 수 있는 방법은 이 방법 외에도 많이 있습니다.
https://tinydew4.github.io/electron-ko/docs/api/ipc-main/
https://tinydew4.github.io/electron-ko/docs/api/ipc-renderer/