TypeScript【1】 实战项目:日志管理系统【2】开发指南
日志管理系统是任何大型应用程序的重要组成部分,它能够帮助开发者监控应用程序的性能、诊断问题以及跟踪用户行为。在 TypeScript 中开发日志管理系统,不仅可以利用 TypeScript 的静态类型检查【3】和模块化特性【4】,还能提高代码的可维护性和可扩展性。本文将围绕一个简单的日志管理系统项目,介绍如何使用 TypeScript 进行开发。
项目概述
本项目将实现一个基本的日志管理系统,具备以下功能:
- 日志级别【5】:包括 DEBUG、INFO、WARN、ERROR 和 FATAL。
- 日志格式化【6】:自定义日志输出格式。
- 日志存储【7】:将日志信息存储到文件中。
- 日志轮转【8】:支持日志文件轮转,防止日志文件过大。
技术栈
- TypeScript:用于编写类型安全的 JavaScript 代码。
- Node.js【9】:用于构建服务器和执行脚本。
- Express【10】:一个流行的 Node.js 框架,用于创建 Web 应用程序。
- fs【11】:Node.js 的文件系统模块,用于文件操作。
- path【12】:Node.js 的路径模块,用于路径处理。
项目结构
log-system/
├── src/
│ ├── index.ts
│ ├── logger.ts
│ ├── formatter.ts
│ └── rotator.ts
├── dist/
│ └── index.js
├── package.json
└── tsconfig.json
代码实现
1. logger.ts
typescript
import { Formatter, Rotator } from './formatter';
import { Rotator } from './rotator';
export class Logger {
private level: string;
private formatter: Formatter;
private rotator: Rotator;
constructor(level: string, formatter: Formatter, rotator: Rotator) {
this.level = level;
this.formatter = formatter;
this.rotator = rotator;
}
log(message: string): void {
if (this.level === 'DEBUG' && message.includes('DEBUG')) {
return;
}
const formattedMessage = this.formatter.format(message);
this.rotator.write(formattedMessage);
}
}
2. Formatter【13】.ts
typescript
export class Formatter {
public format(message: string): string {
const timestamp = new Date().toISOString();
return `${timestamp} - ${message}`;
}
}
3. Rotator【14】.ts
typescript
import as fs from 'fs';
import as path from 'path';
export class Rotator {
private logDirectory: string;
private logFileName: string;
private maxFileSize: number;
constructor(logDirectory: string, logFileName: string, maxFileSize: number) {
this.logDirectory = logDirectory;
this.logFileName = logFileName;
this.maxFileSize = maxFileSize;
}
private ensureDirectoryExists(): void {
if (!fs.existsSync(this.logDirectory)) {
fs.mkdirSync(this.logDirectory, { recursive: true });
}
}
private rotateLogFile(): void {
const logFilePath = path.join(this.logDirectory, this.logFileName);
if (fs.existsSync(logFilePath) && fs.statSync(logFilePath).size >= this.maxFileSize) {
const rotatedFilePath = `${logFilePath}.${Date.now()}`;
fs.renameSync(logFilePath, rotatedFilePath);
}
}
public write(message: string): void {
this.ensureDirectoryExists();
this.rotateLogFile();
const logFilePath = path.join(this.logDirectory, this.logFileName);
fs.appendFileSync(logFilePath, message + '');
}
}
4. index.ts
typescript
import as express from 'express';
import { Logger } from './logger';
import { Formatter } from './formatter';
import { Rotator } from './rotator';
const app = express();
const port = 3000;
const formatter = new Formatter();
const rotator = new Rotator('logs', 'app.log', 1024 1024); // 1MB
const logger = new Logger('DEBUG', formatter, rotator);
app.get('/', (req, res) => {
logger.log('INFO: Request received');
res.send('Hello, world!');
});
app.listen(port, () => {
logger.log(`Server running at http://localhost:${port}`);
});
5. package.json【15】
json
{
"name": "log-system",
"version": "1.0.0",
"main": "dist/index.js",
"scripts": {
"build": "tsc",
"start": "node dist/index.js"
},
"devDependencies": {
"@types/node": "^14.0.24",
"express": "^4.17.1",
"typescript": "^4.0.5"
}
}
6. tsconfig.json【16】
json
{
"compilerOptions": {
"target": "ES6",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"include": ["src"],
"exclude": ["node_modules"]
}
总结
本文介绍了如何使用 TypeScript 开发一个简单的日志管理系统。通过定义日志级别、格式化日志信息、存储和轮转日志文件,我们实现了一个功能齐全的日志管理系统。在实际项目中,可以根据需求扩展更多功能,如日志级别控制、异步写入日志【17】等。使用 TypeScript 开发日志管理系统,不仅可以提高代码质量,还能为后续的维护和扩展提供便利。
Comments NOTHING