docker 위에 올라간 nodejs + express 의 한국시간으로 로그남기는 방법입니다.
로그파일은 logs 라는 디렉토리가 생성되면서 자동으로 해당날짜 파일이 생성됨니다.
설치가 필요한 모듈
npm install express
npm install winston winston-daily-rotate-file
npm install moment-timezone
1. config 디렉토리 만들기
2. winston.js 파일 만들고 "첨부1." 내용 붙여넣기
3. 로그를 기록한 파일에서 "첨부2." 처럼 로그 기능 추가하고 "결과1" 확인
4. "첨부 3"과 "첨부 4" 만들고 docker build ("첨부5") ==> docker image로 build 시킨후 도커에서 실행할 예정
5. docker 실행 ( "첨부6")
6. 로그 확인 ("결과2")
==============================디렉토리 구조 ===============================
==============================디렉토리 구조 ===============================
===============================첨부1.===================================
winston.js 에 추가
const winston = require('winston')
const winstonDaily = require('winston-daily-rotate-file')
const logDir = 'logs'; // logs 디렉토리 하위에 로그 파일 저장
const { combine, timestamp, printf } = winston.format;
// const koreaTime = format((info) => { // NOTE: 한국 시간으로 하기 위해.. 설정을 안 할 시 에는 UTC 0이 default다.
// info.timestamp = date.format();
// return info;
// });
// Define log format
const logFormat = printf(info => {
let mt = require('moment-timezone');
let date = mt().tz('Asia/Seoul'); // NOTE: 날짜는 한국 시간으로 하고 싶다.
return `${date.format()} ${info.level}: ${info.message}`;
});
/*
* Log Level
* error: 0, warn: 1, info: 2, http: 3, verbose: 4, debug: 5, silly: 6
*/
const logger = winston.createLogger({
format: combine(
timestamp({
format: 'YYYY-MM-DD HH:mm:ss',
}),
logFormat,
),
transports: [
// info 레벨 로그를 저장할 파일 설정
new winstonDaily({
level: 'info',
datePattern: 'YYYY-MM-DD',
dirname: logDir+'/info',
filename: `%DATE%.log`,
maxSize: "20m",
maxFiles: 30, // 30일치 로그 파일 저장
zippedArchive: true,
}),
// error 레벨 로그를 저장할 파일 설정
new winstonDaily({
level: 'error',
datePattern: 'YYYY-MM-DD',
dirname: logDir + '/error', // error.log 파일은 /logs/error 하위에 저장
filename: `%DATE%.error.log`,
maxSize: "20m",
maxFiles: 30,
zippedArchive: true,
}),
],
});
// Production 환경이 아닌 경우(dev 등)
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({
format: winston.format.combine(
winston.format.colorize(), // 색깔 넣어서 출력
winston.format.simple(), // `${info.level}: ${info.message} JSON.stringify({ ...rest })` 포맷으로 출력
)
}));
}
module.exports = logger
===============================첨부1.==================================
===============================첨부2.==================================
app.js 에 추가
const express = require("express");
const app = express();
const port = 3000;
var logger = require('./config/winston');
app.get("/", (req, res) => {
//응답 콜백 함수
//"Hello World"를 보내 화면에 출력한다.
res.send("Hello World!");
});
//middleware
//port에 접속 성공하면 콜백 함수를 실행시킨다.
app.listen(port, () => {
logger.info(`Example app listening at http://localhost:${port}`)
console.log(`Example app listening at http://localhost:${port}`);
});
===============================첨부2.==================================
===============================결과1 ==================================
===============================결과1 ==================================
===============================첨부3.==================================
Dockerfile 만들기
From node:12.18.1-alpine as build1
# make the 'app' folder the current working directory
WORKDIR /app
# copy both 'package.json' and 'package-lock.json' (if available)
COPY package*.json ./
# install project dependencies leaving out dev dependencies
RUN npm install express
RUN npm install winston winston-daily-rotate-file
RUN npm install moment-timezone
# copy project files and folders to the current working directory (i.e. 'app' folder)
COPY . .
EXPOSE 3000
CMD [ "node", "app.js"]
===============================첨부3.==================================
===============================첨부4.==================================
node_modules
package-lock.json
logs
===============================첨부4.==================================
===============================첨부5.==================================
이후 도커 이미지로 만들기
docker build -f .\Dockerfile -t test .
===============================첨부5.==================================
===============================첨부6.==================================
docker volume 경로 : \\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes
===============================첨부6.==================================
===============================결과2.==================================
===============================결과2.==================================