import { expect } from 'chai'; import { rm } from 'fs/promises'; import { parseLogKV, parseLogTime, readLogFile, handleLogRow, } from '../../src/utils/log'; import { createFile } from '../../src/utils/file'; import { getTestPath, randomString } from './utils'; import { jsonString2jsonObject } from '../../src/utils/json'; describe('utils/log', () => { let filePath: string; let content: string[]; let logFileRes: string[]; beforeEach(async () => { filePath = getTestPath(`${randomString()}.log`); content = [ 'spring-boot-logger-log4j2--01-November-2020-1.log.gz:2020-11-01 00:10:50.679 level=INFO thread=http-nio-8080-exec-510 logId=b2a9c355ad074cab9e2a3e640a096ead url=/v2/minilogin - event=response spend=297 userId=- v0=0 v1="{\\"data\\":[{\\"appellation\\":null,\\"uid\\":\\"10503182857944698880\\",\\"nickname\\":\\"高静云\\",\\"type\\":3,\\"headimgurl\\":\\"https://wx.qlogo.cn/mmopen/vi_32/b8jXic3ZnIY33GZtjb9bRKAYW0CpP0m2QiaRjsOcv4hV8icQxahgT80QpfJUKZRxh7aknmNxeRKktt6uuAibFkgRVg/132\\",\\"token\\":\\"72d77ecd7bfc4636a15cc5ef12de37bf\\",\\"logtoken\\":\\"Pandora3IX-jUfsGtPfp9XErakztwcm2WmDwi2HAkZsEkq0:iuW8iXyRYuA9GMWkJ3vXelQZNXA=:eyJyZXNvdXJjZSI6Ii92Mi9yZXBvcy9tZW1vcnlfd3htaW5pL2RhdGEiLCJleHBpcmVzIjoxNjM1Njk2NjUwLCJtZXRob2QiOiJQT1NUIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwiY29udGVudE1ENSI6IiIsImhlYWRlcnMiOiIifQ==\\",\\"roles\\":[\\"104\\"],\\"processid\\":null,\\"ontrial\\":0}],\\"errcode\\":0}"', 'spring-boot-logger-log4j2--01-November-2020-1.log.gz:2020-11-01 00:10:50.679 level=INFO thread=http-nio-8080-exec-510 logId=b2a9c355ad074cab9e2a3e640a096ead url=/v2/minilogin - event=response spend=297 userId=- v0=0 v1="{\\"data\\":[{\\"appellation\\":null,\\"uid\\":\\"10503182857944698880\\",\\"nickname\\":\\"高静云\\",\\"type\\":3,\\"headimgurl\\":\\"https://wx.qlogo.cn/mmopen/vi_32/b8jXic3ZnIY33GZtjb9bRKAYW0CpP0m2QiaRjsOcv4hV8icQxahgT80QpfJUKZRxh7aknmNxeRKktt6uuAibFkgRVg/132\\",\\"token\\":\\"72d77ecd7bfc4636a15cc5ef12de37bf\\",\\"logtoken\\":\\"Pandora3IX-jUfsGtPfp9XErakztwcm2WmDwi2HAkZsEkq0:iuW8iXyRYuA9GMWkJ3vXelQZNXA=:eyJyZXNvdXJjZSI6Ii92Mi9yZXBvcy9tZW1vcnlfd3htaW5pL2RhdGEiLCJleHBpcmVzIjoxNjM1Njk2NjUwLCJtZXRob2QiOiJQT1NUIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwiY29udGVudE1ENSI6IiIsImhlYWRlcnMiOiIifQ==\\",\\"roles\\":[\\"103\\",\\"104\\"],\\"processid\\":null,\\"ontrial\\":0}],\\"errcode\\":0}"', 'spring-boot-logger-log4j2--01-November-2020-1.log.gz:2020-11-01 00:12:32.995 level=INFO thread=http-nio-8080-exec-270 logId=2459b621a1154478b891024f9a0b1155 url=/v2/minilogin - event=response spend=215 userId=- v0=0 v1=myRelations', ]; await createFile(filePath, content); logFileRes = await readLogFile(filePath); }); afterEach(() => rm(filePath)); it('能够正确读取log文件为js数组', () => { expect(logFileRes).to.deep.equals(content); }); it('能够从log数据中正确解析到时间', () => { const time = parseLogTime(logFileRes[0]); expect(time).to.be.equal('01/11/2020 00:10:50'); }); it('能够将log数据中的 K=V 正确解析成js对象', () => { const obj = parseLogKV(logFileRes[0], ['logId', 'url', 'event', 'v1']); expect(obj).to.deep.equal({ logId: 'b2a9c355ad074cab9e2a3e640a096ead', url: '/v2/minilogin', event: 'response', v1: '"{\\"data\\":[{\\"appellation\\":null,\\"uid\\":\\"10503182857944698880\\",\\"nickname\\":\\"高静云\\",\\"type\\":3,\\"headimgurl\\":\\"https://wx.qlogo.cn/mmopen/vi_32/b8jXic3ZnIY33GZtjb9bRKAYW0CpP0m2QiaRjsOcv4hV8icQxahgT80QpfJUKZRxh7aknmNxeRKktt6uuAibFkgRVg/132\\",\\"token\\":\\"72d77ecd7bfc4636a15cc5ef12de37bf\\",\\"logtoken\\":\\"Pandora3IX-jUfsGtPfp9XErakztwcm2WmDwi2HAkZsEkq0:iuW8iXyRYuA9GMWkJ3vXelQZNXA=:eyJyZXNvdXJjZSI6Ii92Mi9yZXBvcy9tZW1vcnlfd3htaW5pL2RhdGEiLCJleHBpcmVzIjoxNjM1Njk2NjUwLCJtZXRob2QiOiJQT1NUIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwiY29udGVudE1ENSI6IiIsImhlYWRlcnMiOiIifQ==\\",\\"roles\\":[\\"104\\"],\\"processid\\":null,\\"ontrial\\":0}],\\"errcode\\":0}"', }); }); it('能够将log数据中的 K:V 正确解析成js对象', () => { const obj = parseLogKV('logId:b2a9c355ad074cab9e2a3e640a096ead url:/v2/minilogin ', ['logId', 'url'], ':'); expect(obj).to.deep.equal({ logId: 'b2a9c355ad074cab9e2a3e640a096ead', url: '/v2/minilogin', }); }); it('能够解析一行log数据,并取出json中对应的字段', () => { const obj = handleLogRow(logFileRes[0], { keys: ['logId', 'event'], specialKeys: [ { key: 'v1', parseFunc: (value: string | null) => { const fullObj = jsonString2jsonObject<{data?: {uid?: string}[]}>(value); const data = fullObj?.data; let res: {uid: string| null} = { uid: null }; if (data && data.length > 0) { res = { uid: data[0].uid || null, }; } return res; }, }, ], }); expect(obj).to.deep.equal({ create_time: '01/11/2020 00:10:50', logId: 'b2a9c355ad074cab9e2a3e640a096ead', event: 'response', uid: '10503182857944698880', }); }); it('能够解析一行log数据,并序列化成csvJson', () => { const obj = handleLogRow(logFileRes[1], { keys: ['logId', 'event', 'roles'], specialKeys: [ { key: 'v1', parseFunc: (value: string | null) => { const fullObj = jsonString2jsonObject<{data?: {roles?: string[]}[]}>(value); return { roles: JSON.stringify(fullObj?.data?.[0]?.roles) || null, }; }, }, ], }); expect(obj).to.deep.equal({ create_time: '01/11/2020 00:10:50', logId: 'b2a9c355ad074cab9e2a3e640a096ead', event: 'response', roles: '["103","104"]', }); }); });