import { expect } from 'chai'; import { rm } from 'fs/promises'; import { handleLog } from '../../src/handle-log'; import { readCsvFile } from '../../src/utils/csv'; import { createFile } from '../../src/utils/file'; import { jsonString2jsonObject } from '../../src/utils/json'; import { getTestPath, randomString } from '../utils/utils'; describe('handle-log/index', () => { let inputFilePath: string; let outputFilePath: string; let content: string[]; beforeEach((done) => { const fileName = randomString(); inputFilePath = getTestPath(`${fileName}.log`); outputFilePath = getTestPath(`${fileName}.csv`); 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:12:32.995 level=INFO thread=http-nio-8080-exec-270 logId=2459b621a1154478b891024f9a0b1155 url=/v2/minilogin - event=response spend=215 userId=- v0=0 v1="{\\"data\\":[{\\"appellation\\":null,\\"uid\\":\\"10526391617291108352\\",\\"nickname\\":\\"王津\\",\\"type\\":2,\\"headimgurl\\":\\"https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTKUqGVicas2qUqLMSCmIJplZlQnWnVZElZLjGaUKZjX2QfVkI02EZGoaHss1Z3gc64mBJNz71QxNibQ/132\\",\\"token\\":\\"9b898a3591b1a7afddb58c39132ebf24\\",\\"logtoken\\":\\"Pandora3IX-jUfsGtPfp9XErakztwcm2WmDwi2HAkZsEkq0:aXr5lwcp7Vtep0edpw69_tc0JR0=:eyJyZXNvdXJjZSI6Ii92Mi9yZXBvcy9tZW1vcnlfd3htaW5pL2RhdGEiLCJleHBpcmVzIjoxNjM1Njk2NzUyLCJtZXRob2QiOiJQT1NUIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwiY29udGVudE1ENSI6IiIsImhlYWRlcnMiOiIifQ==\\",\\"roles\\":[\\"105\\"],\\"processid\\":null,\\"ontrial\\":0}],\\"errcode\\":0}"', 'spring-boot-logger-log4j2--01-November-2020-1.log.gz:2020-11-01 00:18:42.291 level=INFO thread=http-nio-8080-exec-522 logId=ffad8c575dc049d089b2e61e5c08758f url=/v2/minilogin - event=response spend=223 userId=10527893824612163585 v0=0 v1="{\\"data\\":[{\\"appellation\\":null,\\"uid\\":\\"10527893824612163585\\",\\"nickname\\":\\"郝军肖\\",\\"type\\":2,\\"headimgurl\\":\\"https://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83eo4zeftp6E41wt0CxzRFkj5UpnRD9npbhQrz1L0ed1VUR44WrHW2ZyjmHc9a22hZNkvKKeTFHNZsQ/132\\",\\"token\\":\\"ee00f4878bd5c835957cc8b77612dc88\\",\\"logtoken\\":\\"Pandora3IX-jUfsGtPfp9XErakztwcm2WmDwi2HAkZsEkq0:OBmCM1c59tLB8nXfQE1vcZZ3jIY=:eyJyZXNvdXJjZSI6Ii92Mi9yZXBvcy9tZW1vcnlfd3htaW5pL2RhdGEiLCJleHBpcmVzIjoxNjM1Njk3MTIyLCJtZXRob2QiOiJQT1NUIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwiY29udGVudE1ENSI6IiIsImhlYWRlcnMiOiIifQ==\\",\\"roles\\":[\\"105\\"],\\"processid\\":null,\\"ontrial\\":0}],\\"errcode\\":0}"', '', ]; createFile(inputFilePath, content).then(() => { done(); }); }); afterEach(async () => { await rm(inputFilePath); await rm(outputFilePath); }); it('读取log文件并输出对应的csv文件', async () => { await handleLog({ inputFilePath, outputFilePath, options: { keys: ['logId', 'url'] }, }); const res = await readCsvFile(outputFilePath); expect(res).to.deep.equals([ { logId: 'b2a9c355ad074cab9e2a3e640a096ead', url: '/v2/minilogin' }, { logId: '2459b621a1154478b891024f9a0b1155', url: '/v2/minilogin' }, { logId: 'ffad8c575dc049d089b2e61e5c08758f', url: '/v2/minilogin' }, ]); }); it('读取log文件并输出对应的csv文件 (获取json的数据)', async () => { await handleLog({ inputFilePath, outputFilePath, options: { keys: ['logId', 'url', 'v1_uid'], specialKeys: [ { key: 'v1', parseFunc: (value: string | null) => { const fullObj = jsonString2jsonObject<{data?: {uid?: string}[]}>(value); const data = fullObj?.data; if (data && data.length > 0) { return { v1_uid: data[0].uid || null, }; } return { v1_uid: null, }; }, }, ], }, }); const res = await readCsvFile(outputFilePath); expect(res).to.deep.equals([ { logId: 'b2a9c355ad074cab9e2a3e640a096ead', url: '/v2/minilogin', v1_uid: '10503182857944698880' }, { logId: '2459b621a1154478b891024f9a0b1155', url: '/v2/minilogin', v1_uid: '10526391617291108352' }, { logId: 'ffad8c575dc049d089b2e61e5c08758f', url: '/v2/minilogin', v1_uid: '10527893824612163585' }, ]); }); it('读取log文件并输出对应的csv文件 (输出json到csv)', async () => { await handleLog({ inputFilePath, outputFilePath, options: { keys: ['logId', 'url', 'v1_json'], specialKeys: [ { key: 'v1', parseFunc: (value: string | null) => ({ v1_json: value && JSON.parse(value) as string, }), }, ], }, }); const res = await readCsvFile(outputFilePath); expect(res).to.deep.equals([ { logId: 'b2a9c355ad074cab9e2a3e640a096ead', v1_json: '{"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}', url: '/v2/minilogin' }, { logId: '2459b621a1154478b891024f9a0b1155', url: '/v2/minilogin', v1_json: '{"data":[{"appellation":null,"uid":"10526391617291108352","nickname":"王津","type":2,"headimgurl":"https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTKUqGVicas2qUqLMSCmIJplZlQnWnVZElZLjGaUKZjX2QfVkI02EZGoaHss1Z3gc64mBJNz71QxNibQ/132","token":"9b898a3591b1a7afddb58c39132ebf24","logtoken":"Pandora3IX-jUfsGtPfp9XErakztwcm2WmDwi2HAkZsEkq0:aXr5lwcp7Vtep0edpw69_tc0JR0=:eyJyZXNvdXJjZSI6Ii92Mi9yZXBvcy9tZW1vcnlfd3htaW5pL2RhdGEiLCJleHBpcmVzIjoxNjM1Njk2NzUyLCJtZXRob2QiOiJQT1NUIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwiY29udGVudE1ENSI6IiIsImhlYWRlcnMiOiIifQ==","roles":["105"],"processid":null,"ontrial":0}],"errcode":0}' }, { logId: 'ffad8c575dc049d089b2e61e5c08758f', url: '/v2/minilogin', v1_json: '{"data":[{"appellation":null,"uid":"10527893824612163585","nickname":"郝军肖","type":2,"headimgurl":"https://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83eo4zeftp6E41wt0CxzRFkj5UpnRD9npbhQrz1L0ed1VUR44WrHW2ZyjmHc9a22hZNkvKKeTFHNZsQ/132","token":"ee00f4878bd5c835957cc8b77612dc88","logtoken":"Pandora3IX-jUfsGtPfp9XErakztwcm2WmDwi2HAkZsEkq0:OBmCM1c59tLB8nXfQE1vcZZ3jIY=:eyJyZXNvdXJjZSI6Ii92Mi9yZXBvcy9tZW1vcnlfd3htaW5pL2RhdGEiLCJleHBpcmVzIjoxNjM1Njk3MTIyLCJtZXRob2QiOiJQT1NUIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwiY29udGVudE1ENSI6IiIsImhlYWRlcnMiOiIifQ==","roles":["105"],"processid":null,"ontrial":0}],"errcode":0}' }, ]); }); });